2015-01-15 28 views
2

我在Windows 7中使用Winsock類CAsyncSocket創建一個UDP聊天程序。它只是打開一個未連接的UDP套接字,並允許將文本字符串發送到另一臺運行該聊天程序的計算機。我發現當我的聊天程序運行在兩臺帶有以太網NIC的交叉網線連接的計算機上時(無其他網絡流量),無論哪臺計算機首先嚐試傳輸,直到從另一臺計算機發送第一個數據報之後,它都不成功。在以下屏幕捕獲計算機#1嘗試發送三次「​​測試」,而計算機#2未收到它。然後計算機#2發送由#1接收的「hello」。然後計算機#1再次發送「測試」並且這次它被接收。儘管從#1開始的「測試」的三次初始傳輸看起來沒有經過,但他們顯然做了一些事情,如果在#1的「測試」消息之前發送來自#2的「hello」,則「hello」消息是丟失了。UDP未連接套接字發送失敗,直到它收到第一個數據報

計算機#1

Station 1

計算機#2

Station 2

後每臺計算機已經成功地發送數據報則所有隨後的數據報沒有發送和接收問題。如果我只關閉並重新打開一個端口[重置本地端口],那麼每臺計算機仍可以成功發送和接收數據。如果我[重置本地端口]兩臺電腦,然後在大多數情況下,第一個發送經驗相同的問題,但並不總是。有時甚至在[重置本地端口]發送和接收仍然工作。 創建未連接套接字的調用是

Create(i_LocalPort, SOCK_DGRAM, FD_READ, m_LocalSockAddrIn.AddrStr()); 

然後

CAsyncSocket::SendTo() 

發送數據報。尋找一些關於這裏發生了什麼的提示。

更新信息:使用Wireshark查看丟失的數據包似乎是使用適當的源地址和目標地址發送的,但目的地沒有收到它們。 Datagram Capture

+0

您的網卡是否配置爲使用DHCP?如果是這樣,交叉電纜將從網絡中消除所有可能的DHCP服務器,因此它們都沒有IP地址,這可以解釋它。測試不是一個現實的情況。 – EJP

+0

我訴諸交叉和靜態IP地址,試圖消除其他變量,如網絡交換機不通過數據報或其他網絡通信導致UDP故障。它在我的本地局域網上,我首先看到了這個問題。 – JonN

+0

我仍在嘗試解決此問題。我已經與其他UDP聊天程序進行了測試,並發現無法使用這些程序接收數據報。我現在懷疑網絡環境。我嘗試使用 http://udp-win-chat.software.informer.com/download/ 並有一個情況,發送和接收 與交叉電纜上的隔離網絡和運行WireShark我看到發送的數據報從雙方但沒有udpchat程序顯示爲收到任何東西。 – JonN

回答

1

該問題是由Windows防火牆引起的。我關掉了兩臺電腦上的防火牆,問題就消失了。通常情況下,Windows會在阻止訪問時彈出對話框,但其中一臺計算機已禁用「Windows防火牆阻止新程序時通知我」因此沒有對話消息。它只是默默地丟棄了數據報。我期望它發送消息後允許Datagrams通過的原因是它允許從程序發送到的端口接收異常。所以在發送到另一個端口之後,可以從它接收。

+0

閱讀完您的問題後,我很興奮地建議禁用Windows防火牆並讓我獲得50點獎勵。討厭鬼。 ;)如您所知,Windows防火牆默認情況下不允許入站連接。由於UDP不是一個有狀態的協議,它需要一個傳出數據包來表示你已經建立了一個傳出連接。 – Zenexer

相關問題