我正在尝试在 Windows 10 中使用 RAW SOCKET 处理传入的网络数据包。
当我调用recvfrom()
函数时,它返回 -1 值。WSAGetLastError
是 10022。
Microsoft Docs 页面给了我以下描述:
WSAEINVAL: 10022
参数无效。
提供了一些无效参数(例如,为 setsockopt 函数指定无效级别)。在某些情况下,它还指代套接字的当前状态——例如,在未侦听的套接字上调用接受。
我尝试使用setsockopt()
to 设置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