Socket:Connect 将花费 2 分钟寻找 IP,然后超时。如何减少这个时间?

问题描述 投票:0回答:2

我想减少 socket:connect 查找要连接的 IP/端口所需的允许超时时间?在某些使用 IP 10.0.0.x 的网络路由器(例如 Netgear)上,只需不到一秒就会超时。

注意:“选择”稍后出现

host = gethostbyname("xxx");//invalid IP, 

memcpy(&(sin.sin_addr), host->h_addr, host->h_length);
sin.sin_family = host->h_addrtype;
sin.sin_port = htons(4000);

s = socket(AF_INET, SOCK_STREAM, 0);
hConnect = connect(s, (struct sockaddr*)&sin, sizeof(sin));//sits here for 2 minutes before moving on to the next line of code

bConn = 0;// no connect
if (hConnect == 0) {
    bConn = 1;// connect made
}

谢谢

c sockets timeout
2个回答
3
投票

在调用

connect()
之前将套接字设置为非阻塞,然后对其执行
select()
poll()
以找出其上发生的任何事件。

注意:使用此设置,您将从

connect()
获得非零返回,并且
errno
设置为
EINPROGRESS
,以防
connect()
返回但尚未连接但仍在尝试执行操作。

请参阅

ERRORS
手册页的
connect()
部分了解更多信息。


1
投票

执行此操作的标准方法分为两个步骤:

  1. connect() 与 O_NONBLOCK
  2. 使用带有超时的 select()
© www.soinside.com 2019 - 2024. All rights reserved.