相关函数:
//该函数返回str1中第一个匹配字符串str2的字符数,未找到返回null。 char *strpbrk(const char *str1, const char *str2)
/* 若参数s1 和s2 字符串相同则返回0。s1 长度大于s2 长度则返回大于0 的值,s1 长度若小于s2 长度则返回小于0 的值。 */ int strcasecmp (const char *s1, const char *s2);
/* 返回字符串 str 开头连续包含字符串 accept 内的字符数目。所以,如果 str 所包含的字符都属于 accept,那么返回 str 的长度;如果 str 的第一个字符不属于 accept,那么返回 0。 */ size_t strspn(const char *str, const char * accept);
//该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。 char *strchr(const char *str, int c)
1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <arpa/inet.h> 4 #include <assert.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #include <errno.h> 9 #include <string.h> 10 #include <fcntl.h> 11 12 #define BUFFER_SIZE 4096 13 enum CHECK_STATE { CHECK_STATE_REQUESTLINE = 0, CHECK_STATE_HEADER, CHECK_STATE_CONTENT }; 14 enum LINE_STATUS { LINE_OK = 0, LINE_BAD, LINE_OPEN }; 15 enum HTTP_CODE { NO_REQUEST, GET_REQUEST, BAD_REQUEST, FORBIDDEN_REQUEST, INTERNAL_ERROR, CLOSED_CONNECTION }; 16 static const char* szret[] = { "I get a correct result ", "Something wrong " }; 17 18 LINE_STATUS parse_line( char* buffer, int& checked_index, int& read_index ) 19 { 20 char temp; 21 for ( ; checked_index < read_index; ++checked_index ) 22 { 23 temp = buffer[ checked_index ]; 24 if ( temp == ' ' ) 25 { 26 if ( ( checked_index + 1 ) == read_index ) 27 { 28 return LINE_OPEN; 29 } 30 else if ( buffer[ checked_index + 1 ] == ' ' ) 31 { 32 buffer[ checked_index++ ] = '