c# - 增加 System.Net.Sockets.Socket 连接超时

标签 c# .net sockets timeout

我需要允许使用 System.Net.Sockets.Socket 连接到 FTP 服务器需要很长时间 - 至少 30 秒但可能更多。此代码总是在收到信号后返回,但在 20 秒后未连接,这显然是内部默认设置:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = socket.BeginConnect("128.0.0.1", 99, null, null);
bool signalled = result.AsyncWaitHandle.WaitOne(60000, true);

最佳答案

老问题,但我们遇到了同样的问题,所以我会在这里发布我们的解决方案。

WaitOne 超时可用于强制低于系统默认超时,但如果您想增加超时(即在您的系统中超过 20 秒例)您必须更改底层操作系统的 TCP 设置。

我们在 Windows 上遇到了这个问题,我们遇到了 21 秒的硬超时限制。要更改此设置,您可以使用以下 PowerShell 命令(以管理员身份运行 PowerShell 提示符):

Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4

默认值为 2,这会产生大约 21 秒的有效 TCP 连接超时。值 3 将超时增加到大约 40 秒,4 增加到大约 90 秒。可以找到更多信息 here .

对于 Linux,请查看这篇文章: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

关于c# - 增加 System.Net.Sockets.Socket 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341885/

相关文章:

c# - 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

java - read() 和 readObject() 的问题

java - 客户端套接字连接被拒绝

c# - C# 中的 TreeView 节点高亮颜色

c# - LINQ 2 实体,如何在 linq 查询中检查 DateTime.HasValue

c# - 获取对象的名称而不获取其位类型

c# - LINQ 按子属性分组

C# API 库和记录到 PowerShell 的 WriteVerbose()

.net - 为什么签名会是 ... -> Result<char*string>?

java - Android 数据报套接字抛出 "NetworkOnMainThreadException"而不是 "SocketException"