有没有办法从C语言中接收的数据包中读取URL?

有没有办法从C语言中接收的数据包中读取URL?,c,http,url,networking,tcp,C,Http,Url,Networking,Tcp,我一直在使用lpcap,并成功地接收到进出我的计算机的数据包 但是,我只能得到每个数据包的主机名和源IP地址,而不一定是与它们相关联的URL 例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com 我一直在接收TCP数据包,并从IP头信息中获得了先前的信息 我之前读过,HTTP头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP头,或者是否有使用lpca

我一直在使用lpcap,并成功地接收到进出我的计算机的数据包

但是,我只能得到每个数据包的主机名和源IP地址,而不一定是与它们相关联的URL

例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com

我一直在接收TCP数据包,并从IP头信息中获得了先前的信息

我之前读过,HTTP头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP头,或者是否有使用lpcap的方法

底线是,有没有一种方法可以从我的数据包的起始位置读取url

包括一些代码供参考。 我的处理方法:

void processPacket(u_char *args, const struct pcap_pkthdr* header, const u_char *packet) {
    const struct ip_hdr *ip;
    const struct eth_hdr * eth;
    char* src;
    char* dst;
    char src_host[NI_MAXHOST];
    char dst_host[NI_MAXHOST];
    eth = (struct eth_hdr*)(packet);
    ip = (struct ip_hdr*)(packet+SIZE_ETHERNET);
    src = inet_ntoa(ip->ip_src);
    dst = inet_ntoa(ip->ip_dst);
    memset(src_host, 0, NI_MAXHOST);
    memset(dst_host, 0, NI_MAXHOST);

    getDNS(inet_ntoa(ip->ip_src), src_host);
    getDNS(inet_ntoa(ip->ip_dst), dst_host);
    printf("Eth Dest Host: %s\n", eth->eth_destHost);
    printf("Eth Send Host: %s\n", eth->eth_sendHost);
    printf("Source: IP: %s Host: %s\n", inet_ntoa(ip->ip_src), src_host);
    printf("Destination: IP: %s Host: %s\n", inet_ntoa(ip->ip_dst), dst_host);
}
这是我的收集方法

int collect(pcap_t *handler, char* device, char* conditions) {
    struct pcap_pkthdr pkthdr;
    const unsigned char *packet = NULL;
    char* args = (char*)malloc(32);
    int count = 0;
    char errbuf[PCAP_ERRBUF_SIZE];
    bpf_u_int32 netaddr = 0, mask=0;

    //prepping conditions for collection
    memset(errbuf, 0, PCAP_ERRBUF_SIZE);

    if (device == NULL) {
        printf("Error device not found exiting...");
        return -1;
    }

    //stores network address and mask in netaddr and mask, exits if not found
    if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
            printf("Error net address and mask not found exiting...");
            return -1;
    }

    //opens the session allowing all net traffic to be read, exits if it cannot
    handler = pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512, errbuf);
    if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
            printf("Error opening session exiting...");
        return -1;
    }
    if (conditions != NULL) {
        printf("Implementing Filter...\n");
        if (startFilter(conditions, handler, mask) == -1) {
                printf("Error initializing Filter");
                return -1;
        }
    }

    //executing collection
    printf("Starting loop...\n");
    pcap_loop(handler, -1, processPacket, (u_char*)&count);
    return -1;
}
例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com

你所要求的是不可能的。没有任何内容表明IP地址的反向DNS查找必须与最初在正向DNS查找中使用的域名相匹配,才能获得有问题的IP地址:

这是因为出于负载平衡和地理分布的原因,
google.com
可能会解析为大量的IP地址。因此,从域名到IP地址之间存在一对多的关系

但是,这些IP地址(绑定到特定的Web服务器或负载平衡器)中的每一个在internet上仍然具有唯一的标识,这可以通过反向查找得到证明。因此,从IP地址到反向DNS查找(通常)存在一对一的关系

看看这个例子:

C:\Users\Jonathon>nslookup
默认服务器:192.168.1.1
地址:192.168.1.1
>谷歌网站
服务器:192.168.1.1
地址:192.168.1.1
非权威性回答:
名称:google.com
地址:2607:f8b0:4009:800::1007
173.194.46.68
173.194.46.69
173.194.46.70
173.194.46.71
173.194.46.72
173.194.46.73
173.194.46.78
173.194.46.64
173.194.46.65
173.194.46.66
173.194.46.67
> 173.194.46.68
服务器:192.168.1.1
地址:192.168.1.1
名称:ord08s11-in-f4.1e100.net
地址:173.194.46.68
另一个例子是共享托管服务器,其中使用一台物理机器(从而使用公共IP地址)为具有不同域名的许多网站提供服务

例如:

正向查找多个域:
示例-01.com--\
示例-02.com----->127.64.23.17
示例-03.com--/
反向查找:
127.64.23.17-->23-17.www.some-isp.example.com

您了解TCP和HTTP之间的关系吗?您是否能够读取HTTP标头中“主机”属性的值?我无法读取HTTP标头中的主机属性,我将如何执行此操作?您没有回答我的第一个问题。如果答案是“否”,那么你需要做一些阅读。我确实理解TCP和HTTP之间的基本区别,我只是对如何读取HTTP头有点困惑。有没有办法重建TCP流以创建某种HTTP头信息?我意识到我只是在试着完成我的过程,我真的在问是否有办法找到与我正在收集的数据包相关联的URL。感谢您的回复和帮助。