2012-03-13 76 views
4

是否有可能使用的是阻塞winsockets时,超时设置为接受功能?就像我们可以通过setsockopt接收和发送函数一样?的Winsock接受超时

好像这是不可能的,但我要确保。

+1

可能的重复http://stackoverflow.com/questions/4181784/how-to-set-socket-timeout-in-c-when-making-multiple-connections – 2012-03-13 11:49:45

+0

@Adriano不,这个问题是关于客户端,* accept *只在服务器端使用。他们不是在谈论*接受*功能。 – Alecs 2012-03-13 11:52:39

+0

不能在Windows,你必须自己管理超时(不知何故,线程轮询?) – 2012-03-13 12:03:32

回答

7

选择功能可与超时使用。虽然select最常用于非阻塞套接字,但我还没有阅读阻止传递阻塞套接字来选择的任何内容。如果select函数超时,那么您的行为等同于接受超时。

MSDN

“的参数readfds标识是为了便于阅读待检查的套接字。如果套接字当前处于监听状态时,其将被标记为可读如果传入的连接请求已被接收使得接受保证无阻塞来完成。对于其他的套接字,即排队的数据可读性装置是可用的,用于读取以使得到的recv呼叫,的WSARecv,WSARecvFrom,或recvfrom的被保证不被阻塞“。

这应该给你你期望的行为。

+0

否,选择不改变套接字的行为或接受功能,它仍然是相同的 - 接受还是块没有任何超时,我检查过了。 – Alecs 2012-03-13 12:43:32

+1

关键是你不应该先打电话给接受,你打电话选择第一个填充readfds与你的听筒,当选择返回,如果你的套接字被标记为可读,然后调用接受,它会成功。如果没有传入的连接请求,则选择将超时。 – Jay 2012-03-13 12:46:28

+0

哦,是的,这是我想要的,谢谢!但是[这里](http://tangentsoft.net/wskfaq/articles/io-strategies.html)据说应该避免调用select,你能评论一下吗? – Alecs 2012-03-13 13:39:17

0

这是相当容易安排另一个线程关闭监听套接字AFER超时。创建一个自动重置事件,并在accept()返回时发出信号。用WaitForSingleObject()在具有超时间隔的循环中编写一个等待事件的函数。如果WFSO返回非WAIT_OBJECT_0的任何内容,请关闭监听套接字并退出。在进入accept()循环之前,创建一个线程来调用该函数。

另一种可能性是使用的AcceptEx(),并与作为重叠结构的hEvent传递事件的WFSO()超时等待。如果超时激活,请使用CancelIo()从网络IO系统中删除排队的acceptEx()完成。