正文 - 直接搞起
很久以前写过一个简易的http服务器, 后面和一个朋友交流, 反思后发现问题不少.在这里简单搞一下.
让其更加简单去表现httpd本质, 弱化协议业务. 方便当httpd入手学习的demo. ok, 那直接代码走起 ~
Makefile - 编译部分
all:httpd.exe client.exe httpd.exe : httpd.c gcc -g -Wno-unused-result -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wall -O2 -o $@ $^ -lpthread client.exe : client.c gcc -g -Wall -o $@ $^ clean: rm -rf *.exe
client.c - 简单的测试客户端
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <arpa/inet.h> #define CERR(fmt, ...) fprintf(stderr, "[%s:%s:%d][errno %d:%s]" fmt " ", __FILE__, __func__, __LINE__, errno, strerror(errno), ##__VA_ARGS__) #define CERR_EXIT(fmt,...) CERR(fmt, ##__VA_ARGS__), exit(EXIT_FAILURE) #define CERR_IF(code) if((code) < 0) CERR_EXIT(#code) //待拼接的字符串 #define _STR_HTTPBEG "GET /index.html HTTP/1.0 User-Agent: Happy is good. Host: 127.0.0.1:" #define _STR_HTTPEND " Connection: close " // 简单请求一下 int main(int argc, char * argv[]) { int sfd; int len, port; char buf[BUFSIZ]; struct sockaddr_in saddr = { AF_INET }; // argc 默认为1 第一个参数 就是 执行程序串 if((argc != 2) || (port = atoi(argv[1])) <= 0 ) CERR_EXIT("Usage: %s [port]", argv[0]); // 开始了,就这样了 CERR_IF(sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)); saddr.sin_port = htons(port); CERR_IF(connect(sfd, (struct sockaddr *)&saddr, sizeof saddr)); //开始发送请求 strcpy(buf, _STR_HTTPBEG); strcat(buf, argv[1]); strcat(buf, _STR_HTTPEND); write(sfd, buf, strlen(buf)); //读取所哟内容 while((len = read(sfd, buf, sizeof buf - 1)) > 0) { buf[len] = '