【发布时间】:2017-06-30 08:20:43
【问题描述】:
我正在尝试使用 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
我尝试断开防火墙、防病毒软件...我以管理员身份运行程序,但没有帮助。
为什么缓冲区是空的?我清楚地看到有数据包来了,什么可能阻止传入数据到套接字?
【问题讨论】:
-
为什么非阻塞?
-
因为非阻塞我能够读取错误并看到缓冲区是空的,否则程序会在 recvfrom 函数上停止......
-
但是如果它是非阻塞的,调用可能会返回,因为还没有可用的数据。错误是什么——
EAGAIN或EWOULDBLOCK? -
你电脑的IP是多少?通常 .1 将是网关或路由器。
-
IP 192.168.1.1 在 IP 配置中显示为网关。也是接收包裹的那个(请参见上面的wireshark图片)...我尝试了INADDR_ANY,但没有帮助。