我有一個聽衆偵聽本地主機上的指定端口號這樣的:綁定同一個端點的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
的端口號。此端口號應該是分配給程序的每個單獨實例的端口號。
這沒有意義。當然,你不能使用同一個本地tcp端口進行2個連接,系統在到達時如何知道兩個連接中的哪一個應該接收數據包?這是港口的全部重點。但這絕不應該是需要的。我不明白這個問題是什麼,或者爲什麼「新的TcpClient(localIP)」會對它有所幫助。 – svinja
好吧,就像我說的那樣,我的目的是獲取套接字另一端的程序正在監聽它自己的傳入連接的端口號。相反,只要我做'TcpClient client = new TcpClient()',系統就會創建一個隨機的端口號。 – QuantumHive
我不明白爲什麼隨機端口是一個問題。您是否試圖從* listener *連接獲取遠程端口?嘗試閱讀* accepted *連接的遠程端口 - 您的Socket套接字= listener.AcceptSocket();連接,而不是聽衆。 – svinja