私は、多くの事前割り当てを持つソケットのための高性能ライブラリを作成しようとしています。私は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}"); } }