poll()with non blocking udp socket

时间:2012-06-07 10:47:41

标签: c++ sockets udp

我正在尝试制作一个由其他人编写的c ++程序。我很难理解它。我甚至不确定我们可以使用带有UDP套接字的poll()但是我正在重构的代码,使用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,因此我无法读取任何内容。

我还写了一个发送udp数据报的小型c#程序,但我收不到这条消息。我想知道我做错了什么......

2 个答案:

答案 0 :(得分:2)

虽然UDP套接字可用于连接到另一台主机,但它们主要用于“无连接”。阅读你的问题和评论你没有连接套接字是没有意义的。相反,它应该是WouterH在评论中建议的无连接。

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in sin = { 0 };
sin.sin_family = AF_INET;
sin.sin_port = htons(25);
sin.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *) &sin, sizeof(sin));

// Make socket non-blocking if needed

使用上面的代码,每当有人将UDP数据包发送到主机任何地址的端口25时,套接字就会拦截它。使用例如pollselect了解数据何时可用。

答案 1 :(得分:2)

您无需呼叫connect(),因为UDP是无连接的。您需要bind()套接字到您正在侦听的接口的IP或0.0.0.0(INADDR_ANY)所有接口。发送到目的地时,请使用sendto()

为了完整性:如果在UDP套接字上调用connect(),则只需为send()函数设置默认目标(然后您可以使用send而不是sendto)。

如果要接收数据,则始终必须bind()接口的套接字或所有接口。请注意,您必须从收到的消息中验证源地址。因此,您可能希望使用recvfrom()并检查源地址来过滤发件人。