我正在嘗試爲大量預分配的套接字編寫高性能庫。我正在使用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}");
}
}