c - RAW Socket - Ethertype 和接收算法 - C

标签 c sockets network-programming raw-sockets

我正在使用 C 语言使用原始套接字。 我需要发送和接收原始以太网数据包。 数据包应以 IEEE 802.3 header 开头:

MAC DST [0-5] - MAC SRC [6-11] - ETH 类型[12-13]

使用wireshark捕获数据包我看到以下结构:

MAC DST [0-5] - MAC SRC [6-11] - 长度[12-13] - 拖车[14-58]-....

这是我的代码:

...
sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
memcpy(ptr_eth_header->DstMac, dst_mac, 6);
memcpy(ptr_eth_header->SrcMac, src_mac, 6);
ptr_eth_header->Type = htons(ETH_P_802_3);
memcpy(buffer + ETHHDR_SIZE, data, 60);
...
sockaddr.sll_family = htons(PF_PACKET);
sockaddr.sll_protocol = htons(ETH_P_802_3);
sockaddr.sll_ifindex = ifr.ifr_ifru.ifru_ivalue;
sockaddr.sll_halen = 6;
memcpy(&(sockaddr.sll_addr), dst_mac, 6);
...
bytes = sendto(sraw, buffer, sizeof(buffer), 0, (struct sockaddr *) &(sockaddr), sizeof (struct sockaddr_ll));

这只是wireshark的“问题”吗?有什么想法吗?

我的第二个问题是关于原始消息的接收。 进程卡在recvfrom上。

这是我的代码:

sraw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_802_3));
...
retVal = setsockopt(sraw, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
...
val = 3;
retVal = setsockopt(sraw, SOL_SOCKET, SO_PRIORITY, &val, sizeof (val));
...
val = CLIENT_PACKET_SIZE;
retVal = setsockopt(sraw, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val));

sockaddr.sll_family    = htons(PF_PACKET);
sockaddr.sll_ifindex   = ifr.ifr_ifindex;
sockaddr.sll_protocol  = htons(ETH_P_802_3);

buffer = malloc(CLIENT_PACKET_SIZE * sizeof(char));
while (count < PACKET_COUNT) {
    bytes = recvfrom(sraw, buffer, CLIENT_PACKET_SIZE, 0, (struct sockaddr *)&sockaddr, (socklen_t*)sizeof(sockaddr));
    ...
}

你能帮我吗?

提前致谢!

最佳答案

我找到了关于第一个问题的回复:我使用 Ethertype == 0x0001 而不是 EtherType >= 0x0600

http://www.cavebear.com/archive/cavebear/Ethernet/type.html

第二个问题呢? 我的代码有什么问题吗?

关于c - RAW Socket - Ethertype 和接收算法 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670775/

相关文章:

c - strtol() 错误地返回 0

c - 调用 I/O 或 sleep() 后 UDP sendto() 失败

network-programming - Swift 2 检查端口是否繁忙

objective-c - 结构体中的 __unsafe_unretained

c - recvfrom 卡在某些地址 C

c++ - Socket select() 处理突然断开

windows - 在 Win7 上映射和重新映射具有不同用户的网络驱动器

c++ - Winsock C++ 应用程序无法在某些网络上运行

c++ - 创建全局常量 C 字符串的正确方法

c - C中的TCP套接字编程,其中服务器在cloud9中运行,客户端在本地计算机中运行