2011-08-29 154 views
0

我建立了一個簡單的客戶端/服務器系統,但由於某些原因,客戶端不會通過互聯網連接。我讓他們在同一臺機器上進行通信,使用本地主機地址(127.0.0.1)和我的局域網IP地址(192.168.2.2)。客戶端不通過互聯網連接到服務器

我也確認端口是打開使用http://www.whatsmyip.org/ports/,當我使用這個站點時,服務器上會觸發回調函數,所以我假設服務器正常工作。

但是,當我嘗試從我的客戶端連接到相同(互聯網)IP地址/端口時,服務器檢測不到任何內容,並且客戶端在OnConnect回調中引發異常。我注意到,ClientConnect的RemoteEndPoint屬性沒有被BeginConnect語句正確設置 - 當我看它時拋出一個SocketException(10057)。 (當通過LAN地址連接,它工作正常。)

private void ConnectToServer() 
{ 
    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IPAddress ipAddress = IPAddress.Parse(txtIPAddress.Text); 

    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Convert.ToInt32(txtPort.Text)); 
    clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null); 
} 

什麼能阻止客戶端通過外部IP地址連接到服務器,因爲它可以通過局域網IP地址連接和服務器通過互聯網接受連接?

我正在使用Windows 7和.NET 3.0。

任何意見感激讚賞。謝謝。

+0

你檢查了你的filewall設置嗎?確保端口對傳入連接開放。 – TJHeuvel

+1

如果你可以通過一些IP地址而不是其他的連接,這不是一個真正的編程問題。 – paxdiablo

+0

是的,港口是開放的。參見上文第2段。 – Xobbo

回答

0

首先,在調用BeginConnect之後,您不應該期望套接字被連接。通常需要一些往返才能建立連接。因此,在建立連接之前詢問遠程端點時,預期錯誤代碼爲10057 Not Connected

至於爲什麼你的網絡設置不起作用。如果我正確理解您的設置,您嘗試以下方式發送數據包:

Your machine (LAN) --> Port-forwarding device (WAN) --> Your machine (LAN) 

您已經驗證端口轉發設備支持這種設置?您已驗證以下

幽州:

Remote machine (WAN) --> Port-forwarding device (WAN) --> Your machine (LAN) 

你的端口轉發設備可能缺少LAN -> WAN -> LAN端口轉發支持。

您可能還想使用Wireshark來查看發送的數據包。

+0

謝謝。我沒有考慮到LAN - > WAN - > LAN轉發可能與WAN - > WAN - > LAN轉發有任何不同。我會盡力調查這一點。我的設置,作爲參考,是一個網關路由器(設置爲DMZ)和一個無線路由器(只在指定的端口轉發),所以我猜他們其中任何一個都可能是問題? 關於BeginConnect,當你說它需要幾次往返時,你的意思是需要時間?我用調試器停止了該程序以檢查值 - 無論我等待多久,它都不會改變。 – Xobbo

+0

是的,往返時間是客戶端發送數據包到服務器所需的時間,直到它收到服務器的響應爲止。幾分鐘後,您還應該看到「10060 Connection Timed Out」爲錯誤代碼,但使用調試器可能會改變此情況。 – Mats

+0

您的建議似乎是正確的,因爲我在具有單獨的互聯網連接的機器上安裝了客戶端軟件,並且工作正常。 我真的不明白爲什麼路由器不能轉發來自自己局域網的請求,我不知道如何改變它,但至少現在我可以使用局域網IP地址來測試我的程序,並且仍然期望它們在發佈後通過互聯網工作。感謝您的幫助,Mats。 – Xobbo

相關問題