使用TCP协议使套接字响应太慢(21秒)

时间:2015-03-13 13:21:49

标签: c# sockets networking network-programming

我正在尝试创建套接字并连接到设备。当设备不在网络中并且我尝试连接时会发生此问题。我得到错误的响应(这是好的,我更新我的设备状态的基础),但问题是我在21秒内得到响应。我正在使用此功能进行连接:

public bool Connect(IPEndPoint ipEndPoint, IPAddress ipAddress, Guid id, bool isAlive)
{
    try
    {
          clSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
          clSocket.NoDelay = false;
          clSocket.ReceiveTimeout = 1000;
          clSocket.SendTimeout = 1000;
          clSocket.Connect(ipEndPoint);
          return true;
     }
     catch (Exception ex)
     {
          return false;
     }
}

尽可能多地阅读" 21秒超时"我发现我必须更改寄存器:

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\ TCPIP \参数
值名称:TcpMaxDataRetransmissions
数据类型:REG_DWORD - 数字
有效范围:0 - 0xFFFFFFFF
默认值:3

我正在回应这篇文章:
http://getin2me.blogspot.com/2010/08/are-you-also-facing-windows-sockets-21.html
和这篇文章:
https://social.msdn.microsoft.com/Forums/en-US/fd586377-34b3-4cb8-a3af-0a24c608e399/connectex-winsock-question?forum=vcgeneral

为什么在Windows 8中我找不到这个注册表?有没有其他解决方案,所以我可以快速(快速我的意思是正常< 1ms到< 20ms即)响应真(连接)或假(未连接)?

2 个答案:

答案 0 :(得分:1)

  

快速表示正常<1ms至<20ms,即

如果设备不存在,则无法快速获得有关失败连接的响应。由3-way-handshake建立TCP连接。在此握手中,客户端首先向服务器发送SYN数据包,然后等待SYN + ACK。

  • 如果服务器在那里但端口关闭,它将发回RST(而不是SYN + ACK),客户端知道服务器无法访问。这可以在RTT时间内完成,在本地网络中只需几毫秒,但如果您在互联网上,则可以轻松超过20毫秒。
  • 如果服务器不存在,则无法发回响应。在这种情况下,客户端将重试多次发送SYN,因为数据包可能只是丢失。等待响应的时间取决于操作系统和调整,但通常第一次重试在1秒后完成,第二次重试在3秒后完成......直到一段时间后客户端放弃并假设服务器不在那里。这意味着在这种情况下,它将需要几秒钟,你无能为力。

答案 1 :(得分:-1)

您可以先尝试ping地址,看看是否收到回复,如果不这样做,请不要尝试连接到该地址

Ping pinger = new Ping();
try
{
    PingReply reply = pinger.Send(ip);
    if (reply.Status == IPStatus.Success)
    {

    }
    else
    {

    }
}