在windows上没有从recvfrom收到任何东西

时间:2013-08-30 20:06:14

标签: c++ windows sockets enet

我在使用recvfrom的Windows 8上遇到了一些问题。我有一个绑定到INADDR_ANY(0.0.0.0)的套接字,我想收到一些数据包。

问题是我在Wireshark中看到了这些数据包,但是recvfrom从未告诉我接收的大小大于0.我已经尝试将套接字绑定到127.0.0.1甚至是我的本地IPv4地址,我从来没有得到过任何东西。使用的端口是7321(本地)

我使用ENet库来创建套接字,然后我在recvfrom中使用了该套接字。这是永远不会返回预期数据包的代码。

uint8_t* buffer; // max size needed normally (only used for stun)
buffer = (uint8_t*)(malloc(sizeof(uint8_t)*2048));
memset(buffer, 0, 2048);

socklen_t from_len;
struct sockaddr addr;

from_len = sizeof(addr);
int len = recvfrom(m_host->socket, (char*)buffer, 2048, 0, &addr, &from_len); //m_host is of type ENetHost, the socket in it is a file descriptor like standard sockets

正如我所说,有点奇怪,因为Wireshark向我展示了数据包(如果你想知道的话,它们是STUN响应)。

有人可以帮助我找出可能导致此问题的遗漏内容吗?

2 个答案:

答案 0 :(得分:0)

我可以想到你遇到问题的两个可能原因:

1)您的sendto&可能没有正确的端口recvfrom socket。所以说你要发送数据包到端口6000,但你的recvfrom正在侦听端口6001或其他东西。只需仔细检查两个程序是否使用相同的端口。

2)Windows防火墙。我会以管理员身份运行该程序以确保安全,但也要确保您允许程序通过Windows防火墙使用私人或公共网络进行通信。

答案 1 :(得分:0)

您的addr变量被声明为sockaddr。它需要声明为sockaddr_in(仅适用于IPv4)或SOCKADDR_STORAGE(适用于IPv4和IPv6),然后在将其传递给{{1}时将其强制转换为sockaddr* }}

除此之外,你说recvfrom()没有返回> = 0.那么实际上又回来了什么?如果它返回0,则接收到0长度的数据包(TCP不可能,但UDP可能)。如果它返回-1(又名recvfrom()),则发生错误,因此请使用SOCKET_ERROR找出该错误实际上是什么。