当前位置: 首页 > 知识库问答 >
问题:

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

阳长恨
2023-03-14

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

  • 假设UDP客户端希望与UDP服务器通信,因此它将向UDP服务器发送请求(使用在客户端打开的UDP套接字),现在这将到达UDP服务器上的UDP模块,其中UDP模块将使用端口号标识UDP服务,并将该请求发送到该UDP服务/服务器

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

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

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

共有3个答案

淳于坚壁
2023-03-14

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

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

吴星汉
2023-03-14

是的,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*)

服务器可以在sendto中使用该地址,并将消息发送回收件人的地址。

发送到(s,buf,strlen(buf),0,(结构sockaddr*)

邬飞捷
2023-03-14

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

我同意。这是你的困惑。为什么你认为不能保持插座打开,并在其上进行接收?它可以。

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

为什么啊?

还是不会?

客户:

  • 创建一个套接字
  • 发送数据报
  • 调用recvfrom()或好友来接收响应。

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

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

所以不要用tcp标签来标记你的问题。

 类似资料:
  • 我正在寻找一些关于如何实现一个能够将音频发送到服务器的Java客户端的链接/源代码/教程(见下文)。它将能够发送一个音频文件,然后由服务器接收并通过计算机扬声器播放。 我还想问,对于这种情况,使用UDP或TCP服务器会更好吗?因为我将开发一个android应用程序,它可以录制声音,然后通过电脑扬声器将声音发送到服务器进行实时播放。

  • 我正在Unity中制作一个游戏,我试图将数据从客户端发送到服务器并返回到客户端(试图保存实例),但当我收到数据并尝试将数据发送回客户端时,它表示udp客户端未连接。 它成功地将数据从我的Unity客户端发送到服务器,但一旦它到达那里,套接字就会断开连接,我就无法返回任何内容。正如你所看到的,我试图设置一些多播选项,但它似乎不能正常工作。 客户: 服务器: 因此,服务器中UdpClient的实例会保

  • 我对使用UDP协议的服务器和客户端之间的通信有一个非常奇怪的问题。客户端是用Mono2x编写的(我使用Unity 3D作为我的客户端)并创建Udp客户端类实例: 我的服务器是 UWP 应用程序,我想在使用 DatagramSocket 的 Raspberry Pi 上运行: 我将数据从客户端发送到服务器,但运气不佳。我用TCPView检查了数据是从我的客户端应用程序发送的,但从未到达服务器。现在是

  • 从server-A(可通过静态IP全局访问)开始,我将UDP套接字绑定到0.0.0.0:25000。 然后,在(住宅)NAT 后面使用客户端 A,我将 UDP 套接字绑定到 0.0.0.0:25000。然后,客户端 A 将数据包发送到服务器 A。 服务器 A 接收数据包。服务器 A 记录远程套接字 K,数据包从中 NAT 开始。服务器 A 向 K 发送数据包,目的是 NAT 将数据包转发到客户端

  • 同样,如果客户机已经创建了一个IPv6套接字(因为getaddrinfo()说它是有效的),然后调用getaddrinfo()来查找服务器的地址,那么如果它只得到一个IPv4结果呢?我知道我可以告诉getaddrinfo()只给出IPv6结果,但是如果服务器没有IPv6地址怎么办?UDP客户端是否应该关闭并重新创建其套接字以匹配服务器地址格式?还是保证我能得到我要求的地址格式? (我欢迎任何能回答

  • 我尝试使用Spring Integration实现UDP服务器,就像这里描述的那样,但是当客户端在NAT之后运行时,它们将永远不会收到来自服务器的响应。这是因为服务器应该从与UDP适配器端口相同的端口发送响应数据报(通过这里解释的NAT检查UDP)。 如何使用Spring Integration实现与NAT后客户端的正确UDP通信?