簡體   English   中英

在 windows 中發送原始 arp 回復數據包

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM