我正在尝试使用C从数据包嗅探构建HTTP内容.现在,我能够将所有数据包保存在文件中,但我想摆脱第一个数据包中的标头.标头也被保存,因为它们是TCP有效负载的一部分.标题在双重"CR,LF"之后或"\r\n\r\n"HTTP响应中启动后的实际正文.
我如何检测,"\r\n"以便我只能保存它后面的缓冲区的一部分?缓冲区是u_char类型.我无法弄清楚命令.我看了谷歌和其他地方,但我主要找到C#命令 - 在C中没有.
我正在使用这个功能
void strtofcntnt(const u_char * Biffer, int size)
{
unsigned short iphdrlen;
struct iphdr *iph = (struct iphdr *)(Buffer + sizeof(struct ethhdr));
iphdrlen = iph->ihl*4;
Run Code Online (Sandbox Code Playgroud)
struct tcphdr *tcph = (struct tcphdr*)(Buffer + iphdrlen + sizeof(struct ethhdr));
char data[] = *(Buffer);
char rdata[] = strstr(data, "\r\n\r\n");
unsigned int i;
for (i=0;i<=sizeof(data);i++)
{
fprintf(logfile,"%c",(unsigned int)data[i]);
}}
Run Code Online (Sandbox Code Playgroud)
但它在编译期间在chara data []和char rdata []行中出错.错误表示初始化程序无效.
u_char是不是一个标准的数据类型.你应该在标题中查找它,但肯定它只是一个unsigned char.
由于数据可以嵌入空字节,strstr因此无法找到"\r\n\r\n".你必须写一些搜索方法:
const char* memsearch(const char* haystack, size_t haystack_len,
const char* needle, size_t needle_len)
{
const char* p;
for (p = haystack; p < (haystack + haystack_len - needle_len); p++) {
if (memcmp(p, needle, needle_len) == 0)
return p;
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |