Sockets UDP协议中的通信协议

Sockets UDP协议中的通信协议,sockets,client,udp,protocols,Sockets,Client,Udp,Protocols,几个小时后,我发现给定的udp服务器需要以下步骤才能成功通信: 1-在给定端口上发送“启动消息” 2-等待从任何端口上的服务器接收 3-那么专用于您向服务器发送更多数据的端口等于您在服务器上收到的端口+1 所以我想问的是,这种协议/握手是已知的,还是仅限于此服务器?? PS:以上所有通信都是在C#中的udp套接字中进行的 注:与前一个问题相关: 谢谢UDP没有特殊的“握手”——每个UDP服务,如果需要的话,都会指定自己的握手。不过,通常情况下,服务器并不希望客户端能够同时侦听其所有端口。如果您

几个小时后,我发现给定的udp服务器需要以下步骤才能成功通信:

1-在给定端口上发送“启动消息”
2-等待从任何端口上的服务器接收
3-那么专用于您向服务器发送更多数据的端口等于您在服务器上收到的端口+1

所以我想问的是,这种协议/握手是已知的,还是仅限于此服务器??

PS:以上所有通信都是在C#
中的udp套接字中进行的 注:与前一个问题相关:


谢谢

UDP没有特殊的“握手”——每个UDP服务,如果需要的话,都会指定自己的握手。不过,通常情况下,服务器并不希望客户端能够同时侦听其所有端口。如果您的意思是客户机希望消息从服务器上的任何端口发送到客户机发送启动消息的端口,那么这就更有意义了——并且非常接近TFTP的工作方式。(到目前为止,我看到的唯一区别是TFTP不执行“+1”。

服务器实际上是在侦听“已知端口”,然后将后续通信切换到每个客户端的专用端口。要求客户端发送到端口+1有点奇怪

Client 192.168.0.1 - port 12121   ------------------------> Server 192.168.0.2 - port 5050
Client 192.168.0.1 - port 12121   <------------------------ Server 192.168.0.2 - port 23232
Client 192.168.0.1 - port 12121   ------------------------> Server 192.168.0.2 - port 23232 + 1
                                  <------------------------ Server 192.168.0.2 - port 23232
                                  ------------------------> Server 192.168.0.2 - port 23232 + 1
Client 192.168.0.1-端口12121------------------->Server 192.168.0.2-端口5050
客户端192.168.0.1-端口12121服务器192.168.0.2-端口23232+1
服务器192.168.0.2-端口23232+1
服务器这样做可能是为了不必基于客户端的地址/端口来解复用入站客户端数据。这样做效率更高一些(通常),而且也有一些优势,具体取决于服务器的设计,在服务器上,有一个“专用”套接字供您使用,这意味着如果他们正在进行重叠I/O,那么套接字在与您的整个通信期间都保持不变,这可以使数据与套接字关联变得更容易、更高效(这样,他们可能可以避免在处理每个数据报时进行任何查找或锁定)。无论如何,这已经够了(如果你想知道我为什么要那样做的话,请看)

从您作为客户端的角度来看(这里我假设为异步套接字),您需要首先
Bind()
本地套接字(只需使用
INADDR\u ANY
0
允许操作系统为您选择端口),然后在套接字上发出
RecvFrom()
(因此,在此套接字上向服务器发送数据与服务器在您发出recv之前向您发送数据之间没有竞争)。然后向服务器的“已知端口”发出
SendTo()
。然后服务器将向您发回一些数据和
RecvFrom()
将向您返回服务器发送给您的数据和地址。然后,您可以获取该地址,将其添加到端口,存储该地址,并从那时起将其发送到新的发送地址,同时继续发送
RecvFrom()
s用于读取服务器的数据;或者您可以使用
Connect()
巧妙地将套接字的远程端绑定到服务器的“发送地址”,然后简单地使用
Write()
RecvFrom()