2016-02-12 89 views
2

当我从Winsock调用connect()函数时,有什么方法可以减少超时吗? 我觉得差不多是30秒,我想放5秒。Winsock中的connect()函数中的超时

+0

目前还不清楚你想做两件完全不同的事。你想改变'connect'调用返回之前的时间吗?或者你想改变实际连接操作愿意等待多久?无论需要多长时间,最好的解决方案可能仅仅是等待超过5秒钟的“连接”。 –

+0

是的,我想更改连接呼叫返回之前的时间。如果在5秒内它不起作用,我放弃并继续前进。 – cna

+2

无法改变'connect()'本身在退出之前等待的时间。它是一种全或无的功能。但是你可以把套接字设置为异步/非阻塞模式,这样'connect()'将立即退出,然后你可以使用'select()','WSAEventSelect()'或者WSAAsyncSelect()来处理使用任何你想要的超时等待。 –

回答

6

最简单的方法是在连接时使用非阻塞模式的套接字,并使用select()超时5秒来检查套接字是否可写。在select()退出后,连接建立或不建立。如果没有,请考虑连接超时并根据需要执行错误处理。

+0

但是通过这种方式,必须建立连接,对吧? – cna

+0

@cna,你是什么意思'必须'?最多5秒后,你将控制回去,你会知道它是否成立。 – SergeyA

+3

@cna:一个非阻塞套接字在后台建立连接,而你的代码继续做其他事情。因此,将套接字设置为非阻塞模式('ioctlsocket(FIONBIO)'设置为1),然后调用'connect()'。如果'connect()'返回'SOCKET_ERROR'并且'WSAGetLastError()'返回'WSAEWOULDBLOCK',那么连接正在进行,所以在5秒的超时时间内调用'select()'。如果'select()'返回成功,表示套接字可写,则连接已建立。否则,关闭插座。 –