0

我在使用 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 响应)。

有人可以帮我找出可能导致此问题的缺失吗?

4

2 回答 2

0

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

1)您的 sendto 和 recvfrom 套接字上的端口可能不正确。所以说你正在向端口 6000 发送数据包,但你的 recvfrom 正在侦听端口 6001 或其他东西。只需仔细检查两个程序是否使用相同的端口。

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

于 2013-08-30T20:45:36.417 回答
0

您的addr变量被声明为sockaddr. 它需要声明为sockaddr_in(仅适用于 IPv4)或SOCKADDR_STORAGE(适用于 IPv4 和 IPv6),然后sockaddr*在将其传递给recvfrom().

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

于 2013-08-31T23:55:01.453 回答