有人可以向我解释为什么我们在select()
之前(在服务器端)使用recvfrom()
函数而不是在sendto()
之前(在客户端)在等待超时时使用//EX
CLIENT SERVER
------ ------
select() /* start timeout */
sendto() /* --send packet--> */ recvfrom()
recvfrom() /* <--send ACK-- */ sendto()
函数?在我看来,超时应该在发送方的一边。
{{1}}
只要在达到超时之前收到了ACK,发件人就可以发送另一个文件。
答案 0 :(得分:4)
您通常不会将select
与UDP一起使用,除非您需要以下其中一项:
recvfrom
或sendto
取消阻止recvmmsg
(但是,你真的希望使用epoll_wait
)来接收一大堆带有一个系统调用的数据报 select
经常与TCP一起使用,因为它能够在多个套接字之间进行多路复用,每个套接字对应一个连接的客户端。 UDP不需要这样做,因为一个套接字足以接收来自每个客户端的数据包(假设它们使用相同的端口)。
select
阻止,直到您等待的条件(例如准备好接收或准备发送)为止。如果没有任何东西可以接收,recvfrom
会阻止,所以如果这是你唯一被讨论的内容,那么调用select
就没用了。
答案 1 :(得分:0)
UDP没有内置确认。所以sendto()
只是将数据包发送到网络并立即返回,它没有任何等待响应或确认的内置方式。您的应用程序知道它希望服务器发送响应,因此它等待recvfrom()
的响应。