我正在编写一个基于UDP的客户端服务器,并且已经获得了大部分代码,但我对UDP服务器如何将响应发送回UDP客户机感到困惑,这是我到目前为止的理解:
我的困惑是,在服务器端,有一个套接字绑定到UDP端口并“持续”侦听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字将请求发送到UDP服务器,然后,我认为它不能保持该端口挂起供UDP服务器响应,如果该端口关闭,那么客户机将如何接收响应。
当然,UDP服务器的响应将到达UDP客户端,因为IP地址在那里,但是一旦响应到达客户端的UDP模块,即使有端口,UDP模块如何将其发送给最初发送请求的客户端,因为它会关闭绑定到该端口的套接字?还是不会呢?
我正在寻找明确描述UDP通信的答案(我不想将它与TCP进行对比或解释TCP,因为我已经对TCP有了公平的理解),特别是响应将如何到达UDP客户端。
发布于 2016-12-18 21:54:34
我的困惑是,在服务器端,有一个套接字绑定到UDP端口并“持续”侦听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字将请求发送到UDP服务器,然后,我认为它不能保持该端口挂起供UDP服务器响应,如果该端口关闭,那么客户机将如何接收响应。
我同意。这就是你的困惑。你认为为什么不能打开插座并在上面做个接收?它可以。
当然,UDP服务器的响应将到达UDP客户端,因为IP地址在那里,但是一旦响应到达客户端的UDP模块,即使有端口,UDP模块如何将其发送给最初发送请求的客户端,因为它会关闭绑定到该端口的套接字?
为什么?
还是不会呢?
不。
客户:
recvfrom()或朋友以接收响应。当然,如果客户端对响应不感兴趣,它可以关闭套接字,但这不是正常情况。
我正在寻找明确描述UDP通信的答案(我不想将它与TCP进行对比或解释TCP,因为我已经对TCP有了公平的理解),特别是响应将如何到达UDP客户端。
所以不要用tcp标签来标记你的问题。
发布于 2020-09-10 09:55:04
是的,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 *)和&addrlen);服务器可以在sendto中使用该地址并将消息发送回收件人的地址。sendto(s,buf,strlen(buf),0,(struct sockaddr *)&remaddr,addrlen)
发布于 2019-03-07 18:22:29
客户端使用一些随机但唯一的源端口。服务器将响应发送回此唯一端口。服务器一次将不会从单个端口接收2个请求。服务器使用这个事实将响应映射到请求。只有在收到响应后,客户端才关闭此源端口/套接字。客户端可以在任何给定的时间点发送与可供其处理的端口数相同的请求。因为一旦收到响应,端口就会关闭,因此再次可用。
https://stackoverflow.com/questions/41212967
复制相似问题