c - 显示链路层报头的内容

标签 c tcp network-programming udp debian

是否有任何 debian Linux 程序可以在 C 程序中调用其命令来表达数据包的元数据(例如协议(protocol)、数据包长度、源端口和目标端口)?我会使用 readFrom 和 sockaddr* 结构,但我也希望能够接收 TCP 流量。

有没有办法使用 tcpdump 创建包含此信息的字符串?

另外,这个问题的表述或者内容有没有概念上的错误?

最佳答案

您可以使用多种替代方案: Jewel Thief 提到的 1-PCAP。示例代码:

int datalink;
char *device;
pcap_t *pd;
int snaplen = MAX_MSG_LEN;
#define CMD "tcp and dst port %d"

void open_pcap()
{
    uint32_t localnet;
    uint32_t netmask;
    char cmd[300];
    char errbuf[PCAP_ERRBUF_SIZE];
    struct bpf_program fcode;

    device = pcap_lookupdev(errbuf);
    if (device == NULL)
    {
        printf("ERROR-1: open_pcap:%s\n", errbuf);
        exit(3);
    }

    printf("DEVICE: %s\n", device);

    pd = pcap_open_live(device, snaplen, 0, 500, errbuf);

    if (pd == NULL)
    {
        printf("ERROR-2-%s\n", errbuf);
        exit(4);
    }

    if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)
    {
        printf("ERROR-3-%s\n", errbuf);
        exit(5);
    }

    snprintf(cmd, sizeof(cmd), CMD, 80);

    if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)
    {
        printf("ERROR-4-%s\n", pcap_geterr(pd));
        exit(6);
    }

    if (pcap_setfilter(pd, &fcode) < 0)
    {
        printf("ERROR-5-%s\n", pcap_geterr(pd));
        exit(7);
    }

    datalink = pcap_datalink(pd);

    if (datalink < 0)
    {
        printf("ERROR-6-%s\n", pcap_geterr(pd));
        exit(8);
    }

    printf("DATALINK: %d\n", datalink);
}

int getNext(char *msg)
{
    struct pcap_pkthdr hdr;
    char *ptr = NULL;

    while(ptr == NULL)
    {
        ptr = (char *)pcap_next(pd, &hdr);
    }

    printf("LEN: %d - CAPLEN: %d\n", hdr.len, hdr.caplen);
    memcpy(msg, ptr, hdr.caplen);

    return hdr.caplen;
}

2-您可以使用数据包套接字

#include <sys/socket.h>
#include <linux/if_packet.h>
#include <net/ethernet.h> /* the L2 protocols */

packet_socket = socket(AF_PACKET, int socket_type, int protocol);

3-如果您不想编码,您可以使用 shell 调用命令 tcpdump,这足以满足您的需求(查看 man 以获取参数)

关于c - 显示链路层报头的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818004/

相关文章:

c - 正确关闭套接字 - 读取时另一侧被卡住

c - 阻止 Linux 将 usb 条形码扫描器字符发送到控制台

c - 使用 2 个字符随机化 2D 数组?

c++ - 哪种流适合通过 UDP 进行序列化?

c - 为什么在很多地方 *p() 被称为返回指针的函数而不是返回地址的函数?

linux - 在 linux TCP 系统调用的上下文中,什么是 "incomplete connection request"?

VB.net TCPListner 窗口服务

python - 监控一个tcp端口

c++ - 如何调用复合模块的参数?

java - 无法为我的 Java 应用程序选择正确的网络解决方案