2012-06-07 26 views
1

我想做一个C++程序工作,这是由别人写的。我很难理解它。我甚至不能%100确信,我们可以使用poll()与UDP套接字但我重构,采用轮询()的代码从UDP套接字如下:民意调查()与非阻塞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数据包使用命令行到此程序:

echo“123”| nc -u 127.0.0.1 25

它看起来像poll()总是超时并返回0,因此我什么都看不懂。

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

+0

什么是超时设置? –

+0

对不起,1000毫秒。我也试过使它达到10000毫秒,但没有帮助。也许我以错误的方式创建套接字。 –

+0

如果这是unix,请查看netstat和tcpdump是否可以提供更多信息。类似的工具存在于Windows中。 – stefaanv

回答

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知道数据何时可用。

+0

我完全同意,这解决了我的问题,我想如果我从零开始编写我的udpcommunication类会更容易一些:) –

2

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

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

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