我目前正在学习如何使用Windows原始套接字。
我创建了一个原始ARP回复帧(包括所有标头(以太网+ARP标头)),但当我使用sendto函数发送时,它失败并返回错误代码10047的SOCKET_ERROR。
我用于创建套接字的参数如下:
(顺便说一句,“2”等于IP_HDRINCL,由于某种原因,Visual Studio无法识别它...)
我尝试按以下方式发送数据包:
我创建了一个原始ARP回复帧(包括所有标头(以太网+ARP标头)),但当我使用sendto函数发送时,它失败并返回错误代码10047的SOCKET_ERROR。
我用于创建套接字的参数如下:
socket s = socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
同时,我将套接字选项更改为以下内容:
int on=1;
setsockopt(s,IPPROTO_IP, 2,(char*)&on,sizeof(on));
(顺便说一句,“2”等于IP_HDRINCL,由于某种原因,Visual Studio无法识别它...)
我尝试按以下方式发送数据包:
socketaddr sa = { 0 };
int SentBytesCount = sendto(s, (char*)&arp_raw_msg,sizeof(Arp_Frame),0,&sa,sizeof(sa));
Arp_Frame是一个结构体,包括以太网头+ARP头+18字节的填充。
调用后,我发现SentBytesCount等于SOCKET_ERROR(-1),并且没有数据包被发送。
谢谢您的帮助!
AF_PACKET
和sockaddr_ll
来达到以太网层。WinSock不支持这些。我认为你根本无法使用WinSock发送原始以太网数据包,因为WinSock对SOCK_RAW
的实现似乎无法低于IP层。在WinSock上的原始套接字比其他平台上的更加受限制。如果不能更换操作系统,则必须使用第三方数据包库,例如WinPCap。 - Remy Lebeau