尝试接收传入的UDP数据包,空缓冲区

时间:2017-06-30 08:20:43

标签: c++ udp

我正在尝试使用Wireshark读取这些传入的UDP数据包:

Wireshark

我正在使用下一个代码:

    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

我试图断开防火墙,防病毒......我正在以管理员身份运行该程序,但它没有帮助。

为什么缓冲区为空?我清楚地看到有数据包到来,什么可能阻止传入数据到套接字?

3 个答案:

答案 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;
}

我希望能帮助其他类似问题的人。