Sockets 为什么UDP服务器中只有一个套接字?

Sockets 为什么UDP服务器中只有一个套接字?,sockets,tcp,udp,Sockets,Tcp,Udp,我正在准备考试,发现了这个问题: 典型的UDP服务器可以使用单个套接字实现。解释为什么对于TCP驱动的服务器,我发现创建了两个套接字—一个是所有客户端都接近服务器的套接字,另一个是每个客户端的特定套接字,用于服务器和客户端之间的进一步通信 这(据我理解)是由并发问题(希望不要在联系人地址上与单个客户机进行过多通信)驱动的。我知道UDP是无连接的,但无法在我的脑海中加以说明。我发现,如果服务器是UDP驱动的,那么它可以执行单个操作(将内容重复地通过/传输到套接字/端口),然后可以被多个客户端侦听。

我正在准备考试,发现了这个问题:

典型的UDP服务器可以使用单个套接字实现。解释为什么对于TCP驱动的服务器,我发现创建了两个套接字—一个是所有客户端都接近服务器的套接字,另一个是每个客户端的特定套接字,用于服务器和客户端之间的进一步通信


这(据我理解)是由并发问题(希望不要在联系人地址上与单个客户机进行过多通信)驱动的。我知道UDP是无连接的,但无法在我的脑海中加以说明。我发现,如果服务器是UDP驱动的,那么它可以执行单个操作(将内容重复地通过/传输到套接字/端口),然后可以被多个客户端侦听。如果一个服务器可以对两个任务做出反应——get和put。客户端如何在不创建连接的情况下发出指令?客户机(在我看来)需要在一个已知的端口上发送get请求,并在同一个端口上获取反馈。这将阻止服务器同时与多个客户端通信。那么,创建第二个套接字以在双方之间进行通信是否更好,这样服务器和其他客户端之间的潜在通信就不会受到阻碍?(与tcp的情况相同)

对于tcp,没有选择,套接字API将一个tcp连接映射到一个套接字,该套接字位于两个端点之间

对于UDP,socket API允许一个套接字从多个端点接收,并发送到多个端点-因此许多服务器只使用一个套接字,因为不需要更多

在某些情况下,协议是简单的请求和应答。无需为此创建另一个套接字—只需记下源地址,然后将答复发送到那里—因此,有些服务器就是这样做的

对于其他人来说,该协议可能需要更长时间的数据交换,这样创建一个新的套接字就更方便了,所以有些服务器会这样做

这将阻止服务器与多个服务器通信 同时也是客户

不一定。如果服务器CPU忙于执行指令,则无论是否在同一套接字上处理多个客户端,它都无法为其他任何人提供服务。如果服务器执行阻塞调用(例如,数据库查询),或者您希望利用多个内核,则可以在多个线程中处理,或者使用线程池模式,即使只有一个套接字。服务器只需要跟踪每个数据包的源IP地址和端口,以便知道将应答发送到哪里

但是,如果特定协议/应用程序使用多个套接字更有意义,例如,每个客户端使用一个套接字-这样做没有错,通常的方法是:

  • 客户机在其已知端口上向服务器发送数据包
  • 服务器记录客户端数据包的源端口
  • 服务器创建一个新套接字,并在该套接字上发送回复
  • 客户端注意到应答的源端口
  • 客户端使用该端口与服务器进行进一步通信,而不是使用其众所周知的端口
客户机(在我看来)需要在一个已知的端口上发送get请求,并在同一个端口上获取反馈。这将阻止服务器同时与多个客户端通信

不,不会的。这是虚构的

那么,创建第二个套接字以在双方之间进行通信是否更好,这样服务器和其他客户端之间的潜在通信就不会受到阻碍?(与tcp的情况相同)

“服务器和其他客户端之间的潜在通信”无论如何都不会“受阻”


创建第二个套接字没有任何优势,API也没有强制要求这样做。您希望客户端发送到同一远程端口并从同一远程端口接收的正确愿望与您希望在服务器上创建第二个套接字的愿望相矛盾。第二个套接字将具有不同的端口。

此响应的第二部分不只是描述UDP服务器如何实现TCP吗??如果服务器为每个客户端创建一个新的套接字,这不是一个连接,即TCP吗??(显然这不是整个协议,但希望我的问题有意义)不。。tcp有很多优点——重传、面向流、流控制等。