Я пытаюсь обработать входящие сетевые пакеты с RAW SOCKET в Windows 10.
Когда я вызываю функцию recvfrom()
, она возвращает -1 значение. WSAGetLastError
- 10022.
Страница Microsoft Docs дает мне следующее описание:
WSAEINVAL: 10022
Недействительный аргумент.
Был указан недопустимый аргумент (например, , указав недопустимый уровень для функции setsockopt). В некоторых случаях это также относится к текущему состоянию сокета - например, вызов accept для сокета, который не прослушивает.
Я пытался использовать setsockopt()
для установки IP_HDRINCL
в 1, но он возвращает ту же ошибку, когда я вызываю recvfrom()
.
Мой исходный код:
#include "stdio.h"
#include "winsock2.h"
#include "ws2tcpip.h"
int main(){
SOCKET s;
char* buff = malloc(256);
int optval = 1;
struct sockaddr_in adr;
int adr_length = sizeof(adr);
int i;
int rcv_len;
WSADATA wsa;
memset(buff, 0, 256);
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0){
printf("Error in WSAStartup: %d\n", WSAGetLastError());
getch();
return 0;
}
s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if(s == SOCKET_ERROR){
printf("Error in socket creation: %d\n", WSAGetLastError());
getch();
return 0;
}
if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)) == -1){
printf("Error in setsockopt(): %d\n", WSAGetLastError());
getch();
closesocket(s);
return 0;
}
while(1){
rcv_len = recvfrom(s, buff, 256, 0, (struct sockaddr*)&adr, &adr_length);
if(rcv_len == -1){
printf("Error in recvfrom(): %d\n", WSAGetLastError());
getch();
break;
}
for(i = 0; i < 256; i ++){
printf("%c", *(buff + i));
}
}
closesocket(s);
return 1;
}
Возврат:
Error in recvfrom(): 10022