Csharp/C#教程:重用异步套接字:后续连接尝试失败分享


重用异步套接字:后续连接尝试失败

我正在尝试在异步HTTP客户端中重用套接字,但是第二次我无法连接到主机。 我基本上将异步HTTP客户端视为具有以下状态的状态机:

在连接状态下,我调用BeginConnect

 private void BeginConnect() { lock (_sync) // re-entrant lock { IPAddress[] addersses = Dns.GetHostEntry(_asyncTask.Host).AddressList; // Connect to any available address IAsyncResult result = _reusableSocket.BeginConnect(addersses, _asyncTask.Port, new AsyncCallback(ConnectCallback), null); } } 

一旦建立成功连接,回调方法会将状态更改为Sending

 private void ConnectCallback(IAsyncResult result) { lock (_sync) // re-entrant lock { try { _reusableSocket.EndConnect(result); ChangeState(EClientState.Sending); } catch (SocketException e) { Console.WriteLine("Can't connect to: " + _asyncTask.Host); Console.WriteLine("SocketException: {0} Error Code: {1}", e.Message, e.NativeErrorCode); ThreadPool.QueueUserWorkItem(o => { // An attempt was made to get the page so perform a callback ChangeState(EClientState.Failed); }); } } } 

在清理中,我Shutdown套接字并使用重用标志Disconnect

 private void CleanUp() { lock (_sync) // re-entrant lock { // Perform cleanup if (_reusableSocket.Connected) { _reusableSocket.Shutdown(SocketShutdown.Both); _reusableSocket.Disconnect(true); } ChangeState(EClientState.Available); } } 

BeginConnect后续调用会导致超时和exception:

SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应XX.XXX.XX.XX:80

错误代码:10060

这是状态跟踪:

 Initializing... Change State: Connecting Change State: Sending Change State: Receiving Change State: CleanUp Callback: Received data from client 0 // <--- Received the first data Change State: Available Change State: Connecting // <--- Timeout when I try to reuse the socket to connect to a different endpoint 

为了能够重用套接字连接到不同的主机,我该怎么办?

注意:我没有尝试重新连接到同一主机,但我认为发生了同样的事情(即无法连接)。

更新
我在BeginConnect的文档中找到了以下注释:

如果此套接字先前已断开连接,则必须在线程上调用BeginConnect,该线程在操作完成之前不会退出。 这是底层提供者的限制。 使用的EndPoint也必须不同。

我开始怀疑我的问题是否与此有关……我正在连接到另一个EndPoint,但它们是什么意思是我们称之为BeginConnect的线程必须在操作完成之前退出?

更新2.0:
我问了一个相关的问题 ,我尝试使用“Async family”调用而不是“Begin family”调用,但是我遇到了同样的问题!

我评论了这个问题: 在C#中使用Disconnect(true)/DisconnectEx()关于套接字重用的套接字重用有什么好处 ,这可能对你有帮助。

我个人认为这是客户端代码中的一个优化。

重新更新1问题; 不,如果是这种情况你会得到一个AbortedOperationexception(参见这里: 部署时的VB.NET 3.5 SocketException但不是开发机器上 ),如果你在Vista或更高版本上运行,那么文档是错误的强制执行“线程必须存在,直到重叠的I / O完成后”规则,以前的操作系统强制执行。

正如我在回答相关问题时已经说过的那样; 将此function用于出站连接建立没有什么意义。 它可能最初添加到Winsock API以支持入站连接上的AcceptEx()套接字重用,其中,在一个非常繁忙的Web服务器上,使用TransmitFile()将文件发送到客户端(这是重用的断开连接似乎起源)。 文档声明它不能很好地与TIME_WAIT使用,因此将它用于启动主动关闭的连接(因此将套接字置于TIME_WAIT ,请参见此处 )并不真正有意义。

你能解释为什么你认为这种微优化在你的情况下实际上是必要的吗?

你检查了MaxConnections设置吗? https://msdn.microsoft.com/de-de/library/system.servicemodel.nettcpbinding.maxconnections.aspx

上述就是C#学习教程:重用异步套接字:后续连接尝试失败分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1018388.html

(0)
上一篇 2022年1月3日
下一篇 2022年1月3日

精彩推荐