1

我正在尝试制作一个由其他人编写的 c++ 程序。我很难理解它。我什至不 %100 确定我们可以将 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” | 数控-u 127.0.0.1 25

看起来 poll() 总是超时并返回 0,因此我无法读取任何内容。

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

4

2 回答 2

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

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

于 2012-06-07T11:45:26.677 回答
2

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

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

如果你想接收数据,你总是得bind()把socket连接到接口,或者所有接口。请注意,您必须从收到的消息中验证源地址。因此,您可能希望通过使用recvfrom()和检查源地址来过滤发件人。

于 2012-06-07T11:47:41.323 回答