关于UDP服务器如何将响应发送回UDP客户端的困惑

时间:2016-12-18 21:15:25

标签: udp tcp-ip

我正在编写一个基于UDP的客户端服务器并且已经获得了相当多的代码,但我对UDP服务器如何将响应发送回UDP客户端感到困惑,这是我的理解,直到现在:

  • 假设UDP客户端想要与UDP服务器通信,那么它将向UDP服务器发送请求(使用在客户端打开的UDP套接字),现在这将到达UDP服务器上的UDP模块,其中UDP模块将使用端口号识别UDP服务,并将该请求发送到该UDP服务/服务器。
  • 现在,由于UDP是一种无连接协议,因此与TCP不同,UDP服务器不会通过某些连接发送响应,而是UDP服务器将从请求中提取源IP地址和源端口并将响应发送回客户端

我的困惑是,在服务器端,有一个套接字绑定到UDP端口并“连续”监听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字发送对UDP服务器的请求然后就是这样,我认为它不能保持该端口挂起以便UDP服务器响应,如果该端口关闭,那么客户端将如何接收响应。

我的意思是,UDP服务器的响应会回到UDP客户端,因为IP地址在那里,但是一旦响应已经到达客户端的UDP模块,即使有一个端口,但UDP模块如何将其发送到最初发送请求的客户端,因为它会关闭绑定到该端口的套接字?或者它不会?

我正在寻找能够清楚地描述UDP通信的答案(我不想将其与TCP进行对比或解释TCP,因为我已经对TCP有了一定的了解),尤其是响应将如何回到UDP客户端。

3 个答案:

答案 0 :(得分:1)

  

我的困惑是,在服务器端,有一个套接字绑定到UDP端口并“连续”监听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字发送对UDP服务器的请求然后就是这样,我认为它不能保持该端口挂起以便UDP服务器响应,如果该端口关闭,那么客户端将如何接收响应。

我同意。这是你的困惑。为什么你认为不能保持套接字打开并接收它?它可以。

  

我的意思是,UDP服务器的响应会回到UDP客户端,因为IP地址在那里,但是一旦响应已经到达客户端的UDP模块,即使有一个端口,但UDP模块如何将其发送到最初发送请求的客户端,因为它会关闭绑定到该端口的套接字?

为什么?

  

或者它不会?

客户:

  • 创建一个套接字
  • 发送数据报
  • 致电recvfrom()或朋友以接收回复。

当然,如果客户端对响应不感兴趣,它可以关闭套接字,但这不是正常情况。

  

我正在寻找能够清楚地描述UDP通信的答案(我不想将其与TCP进行对比或解释TCP,因为我已经对TCP有了一定的了解),尤其是响应将如何回到UDP客户端。

因此,请勿使用标记标记您的问题。

答案 1 :(得分:0)

客户端使用一些随机但唯一的源端口。服务器将响应发送回此唯一端口。服务器永远不会一次从单个端口接收2个请求。服务器使用此事实将响应映射到请求。仅在收到响应后,客户端才会关闭此源端口/套接字。客户端可以在任何给定的时间点发送与可供处理的端口数量一样多的请求。由于一旦收到响应,端口即会关闭,因此它将再次变为可用。

参考:https://www.slashroot.in/how-does-udp-work

答案 2 :(得分:0)

是的,UDP服务器可以发送回客户端。这是一个例子: https://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html和代码演示https://www.cs.rutgers.edu/~pxk/417/notes/sockets/demo-udp-04.html

我们现在有一个客户端向服务器发送消息。如果服务器希望将消息发送回该客户端怎么办?没有连接,因此服务器不能只写回响应。幸运的是,recvfrom调用给了我们服务器的地址。它被放置在remaddr中:

recvlen = recvfrom(s,buf,BUFSIZE,0,(struct sockaddr *)&remaddr,&addrlen);

服务器可以在sendto中使用该地址,然后将邮件发送回收件人的地址。

sendto(s,buf,strlen(buf),0,(struct sockaddr *)&remaddr,addrlen)