【问题标题】:Winsock accept timeoutWinsock 接受超时
【发布时间】:2023-03-17 15:37:02
【问题描述】:

是否可以在使用阻塞 winsockets 时将超时设置为 accept 函数?就像我们可以通过 setsockopt 来接收和发送函数一样吗?

似乎不可能,但我想确保。

【问题讨论】:

  • @Adriano 不,这个问题是关于客户端的,而 accept 函数仅在服务器端使用。他们不是在谈论 accept 功能。
  • 不是在 Windows 中,您必须自己管理超时(不知何故,线程?轮询?)

标签: c windows sockets winsock


【解决方案1】:

选择功能可以与超时一起使用。尽管 select 最常与非阻塞套接字一起使用,但我还没有读过任何阻止将阻塞套接字传递给 select 的东西。如果 select 函数超时,那么您的行为等同于接受超时。

来自MSDN

"参数 readfds 标识要检查可读性的套接字。如果套接字当前处于侦听状态,如果接收到传入的连接请求,则将其标记为可读,使得 accept 保证在没有阻塞的情况下完成。对于其他套接字,可读性意味着排队的数据可用于读取,从而保证对 recv、WSARecv、WSARecvFrom 或 recvfrom 的调用不会阻塞。"

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

【讨论】:

  • 不,select 不会改变套接字或接受函数的行为,它仍然保持不变 - 并且接受仍然阻塞而没有任何超时,我已经检查过了。
  • 关键是你不应该先调用accept,你先调用select用你的listen socket填充readfds,当select返回时,如果你的socket被标记为可读,然后调用accept,它就会成功。如果没有传入的连接请求,则 select 将超时。
  • 哦,是的,这是我想要的,谢谢!但是here据说应该避免调用select,请您评论一下吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多