2011-08-11 104 views
3

我正在嘗試創建同時使用TCP和UDP的服務器和客戶端。該服務器在局域網設置中運行良好,但在通過廣域網傳輸時,UDP消息未被接收。我相信這是因爲用於發送數據的UDP套接字沒有足夠長的時間保留在NAT表中以返回任何信息。有沒有辦法讓UDP端口在路由器中保持打開狀態(沒有端口轉發),或者使用與已經連接的TCP連接相同的UDP端口?提前致謝。廣域網上的TCP和UDP套接字服務器

回答

2

如果您沒有收到任何流量,可能是被防火牆阻止。在這種情況下,它不是關於轉發,而是關於打開端口。

大多數(如果不是全部的話)NAT /防火牆設備一旦穿透NAT穿孔,將允許雙向UDP流量。也就是說,如果我的筆記本電腦坐在NAT /防火牆後面,將UDP數據包發送到Internet,則我的NAT /防火牆將允許UDP流量返回到始發端口號。我使用UDP工作很多,我的經驗是這是規則,很少有例外。

請記住,雖然UDP數據包不能保證傳遞。

您的客戶端是否支持NAT?請問客戶端發送的任何數據包到達服務器嗎?服務器到客戶端的方向是否存在問題?

如果對UDP和TCP使用相同的端口號,則不會改變這種情況。您不能搭載TCP連接,因爲它是不同的協議。

Network Address Translation (NAT) Behavioral Requirements for Unicast UDP

http://en.wikipedia.org/wiki/UDP_hole_punching

+0

是問題是在服務器到客戶端方向。我相信問題可能出在你說的話。我目前沒有使用最初發送UDP傳輸的端口,因此我無法通過NAT返回。我將嘗試調整客戶端和服務器以適應此情況。感謝你的回答。 – Stephen

+0

我嘗試了你的建議,但仍然不成功。我有服務器檢索WAN IP和用戶在連接時發送的端口,然後客戶端正在監聽所有端口上的來自服務器的通信。你有可能看看一些代碼,看看是否有明顯的錯誤?我很感激。 – Stephen

+0

@Stephen。當然。添加一個鏈接到您的問題。我會這樣做的方式是在服務器端使用recvfrom()和sendto()。您將該套接字綁定到特定的端口號。在客戶端確保使用單個套接字。 –