在阻塞模式用setsockopt设置超时时间,为什么不起作用

2025-03-07 09:00:33
推荐回答(2个)
回答1:

1.首先将标志位设为Non-blocking模式,准备在非阻塞模式下调用connect函数2.调用connect,正常情况下,因为TCP三次握手需要一些时间;而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回EINPROGRESS,表示在建立连接但还没有完成。
3.在读套接口描述符集(fd_set rset)和写套接口描述符集(fd_set wset)中将当前套接口置位(用FD_ZERO()、FD_SET()宏),并设置好超时时间(struct timeval *timeout)
4.调用select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超时
如果你设置的超时时间大于75秒就没有必要这样做了,因为内核中对connect有超时限制就是75秒。

回答2:

Java中通过 socket.setSoTimeout(3000);设置超时时间,进入阻塞后,超过设置的超时时间后,会产生超时异常,如果要做一些处理,可以捕获这个异常在catch中做处理。设置超时可以打断socket的read阻塞状态。