【发布时间】:2012-06-07 19:54:18
【问题描述】:
我正在尝试制作一个由其他人编写的 c++ 程序。我很难理解它。我什至不确定我们是否可以将 poll() 与 UDP 套接字一起使用,但我正在重构的代码是使用 poll() 从 udp 套接字读取如下:
fd.fd = m_bsocket;
fd.events = POLLIN;
iPollResult = poll(&fd, 1, iTimeout);
if(iPollResult > 0)
{
int iReceivedByteCount = recv(m_bsocket, p_pBuffer, p_iBufferSize, 0);
if(iReceivedByteCount > 0)
{
*p_pReadSize = iReceivedByteCount;
}
else
{
eReturnValue = UDP_READ_ERROR;
}
}
return eReturnValue;
我尝试使用命令行向该程序发送 udp 数据包:
回显“123”| nc -u 127.0.0.1 25
看起来 poll() 总是超时并返回 0,因此我无法读取任何内容。
我还写了一个小c#程序,发送udp数据报,但是收不到消息。我想知道我做错了什么......
【问题讨论】:
-
抱歉没有包括,1000 毫秒。我也尝试将其设置为 10000 毫秒,但没有帮助。也许我以错误的方式创建套接字。
-
如果是unix,看看netstat和tcpdump能否给出更多信息。 Windows 也有类似的工具。
-
当我运行 netstat -lu 时,我没有看到任何在我的端口 25 上侦听的内容,是因为我正在使用 poll() 还是其他可能被搞砸了?
-
套接字是连接的(即使用
accept或connect创建的)还是未连接的?虽然这无关紧要,因为 UDP 套接字应该是“可轮询的”,无论它是连接还是未连接。 -
您不需要
connect()(UDP 是无连接的)您需要bind()到您正在侦听的接口的IP 的套接字或0.0.0.0对于所有接口。发送到目的地时,使用sendto()