我正在開發一個點對點檔案共享應用程式,該應用程式可用于在沒有中央服務器的情況下傳輸檔案。
當涉及到一對一的檔案傳輸時,它就像一個魅力,但我最初計劃的方式是發送者可以將檔案發送到多個客戶端。
該應用程式使用TCP 打孔,因此不需要埠轉發。問題是,為了使 TCP 打孔作業,我需要為每個 TCPClient 指定一個本地埠。因此,我需要系結套接字。
TCPClient client = new TCPClient(port);
問題是,在創建新客戶端時(建立連接后),我會收到錯誤訊息,指出我無法系結新套接字。
就我而言,套接字被標識為Local Port with Local IP AND Remote Port with Remote IP AND Protocol。因此,如果兩個套接字在這 4 個中的一個中不同,則可以將它們作為單獨的連接進行處理。然而,我仍然得到例外。
如何對多個客戶端進行TCP 打孔?根據
這是Connect()我的自定義NetClient類中方法的代碼。(它包含TcpClient和 代表與遠程端點的連接。)
private async Task<bool> Connect(string _ip)
{
IPEndPoint _endPoint = new IPEndPoint(IPAddress.Any, port);
tcpClient = new TcpClient(_endPoint);
int tick = timeOut;
while (tick >= 0)
{
try { await tcpClient?.ConnectAsync(_ip, port); }
catch { }
if (tcpClient.Connected) return true;
tick--;
await Task.Delay(1000);
}
return false;
}
盡管如此,還是沒有運氣。有人可以幫忙嗎?
uj5u.com熱心網友回復:
好的,我找到了解決方案!對于那些可能遇到同樣問題的人來說,顯然有一個選項可以告訴 TCP 套接字本地端點可以重用。
根據作業系統和 TCP 實作,您可以為套接字添加選項SO_REUSEADDRESS和SO_REUSEPORT。這將使套接字忽略端點重復。(就我而言,它僅適用于本地端點。)
頭以上,本網站上關于主題的更多資訊,這是一個非常良好的閱讀。
現在,您需要在系結套接字之前設定這些屬性。因此,您需要socket.Bind()從 TcpClient 建構式中單獨呼叫。
使用TcpClient.Client訪問的TcpClient的插座。
使用可重用的本地端點創建 TcpClient 的正確方法:
TcpClient client = new TcpClient();
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseUnicastPort, true);
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Client.Bind(new IPEndPoint(IPAddress.Any, port));
完成這些步驟后,您應該不會遇到任何套接字系結問題。希望有所幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/360435.html
