我正在研究c中的原始以太网编程。我有两个文件客户端和服务器在localhost上运行。我在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);
但我在服务器端没有收到任何数据包。谁能让我知道问题是什么?
答案 0 :(得分:0)
很难从你不完整的例子中说出来,但我怀疑你在SOCK_RAW
使用了SOCK_DGRAM
。SOCK_RAW
。在buffer
中,以太网标头被假定为您指定的SOCK_DGRAM
的一部分,即您对目标地址的设置与数据包的内容无关。使用buffer
,tcpdump -neX
的内容构成生成的以太网帧的有效负载,标头来自您的地址字段。
当您在测试时运行{{1}}(或与Wireshark或tshark等效的东西)时,这种事情很容易调试 - 您将看到您正在生成的数据包。