1

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

//EX

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

并且只要在超时之前收到了 ACK,发送者就可以发送另一个文件。

4

2 回答 2

4

您通常根本不使用selectUDP,除非您需要以下之一:

  • 使用单个线程从多个端口(或一个端口和一个 unix 套接字等)接收
  • 立即检测其他事件,无需等待无关recvfromsendto解除阻塞
  • 以最便携的方式睡觉
  • 你想使用 Linux 特定的recvmmsg(但是,你真的想使用epoll_wait)通过一个系统调用接收一大堆数据报

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

select阻塞,直到您等待的条件(例如准备接收或准备发送)为真。recvfrom如果没有什么可接收的,无论如何都会阻塞,所以如果这是你唯一感兴趣的事情,那么打电话select是没用的。

于 2013-11-03T21:24:39.330 回答
0

UDP 没有内置确认。因此sendto()只需将数据包发送到网络并立即返回,它没有任何等待响应或确认的内置方式。您的应用程序知道它希望服务器发送响应,因此它等待带有 的响应recvfrom()

于 2013-11-03T21:12:03.387 回答