如何在没有select()的情况下超时特定套接字和特定端口?

时间:2011-10-21 18:44:54

标签: c windows winapi sockets winsock

查看select()函数,它似乎用于检查多个事件源。

我有一个套接字绑定到我服务器上的一个端口。

基本上想要在500ms后超时recvfrom()功能。

select()是执行此操作的最佳/唯一方式还是过度杀戮?

谢谢!

2 个答案:

答案 0 :(得分:1)

select是在套接字文件描述符上设置超时的最佳方法。它实际上是正常的调用,它会让你的程序在数据可用或超时发生之前进入休眠状态,这意味着你的程序不会锁定系统。

答案 1 :(得分:1)

如果在阻塞模式下使用套接字,那么使用select()等待数据到达,然后调用recvfrom()是一种(并且更常见)方法,但另一种方法是使用{ {1}}设置套接字的setsockopt()选项,该选项设置阻塞读取操作的超时(有关阻止发送操作,请参阅SO_RCVTIMEO)。然后,您可以致电SO_SENDTIMEO并让它在内部超时。

如果您在非阻止模式下使用套接字,则可以使用recvfrom()FD_READ接收异步WSAASyncSelect()通知。无需等待超时。

如果您在重叠模式下使用套接字,则可以使用WSAASyncEvent()WSARecvFrom()WSAGetOverlappedResult()接收异步读取通知。无需等待超时。