我应该怎么用C语言在数据链路层传输报文?

我应该怎么用C语言在数据链路层传输报文?
我知道socket,设置ip地址,端口号后直接打应用层数据就行.
但,假如我有1堆,unsigned char 数组的,纯数据链路层报文,我希望它们从我的某个网口流出去,应该使用哪个api啊.

阅读 1.2k
avatarAI BotBETA

在C语言中,如果你想在数据链路层传输报文,你可以使用pcap库。pcap库是一个用于网络流量捕获的库,它提供了低级访问数据链路层的接口,允许你直接操作原始的以太网帧。

以下是一个简单的示例,展示了如何使用pcap库来发送一个原始的以太网帧:

#include <stdio.h>
#include <pcap.h>

int main() {
    char *dev, errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    struct pcap_pkthdr header;
    unsigned char *packet;

    // 获取网络设备
    dev = pcap_lookupdev(errbuf);
    if (dev == NULL) {
        fprintf(stderr, "Device not found: %s\n", errbuf);
        return(2);
    }

    // 打开设备
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
    if (handle == NULL) {
        fprintf(stderr, "Error opening device %s: %s\n", dev, errbuf);
        return(2);
    }

    // 创建要发送的数据包
    packet = (unsigned char *) malloc(1514);  // 1514 是以太网帧的最大长度
    if (packet == NULL) {
        fprintf(stderr, "Error allocating memory for packet\n");
        return(2);
    }
    // 在这里填充你的数据包内容...

    // 设置包头信息
    header.ts = pcap_get_host_uptime();  // 时间戳
    header.caplen = 1514;  // 捕获的包长度
    header.len = 1514;  // 包的实际长度

    // 发送数据包
    if (pcap_inject(handle, packet, 1514) == -1) {
        fprintf(stderr, "Error sending the packet: %s\n", pcap_geterr(handle));
        return(2);
    }

    printf("Packet sent successfully!\n");

    // 释放资源
    free(packet);
    pcap_close(handle);
}

注意:你需要安装libpcap库来编译和运行上述代码。你可以使用包管理器(如aptyumbrew)来安装它。此外,你可能需要以管理员或root权限运行你的程序,以便能够发送原始以太网帧。

1 个回答
新手上路,请多包涵

windows的话用pcap_sendpacket()接口
Linux的话用sendto()接口