Alo*_*kin 6 networking ethernet
如何使用以太网预告片发送数据报?如果我使用SocketType.Raw,我将不得不发送整个IP头,我不知道该怎么做.
也许是这样的?
#include <stdio.h> #include <stdlib.h> #include <字符串.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 = 套接字(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; if(发送(s,缓冲区,长度,0) < 0 ) { printf("发送失败\n"); 休息; } 别的 { printf("已发送\n"); } } 关闭; 返回(1); }
这应该会给出一个原始数据包,您可以在wireshark上看到它。如果您想要 ip eader,或者将其设为 udp 或类似的东西,您可以使用此方法并自己构建标头(查看 rfc 很简单,或者只需使用wireshark 查看一堆其他数据包标头) 。请注意,对于 udp,您不必计算校验和 0x0000 是应该传递的有效校验和。
如果您想要的只是一个末尾带有零的 udp 数据包,该数据包有点相同,可能更容易,请告诉我。