6

如何发送带有以太网尾部的数据报?如果我使用 SocketType.Raw,我将不得不发送整个 IP 标头,我不知道该怎么做。

4

2 回答 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 回答