当前位置: 首页 > 知识库问答 >
问题:

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

芮承运
2023-12-28

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

共有1个答案

葛高澹
2023-12-28

在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权限运行你的程序,以便能够发送原始以太网帧。

 类似资料:
  • 本文向大家介绍什么是数据链路层?,包括了什么是数据链路层?的使用技巧和注意事项,需要的朋友参考一下 数据链路层是OSI参考模型中的第二层。它表示在计算机传输设置中创建共享的传输介质并频繁传输数据帧。 它为发送方设备的物理层获得自然的项目流。数据的主要流是使用不同的技术生成的,例如电缆,DSL,无线,光纤等。 提供给网络层的服务  数据链路层支持到网络层的明确定义的接口。它可以通过保留多种服务来管理

  • 这是我的代码,在删除的时候总是删不掉尾节点,该如何处理呢?

  • 4.2 ABP应用层 - 数据传输对象 数据传输对象(Data Transfer Objects)用于应用层和展现层的数据传输。 展现层传入数据传输对象(DTO)调用一个应用服务方法,接着应用服务通过领域对象执行一些特定的业务逻辑并且返回DTO给展现层。这样展现层和领域层被完全分离开了。在具有良好分层的应用程序中,展现层不会直接使用领域对象(仓库,实体)。 4.2.1 数据传输对象的作用 为每个应

  • 主要内容:创建 gob 文件,读取 gob 文件为了让某个 数据结构能够在网络上传输或能够保存至文件,它必须被编码然后再解码。当然已经有许多可用的编码方式了,比如  JSON、 XML、Google 的 protocol buffers 等等。而现在又多了一种,由Go语言 encoding/gob 包提供的方式。 Gob 是Go语言自己以二进制形式序列化和反序列化程序数据的格式,可以在 encoding 包中找到。这种格式的数据简称为 Gob(

  • 入门书籍 C语言开发入门教程 视频链接:https://pan.baidu.com/s/1c1Yjr80 密码: idtn 答案链接:http://pan.baidu.com/s/1hsbk2tm 密码:g81c 源码链接:http://pan.baidu.com/s/1jHL7up4 密码:hafs 题库链接:http://pan.baidu.com/s/1c17604g 密码:vqfw 方案链

  • include <stdio.h> include <stdlib.h> include <string.h> define MEDICINE_FILE "medicine.txt" //药品文件名 typedef struct medicine { } medicine; struct med { } med; //与药品操作相关函数 void showMenu(); //打印菜单 void r