如何检测u_char类型缓冲区中的“\ r \ n”?

时间:2013-06-25 04:16:36

标签: c http

我正在尝试使用C从数据包嗅探构建HTTP内容。现在,我能够将所有数据包保存在文件中,但我想摆脱第一个数据包中的标头。标头也被保存,因为它们是TCP有效负载的一部分。在HTTP响应中双重“CR,LF”或"\r\n\r\n"之后,标题后的实际正文开始。

如何检测"\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;

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]);
}}

但它在编译期间在chara data []和char rdata []行中出错。错误表示初始化程序无效。

1 个答案:

答案 0 :(得分:6)

u_charnot a standard datatype。你应该查看定义它的标题,但肯定只是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;
}