【问题标题】:Raw Ethernet PF_PACKET issue on localhost本地主机上的原始以太网 PF_PACKET 问题
【发布时间】:2011-11-11 17:44:12
【问题描述】:

我正在使用 c 语言进行原始以太网编程。我有两个文件客户端和服务器,它们在本地主机上运行。我在 socket() 中使用自己的协议号进行通信。

在客户端我有以下代码

    s = socket(PF_PACKET, SOCK_RAW, 61187);  
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  
    struct sockaddr_ll socket_address;

        socket_address.sll_family   = PF_PACKET;
        socket_address.sll_protocol = 61187;
        socket_address.sll_ifindex  = ifindex;
        socket_address.sll_hatype   = ARPHRD_ETHER;
        socket_address.sll_pkttype  = PACKET_BROADCAST;
        socket_address.sll_halen    = ETH_ALEN;
        socket_address.sll_addr[0]  = dest_mac[0];
        socket_address.sll_addr[1]  = dest_mac[1];
        socket_address.sll_addr[2]  = dest_mac[2];
        socket_address.sll_addr[3]  = dest_mac[3];
        socket_address.sll_addr[4]  = dest_mac[4];
        socket_address.sll_addr[5]  = dest_mac[5];
        socket_address.sll_addr[6]  = 0x00;
        socket_address.sll_addr[7]  = 0x00;

然后我发送一些数据如下

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));

在服务器端,我像在客户端一样创建套接字,并且我正在按如下方式进行 recvfrom

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL);

但我在服务器端没有收到任何数据包。谁能告诉我是什么问题?

【问题讨论】:

    标签: raw-ethernet


    【解决方案1】:

    很难从您不完整的示例中看出,但我怀疑您使用的是SOCK_RAW,而您想使用SOCK_DGRAM。在您的SOCK_RAW 中,假设以太网标头是您指定的buffer 的一部分,即您设置的目标地址与数据包的内容无关。使用SOCK_DGRAMbuffer 的内容构成了生成的以太网帧的有效负载,并且标头来自您的地址字段。

    当您在测试时让tcpdump -neX(或与 Wireshark 或 tshark 等效的东西)运行时,这种事情相当容易调试 - 您将确切地看到您正在生成的数据包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-09
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多