我在使用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响应)。
有人可以帮助我找出可能导致此问题的遗漏内容吗?
答案 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
找出该错误实际上是什么。