HTTP协议全部包含在TCP数据包的数据部分中。
作为一个赋值,我需要解析HTTP头字段(为了这个问题的目的只允许考虑主机Web地址),只使用字符串解析函数,我不能使用任何现有的库来做到这一点。我试图找到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);
这打印出一个字符串,但主要是小方块,而不是字符串:(
答案 0 :(得分:1)
我认为HTTP标头没有按位分段。在HTTP中,每个标题以“\ r \ n”结尾。所以,你只需要寻找下一个“\ r \ n”然后把它拿出来。
类似的东西:
char httpRe[] ="GET / HTTP/1.1\r\nHost: http://stackoverflow.com/\r\nReferer: https://www.google.com/\r\n\r\n";
char * parser = strtok (httpRe,"\r\n");
while (parser != NULL){
printf ("%s\n",parser);
parser = strtok (NULL, "\r\n");
}
这是你在寻找什么?