2017-06-04 141 views
0

我正在嘗試爲大量預分配的套接字編寫高性能庫。我正在使用SocketAsyncEventArgs XXXAsync方法。當我嘗試重新使用第二次的插座調用C#Socket SocketAsyncEventArgs重用套接字 - ERRAddrAlreadyInUse

_socket.DisconnectAsync(_socketAsyncEventArgs)後

和設置

_socketAsyncEventArgs.DisconnectReuseSocket = TRUE;

在我斷開呼叫之前,我在第二次連接呼叫時收到ERRAddrAlreadyInUse。當我創建Socket對象時,我嘗試了以下選項,但沒有更改。我知道我可以調用Close並創建新的Socket,但每次我調用我的主函數時都會分配新的對象,這很糟糕。

_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(false, 0)); 
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true); 

我也試圖ReuseAddress設置爲true,但什麼都沒有改變 我等待着第1切斷完成,然後後來我打電話,再次發起連接的方法。我也不能100%肯定,如果我應該使用不同的SocketAsyncEventArgs用於連接/斷開通話,因爲這是一個套接字客戶端我認爲沒有問題,使用1

private void SocketConnect() 
{ 
    try 
    { 
     if(!_init) 
     { 
      _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
      { 
       UseOnlyOverlappedIO = true, 
       ReceiveBufferSize = _receiveBuffer.Length, 
       SendBufferSize = _sendBuffer.Length, 
      }; 
      _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(false, 0)); 
      _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true); 

      _socketAsyncEventArgs = new SocketAsyncEventArgs(); 
      _socketAsyncEventArgs.Completed += _socketProc; 

      _init = !_init; 
     } 
     _socketAsyncEventArgs.RemoteEndPoint = _proxy != null ? 
     new IPEndPoint(_proxy.IP, _proxy.Port) : new IPEndPoint(Dns.GetHostAddresses(DestinationUri.Host)[0].MapToIPv4(), DestinationUri.Scheme == "https" ? 443 : 80); 
     var res = _socket.ConnectAsync(_socketAsyncEventArgs); 
     if(!res) 
      _socketProc(_socket, _socketAsyncEventArgs); 
    } 
    catch(SocketException socketException) 
    { 
     _completedTask.SetResult(false); 
     Debug.WriteLine($"SocketConnect: {socketException.Message} : {socketException.ErrorCode} : {socketException.SocketErrorCode}"); 
    } 
} 

回答

0

有一個在註冊表中TIME_WAIT一個TCP設置按標準設置爲120。傷心的是,只有C Winsock文檔指定了這個,而不是C#。猜猜我必須強制關閉套接字並重新創建。