HTTP协议都包含在TCP数据包的数据部分中。
作为一项任务,我需要只使用字符串解析函数来解析HTTP头字段(出于这个问题的目的,我们只考虑主机网址),我不能使用任何现有的库来做到这一点。我试图找到HTTP标头的逐位分段,但失败了。我真的不知道现在该怎么办。有什么建议吗?
提前感谢
我已经提取了以太网、IP和TCP报头信息,并解析了十六进制形式的数据,即
数据
48 54 54 50 2F 31 2E 31 20 33 30 34 20 4E 6F 74 HTTP/1.1 304 Not
20 4D 6F 64 69 66 69 65 64 0D 0A 58 2D 43 6F 6E Modified..X-Con
74 65 6E 74 2D 54 79 70 65 2D 4F 70 74 69 6F 6E tent-Type-Option
73 3A 20 6E 6F 73 6E 69 66 66 0D 0A 44 61 74 65 s: nosniff..Date
3A 20 54 68 75 2C 20 30 31 20 44 65 63 20 32 30 : Thu, 01 Dec 20
31 31 20 31 33 3A 31 36 3A 34 30 20 47 4D 54 0D 11 13:16:40 GMT.
0A 53 65 72 76 65 72 3A 20 73 66 66 65 0D 0A 58 .Server: sffe..X
2D 58 53 53 2D 50 72 6F 74 65 63 74 69 6F 6E 3A -XSS-Protection:
20 31 3B 20 6D 6F 64 65 3D 62 6C 6F 63 6B 0D 0A 1; mode=block..
0D 0A
..
MeNa展示了分离HTTP头字段的技巧。但要做到这一点,我需要将数据负载转换为字符串。我尝试了以下方式:
unsigned char * data;
data = (unsigned char *)(packet + ETHERNET_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE);
int length = header_length - (ETHERNET_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE);
char string[length];
for (i = 0; i < length; i++) {
string[i] = (char)data[i];
}
printf("%s ", string);
这会打印出一个字符串,但大部分是小方块,而不是字符:(
我认为HTTP头没有按位分段。在HTTP中,每个标头都以"\r\n"结尾。因此,您只需要查找下一个"\r\n"并将其选中。
类似于:
char httpRe[] ="GET / HTTP/1.1rnHost: http://stackoverflow.com/rnReferer: https://www.google.com/rnrn";
char * parser = strtok (httpRe,"rn");
while (parser != NULL){
printf ("%sn",parser);
parser = strtok (NULL, "rn");
}
这就是你要找的?