如何发送带有以太网尾部的数据报?如果我使用 SocketType.Raw,我将不得不发送整个 IP 标头,我不知道该怎么做。
问问题
1793 次
2 回答
2
该预告片用于将以太网帧填充到它们的最小长度(46 字节的有效负载)。所以发送一个小的 UDP 数据包 - 小于 18 字节(因为 IP + UDP 通常是 28 字节)
于 2010-08-10T23:36:13.487 回答
2
大概是这样的?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <linux/if_arp.h> #include <sys/ioctl.h> 整数; 无符号字符缓冲区[513]; 结构 sockaddr_ll 套接字地址; int main ( 无效 ) { 无符号字符序列; 无符号整数 ra; 整数长度; 结构 ifreq ifr; s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 如果 (s == -1) { printf("创建套接字时出错\n"); 返回(1); } memset(&ifr,0, sizeof(struct ifreq)); strncpy(ifr.ifr_name,"eth0",IFNAMSIZ); if(ioctl(s, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl SIOCGIFINDEX"); 退出(1); } printf("索引 %d\n",ifr.ifr_ifindex); printf("已创建套接字\n"); memset(&socket_address,0,sizeof(socket_address)); socket_address.sll_family = PF_PACKET; socket_address.sll_protocol = htons(ETH_P_ALL); socket_address.sll_ifindex = ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)(&socket_address), sizeof(socket_address)) < 0) { perror("绑定错误"); 退出(1); } printf("绑定\n"); 长度=27; memset(缓冲区,0,sizeof(缓冲区)); //目的地 缓冲区[0]=0xFF; 缓冲区[1]=0xFF; 缓冲区[2]=0xFF; 缓冲区[3]=0xFF; 缓冲区[4]=0xFF; 缓冲区[5]=0xFF; //来源 缓冲区[6]=0x00; 缓冲区[7]=0x19; 缓冲区[8]=0xd1; 缓冲区[9]=0x02; 缓冲区[10]=0xdc; 缓冲区[11]=0xb3; //长度 缓冲区[12]=((长度-14)>>8)&0xFF; 缓冲区[13]=((长度-14)>>0)&0xFF; //有效载荷 缓冲区[14]=0x12; 缓冲区[15]=0x34; 对于(ra=0;ra<20;ra++) { 缓冲区[16]=ra; 如果(发送(s,缓冲区,长度,0)<0) { printf("发送失败\n"); 休息; } 别的 { printf("发送\n"); } } 关闭; 返回(1); }
那应该给出一个你可以在wireshark上看到的原始数据包。如果您想拥有 ip eader,或者使其成为 udp 或类似的东西,您可以使用此方法并自己构建标头(查看 rfcs 很简单,或者只是使用 wireshark 查看一堆其他数据包标头) . 请注意,对于 udp,您不必计算校验和 0x0000 是应该通过的有效校验和。
如果您想要的只是一个末尾带有零的 udp 数据包,这有点相同,可能更容易,请告诉我。
于 2010-08-12T22:21:56.273 回答