2011-04-19 94 views
0

我在得到一個簡單的服務器/客戶端套接字應用在兩臺計算機之間工作在C#的問題,我已經開始爲江郎才盡之間的連接插座。我在兩臺機器上運行Windows XP,並且我已經爲防火牆添加了除了端口以外的端口以及exe文件。奇怪的部分是,它可以在單臺機器上運行的客戶端和服務器完美工作。故障電腦

服務器代碼:

IPAddress ipAddress; 
IPAddress.TryParse("127.0.0.1", out ipAddress); 

IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 51000); 
_ListenerSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.IP); 
try 
{ 
    _ListenerSocket.Bind(localEndPoint); 
    _ListenerSocket.Listen(1000); 

    while (_Running) 
    { 
     _ListenerSync.Reset(); 
     _ListenerSocket.BeginAccept(new AsyncCallback(AcceptCallback), _ListenerSocket); 
     _ListenerSync.WaitOne(); 
    } 

    _ListenerSocket.Shutdown(SocketShutdown.Both); 
    _ListenerSocket.Close(); 
} 

客戶端代碼:

tTarget = new Socket(_IP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
tTarget.Connect(_IP, 51000); 

AcceptCallback永遠不會被調用。所以有些東西在觸發之前拒絕連接。此客戶端/服務器設置適用於單臺計算機上的內部連接(在同一臺計算機上同時運行客戶端和服務器),但嘗試在本地網絡上連接兩臺計算機時失敗。

一個異常被拋出的tTarget.Connect()調用:

No connection could be made because the target machine actively refused it 

我已經安裝了Wireshark的在兩臺機器上,以確保數據包到達,106是客戶端和101是服務器。

262 24.724892 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1 
263 24.724922 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 
270 25.144866 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1 
271 25.144887 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 
288 25.647842 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1 
289 25.647874 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0 

注意:這是引發異常之前端口51000上的所有網絡通信。

看起來沒有任何東西被阻擋,因爲它在一臺計算機上工作,所以我認爲它可能是套接字上的設置,它不允許來自遠程PC的連接。任何意見將不勝感激,謝謝。

回答

3

將它綁定到地址0.0.0.0。這意味着「所有本地地址,不管它們是什麼」。

對本地地址進行硬編碼是一個糟糕的主意。使其可配置性更好,但只有在您明確允許監聽某些本地地址而不監聽其他地址時纔是必要的。對於企業級服務器軟件,這有時是一項要求(多宿主服務器場景等)。

3

使用服務器計算機的IP地址,而不是localhost地址,127.0.0.1。