gpt4 book ai didi

c - 用 C (Linux) 将原始数据包注入(inject)网络

转载 作者:行者123 更新时间:2023-11-30 17:49:16 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数接受字节流(包括以太网 header ,可能还包括封装在以太网数据包中的上层协议(protocol))并将其发送到网络上的特定接口(interface)。

这是我的代码摘要:

// create socket
int s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (s < 0) {
// error handling
}

// set up to just receive/send packets on one interface (stored in the variable iface_name e.g. eth0)
struct ifreq ifr;
bzero(&ifr, sizeof(struct ifreq));
strncpy(ifr.ifr_ifrn.ifrn_name, iface_name, IFNAMSIZ);
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
// error handling
}

// set up socaddr for write
struct sockaddr sa;
sa.sa_family = PF_PACKET;
sa.sa_data = htons(ETH_P_ALL);

// write to wire
// buf has type char* and len has type int
// buf contains ethernet header, followed by payload (e.g. ARP packet or IP packet)
if ( sendto(s, buf, len, 0, &sa, sizeof(struct sockaddr) ) < 0 ) {
perror("sendto");
// more error handling
}

我收到错误

sendto: Invalid argument

如何修复此错误?

我最初的猜测是,这在某种程度上是由 sa 参数引起的,因为所有其他参数都相当标准,并且没有太多问题。我可以将其替换为 sockaddr_ll 类型的参数,如 this example 中所示。 ,但这意味着从 buf 中提取 header 信息,这似乎有点毫无意义,因为它已经在那里,准备好了。一定会有更好的办法?封装、解封装、重新封装、发送似乎有太多不必要的步骤。我正在为一些预先存在的代码编写底层接口(interface),因此我无法调整输入以使其不包含数据链路层 header 。

最佳答案

它是你的图书馆:

http://linux.die.net/man/7/raw请参阅 header 定义看看他是如何制作 socket 的他没有使用 htons,而是:IPPROTO_RAW 位于

  #include <netinet/in.h>

关于c - 用 C (Linux) 将原始数据包注入(inject)网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17970874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com