I'm trying to handle incoming network packets with RAW SOCKET in Windows 10.
When I call recvfrom()
function it returns -1 value. WSAGetLastError
is 10022.
Microsoft Docs page give me the following description:
WSAEINVAL: 10022
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.
I have tried to use setsockopt()
to set IP_HDRINCL
to 1, but it returns the same error when I call recvfrom()
.
My source code:
#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;
}
Return:
Error in recvfrom(): 10022
addr
andaddrLen
to NULL? – Roberto Caboni