select()用于UDP连接

时间:2013-11-03 21:08:10

标签: c++ sockets network-programming udp

有人可以向我解释为什么我们在select()之前(在服务器端)使用recvfrom()函数而不是在sendto()之前(在客户端)在等待超时时使用//EX CLIENT SERVER ------ ------ select() /* start timeout */ sendto() /* --send packet--> */ recvfrom() recvfrom() /* <--send ACK-- */ sendto() 函数?在我看来,超时应该在发送方的一边。

{{1}}

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

2 个答案:

答案 0 :(得分:4)

您通常不会将select与UDP一起使用,除非您需要以下其中一项:

  • 使用单个线程从多个端口(或一个端口和一个unix套接字等)接收
  • 在发生其他事件时立即检测到,而无需等待无关的recvfromsendto取消阻止
  • 以最便携的方式睡觉
  • 你想使用特定于Linux的recvmmsg(但是,你真的希望使用epoll_wait)来接收一大堆带有一个系统调用的数据报

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

select阻止,直到您等待的条件(例如准备好接收或准备发送)为止。如果没有任何东西可以接收,recvfrom会阻止,所以如果这是你唯一被讨论的内容,那么调用select就没用了。

答案 1 :(得分:0)

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