如何使用以太网预告片发送数据报?

Alo*_*kin 6 networking ethernet

如何使用以太网预告片发送数据报?如果我使用SocketType.Raw,我将不得不发送整个IP头,我不知道该怎么做.

old*_*mer 2

也许是这样的?

#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 数据包,该数据包有点相同,可能更容易,请告诉我。