gpt4 book ai didi

c++ - select() 用于 UDP 连接

转载 作者:行者123 更新时间:2023-11-30 01:56:28 33 4
gpt4 key购买 nike

有人能给我解释一下为什么我们在 recvfrom() 之前(在服务器端)而不是在 sendto()< 之前使用 select() 函数吗(在客户端)等待超时时?在我看来,超时应该在发送方。

//EX

CLIENT SERVER
------ ------
select() /* start timeout */
sendto() /* --send packet--> */ recvfrom()
recvfrom() /* <--send ACK-- */ sendto()

只要在达到超时之前收到 ACK,发送方就可以发送另一个文件。

最佳答案

您通常根本不会将 select 与 UDP 一起使用,除非您想要以下之一:

  • 使用单个线程从多个端口(或一个端口和一个 unix 套接字等)接收
  • 在其他事件发生时立即检测,无需等待不相关的 recvfromsendto 解锁
  • 以最便携的方式 sleep
  • 您想使用特定于 Linux 的 recvmmsg(但是,您真的想使用 epoll_wait)来接收一大堆一个系统调用的数据报

select 通常与 TCP 一起使用,因为它能够在多个套接字之间进行多路复用,每个套接字对应一个连接的客户端。对于 UDP,这不是必需的,因为一个套接字足以接收来自每个客户端的数据包(假设它们使用相同的端口)。

select 会阻塞,直到您等待的条件(例如准备接收或准备发送)为真。如果没有任何东西可接收,recvfrom 无论如何都会阻塞,所以如果这是您唯一感兴趣的东西,调用 select 是没有用的。

关于c++ - select() 用于 UDP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758152/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com