[英]Send Raw arp reply packet in windows
我目前正在學習如何使用 windows 原始 sockets。
我創建了一個原始 arp 回復幀(包括所有標頭(以太網+arp 標頭)),當我使用 sendto function 發送它時,它失敗並返回 SOCKET_ERROR,錯誤代碼為 10047。
我用來創建socket的參數如下:
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),並且沒有發送數據包。
謝謝您的幫助!
Winsock 錯誤 10047 是WSAEAFNOSUPPORT
:
協議族不支持地址族。
使用了與請求的協議不兼容的地址。 所有 sockets 均使用關聯的地址族(即 Internet 協議的 AF_INET)和通用協議類型(即 SOCK_STREAM)創建。 如果在
socket
調用中顯式請求了不正確的協議,或者如果套接字使用了錯誤系列的地址(例如在sendto
中),則會返回此錯誤。
您創建了一個AF_INET
(IPv4) 套接字,但您沒有向sendto()
傳遞包含 IPv4 地址和端口的有效sockaddr_in
,因此出現錯誤。 您正在向它傳遞一個空的socketaddr
(那是什么?)。
與套接字一起使用的任何sockaddr_...
結構都必須與套接字的地址族所期望的相匹配,正如socket()
調用所設置的那樣(在您的情況下, AF_INET
,它使用sockaddr_in
地址)。
sockaddr_in sa;
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr("destination IP address");
sa.sin_port = htons(Destination port number);
int SentBytesCount = sendto(s, (char*)&arp_raw_msg, sizeof(Arp_Frame), 0, (struct sockaddr*)&sa, sizeof(sa));
至於IP_HDRINCL
,它在ws2tcpip.h
中定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.