2013-10-13 41 views
0

我有一個聽衆偵聽本地主機上的指定端口號這樣的:綁定同一個端點的TcpListener和TcpClient的

TcpListener listener = new TcpListener(localIP); 
listener.Start(); 

while (true) { 
listen: 
    if (!listener.Pending()) { 
     Thread.Sleep(100); 
     goto listen; 
    } 
    Socket socket = listener.AcceptSocket(); 
} 

現在同樣的程序應該對這個節目像其他情況下的連接這樣的:

TcpClient client = new TcpClient(localIP); //localendpoint should use same port 
client.Connect("localhost", remotePort); 

正如你看到的,我結合相同IPEndPoint localIP同時爲聽衆客戶。所以,當程序的另一個實例與這個實例有連接時,監聽器中的套接字可以給我它RemoteEndPoint。這樣我就不會得到系統生成的隨機端口號。由於這兩個監聽器和客戶端綁定到同一IPEndPoint localIP

Only one usage of each socket address (protocol/network address/port) is normally permitted

:當然,這是行不通的,我得到這個錯誤。

是否有解決方法,以便我可以將偵聽器和客戶端綁定到同一個EndPoint?因爲我想從偵聽器中獲取socket.RemoteEndPoint的端口號。此端口號應該是分配給程序的每個單獨實例的端口號。

+0

這沒有意義。當然,你不能使用同一個本地tcp端口進行2個連接,系統在到達時如何知道兩個連接中的哪一個應該接收數據包?這是港口的全部重點。但這絕不應該是需要的。我不明白這個問題是什麼,或者爲什麼「新的TcpClient(localIP)」會對它有所幫助。 – svinja

+0

好吧,就像我說的那樣,我的目的是獲取套接字另一端的程序正在監聽它自己的傳入連接的端口號。相反,只要我做'TcpClient client = new TcpClient()',系統就會創建一個隨機的端口號。 – QuantumHive

+0

我不明白爲什麼隨機端口是一個問題。您是否試圖從* listener *連接獲取遠程端口?嘗試閱讀* accepted *連接的遠程端口 - 您的Socket套接字= listener.AcceptSocket();連接,而不是聽衆。 – svinja

回答

0

那麼,根據問題的評論,最好的解決方案就是發送程序通過套接字連接監聽的端口號。

0

我建議切換到WCF進行通訊。它爲您提供了許多方便的工具,用於在序列化,傳輸協議,安全性,配置等方面進行抽象。最終,WCF可以讓您爲不同的客戶端生態系統構建面向服務的應用程序,而不是自己完成所有艱苦的工作。

WCF所提供的功能之一就是所謂的Duplex Binding,它應該爲您提供所需的功能:連接客戶端立即宣佈一種回叫方式。

如果您仍然需要傳達您的網絡拓撲結構,那麼您仍然可以使用WCF執行此操作;爲此,我建議實施獨立的服務界面,專門處理網絡拓撲。

一個教程+例如在開始使用WCF,創建乾淨的代碼可以發現herehere

相關問題