2012-06-07 51 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()並檢查源地址來過濾發件人。