2017-06-04 31 views
0

私は、多くの事前割り当てを持つソケットのための高性能ライブラリを作成しようとしています。私はSocketAsyncEventArgsのXXXAsyncメソッドを使用しています。私はC#ソケットSocketAsyncEventArgs再利用ソケット - ERRAddrAlreadyInUse

と設定

_socket.DisconnectAsync(_socketAsyncEventArgs)を呼び出した後に2回目のためのソケットを再利用しようとすると

_socketAsyncEventArgs.DisconnectReuseSocket =はtrue。

私は切断呼び出しを行う前に、私は2番目の接続呼び出しでERRAddrAlreadyInUseを取得します。私はSocketオブジェクトを作成するときに以下のオプションを試しましたが、何も変わりません。私はCloseを呼び出して新しいソケットを作成できることを知っていますが、それは主な機能を呼び出すたびに新しいオブジェクトを割り当てることになりますが、これは悪いことです。

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

私はまた、trueにReuseAddressを設定しようとしたが、何も私は再び接続を開始するメソッドを呼び出し、その後、私は終了する最初の切断を待っている を変えないと。これはソケットクライアントであるので、私は私がTIME_WAITのためにレジストリでTCPの設定があります。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

を使用に問題は見られない、また、私は接続/切断コールに対して異なるSocketAsyncEventArgsを使用する必要がある場合は100%を確認していません標準で120に設定されています。悲しいことに、CのWinsockのドキュメントではC#ではなく、これが指定されています。私はソケットを閉じて再作成しなければならないと思う。

関連する問題