gpt4 book ai didi

c# - C#套接字SocketAsyncEventArgs重用套接字-ERRAddrAlreadyInUse

转载 作者:行者123 更新时间:2023-12-03 12:09:23 29 4
gpt4 key购买 nike

我正在尝试为Sockets编写一个具有很多预分配功能的高性能库。我正在使用SocketAsyncEventArgs XXXAsync方法。当我尝试在调用后第二次重用套接字时

_socket.DisconnectAsync(_socketAsyncEventArgs)



和设置

_socketAsyncEventArgs.DisconnectReuseSocket = true;



在进行断开连接调用之前,我在第二个连接调用中得到ERRAddrAlreadyInUse。创建Socket对象时,我尝试了以下选项,但是没有任何变化。我知道我可以调用Close并创建新的Socket,但是每次我调用main函数时都会分配新对象,这很糟糕。
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(false, 0));
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);

我也尝试将ReuseAddress设置为true,但未做任何更改
我正在等待第一个断开操作完成,然后再调用再次启动连接的方法。我也不是100%确定是否应该对Connect/Disconnect调用使用不同的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}");
}
}

最佳答案

注册表中有一个TIME_WAIT的TCP设置,标准设置为120。遗憾的是,只有C Winsock文档指定了这一点,而C#没有。猜猜我必须强制关闭套接字并重新创建。

关于c# - C#套接字SocketAsyncEventArgs重用套接字-ERRAddrAlreadyInUse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44359404/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com