我正在尝试创建套接字并连接到设备。当设备不在网络中并且我尝试连接时会发生此问题。我得到错误的响应(这是好的,我更新我的设备状态的基础),但问题是我在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即)响应真(连接)或假(未连接)?
答案 0 :(得分:1)
快速表示正常<1ms至<20ms,即
如果设备不存在,则无法快速获得有关失败连接的响应。由3-way-handshake建立TCP连接。在此握手中,客户端首先向服务器发送SYN数据包,然后等待SYN + ACK。
答案 1 :(得分:-1)
您可以先尝试ping地址,看看是否收到回复,如果不这样做,请不要尝试连接到该地址
Ping pinger = new Ping();
try
{
PingReply reply = pinger.Send(ip);
if (reply.Status == IPStatus.Success)
{
}
else
{
}
}