我正在尝试使用Wireshark读取这些传入的UDP数据包:
我正在使用下一个代码:
struct sockaddr_in si_other;
struct sockaddr_in remaddr; /* remote address */
int slen = sizeof(remaddr);
int s, recvlen;
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;
//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//create socket
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) //IPPROTO_UDP
{
printf("socket() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
//setup address structure
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
if (bind(s, (struct sockaddr *)&si_other, sizeof(si_other)) < 0) {
perror("bind failed");
return 0;
}
u_long nMode = 1; // 1: NON-BLOCKING
if (ioctlsocket(s, FIONBIO, &nMode) == SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return 0;
}
//start communication
while (1)
{
printf("waiting on port %d\n", PORT);
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
{
printf("recvfrom() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Done");
puts(buf);
}
我绑定的地址是192.168.1.1,端口是1234。
WSAGetLastError的给定输出是一个空缓冲区错误:10035
我试图断开防火墙,防病毒......我正在以管理员身份运行该程序,但它没有帮助。
为什么缓冲区为空?我清楚地看到有数据包到来,什么可能阻止传入数据到套接字?
答案 0 :(得分:0)
WSAGetLastError()
给定的输出是一个空缓冲区错误:10035
不,不是。 10035是WSAEWOULDBLOCK
。这意味着操作将在阻塞模式下阻塞,即在您调用recvfrom()
时没有数据存在。
我绑定的地址是192.168.1.1
IP 192.168.1.1显示为网关
这两个陈述是相互矛盾的。如果它是一个网关,它是一个外部IP地址,如果它是一个外部IP地址,你就无法绑定它。
我尝试了INADDR_ANY并且它没有帮助
不足为奇。如果您不是192.168.1.1,则无法接收其消息。不清楚为什么你会不这么认为。
答案 1 :(得分:0)
由于@EJP提到10035是WSAEWOULDBLOCK
,即没有数据准备就绪。原因是接收器是192.168.1.1,这是您的网关的IP地址,因此不是本地IP。在这种情况下,您无法以正常方式接收数据包。
您可以使用UDP嗅探器(例如,使用libpcap)接收这些数据包,即使它们不适合您。
答案 2 :(得分:-1)
感谢您的回答,他们指出了正确的方向。我现在已经有了程序,我能够收到传入的UDP数据包。
解决方案是“嗅探”这些UDP数据包,winsock允许在绑定后使用WSAIoctl函数,在我的情况下将下一个代码添加到上面的程序中(在绑定函数之后):
if (WSAIoctl(s, SIO_RCVALL, &j, sizeof(j), 0, 0, (LPDWORD)&si_other, 0, 0) == SOCKET_ERROR)
{
printf("WSAIoctl() failed.\n");
return 1;
}
我希望能帮助其他类似问题的人。