关于UDP服务器如何将响应发送回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客户端。

我的困惑是,在服务器端,有一个插座,该插座绑定到UDP端口,并且"连续"侦听任何UDP客户端请求,但是在客户端端不正确,UDP客户端将打开一个套接字来发送发送对UDP服务器的请求,然后就是这样,我认为它不能使该端口悬挂供UDP服务器响应,如果该端口关闭,则客户端将如何收到响应。

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

我的意思是说,udp服务器的响应将返回UDP客户端,因为IP地址存在,但是一旦该响应达到了客户端的UDP模块,即使有一个端口,但是UDP模块如何将其发送到该客户端最初发送请求的客户是因为它将关闭到该端口的插座?

为什么?

否则不会?

不是。

客户端:

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

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

我正在寻找清楚地描述UDP通信的答案(我对将其与TCP进行对比或解释TCP不感兴趣,因为我已经对TCP有公平的理解),尤其是该响应将如何恢复UDP客户端。/blockquote>

所以不要用TCP标签标记您的问题。

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

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

recvlen = recvfrom(s,buf,bufsize,0,(struct sockaddr *)

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

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

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

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

最新更新