先看main函数执行的功能很简单,前半段是建立TCP连接的常规操作,每次读取4096字节的数据到缓存区,解析这4096个数据,根据解析状态返回相应结果。
int main(int argc, char** argv)
{
if (argc <= 2) {
printf("usage: %s ip_address port_number\n", basename(argv[0]));
return 1;
}
const char* ip = argv[1]; // ip
int port = atoi(argv[2]); // 端口
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
inet_pton(AF_INET, ip, &address.sin_addr);
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
assert(listenfd >= 0);
int reuse = 1;
int ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
ret = bind(listenfd, (struct sockaddr*) & address, sizeof(address));
assert(ret != -1);
ret = listen(listenfd, 5);
assert(ret != -1);
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
int fd = accept(listenfd, (struct sockaddr*) & client_address, &client_addrlength);
if (fd < 0) printf("errno is: %d\n", errno);
else {
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
int data_read = 0; // 已经接收的字符数
int read_index = 0; // 已经读取了多少字节
int checked_index = 0; // 已经分析完了多少字节
int start_line = 0; // 行在buffer中的起始位置
CHECK_STATE checkstate = CHECK_STATE_REQUESTLINE; // 正在分析请求行
while (1) {
// 读取BUFFER_SIZE大小的数据到缓