许多小时后,我发现给定的udp服务器需要以下步骤才能成功地进行通信:
1-在给定端口上发送“开始消息”
2-等待从任何端口的服务器接收
3-然后专用于您向服务器发送进一步数据的端口等于您在服务器上接收到的端口+1。
因此,我想问的是,这类协议是否是已知的协议/握手,还是只对此服务器??特殊。
PS:以上所有通信都在C#中的udp套接字中。
PS:与前一个问题相关:关于C# UDP套接字
谢谢
发布于 2010-05-04 06:13:24
UDP没有特殊的“握手”--每个UDP服务,如果需要的话,都指定自己的。但是,通常情况下,服务器并不期望客户机能够同时侦听其所有端口。如果您的意思是客户端希望从服务器上的任何端口发送消息到客户机发送开始消息的端口,那么这就更有意义了--并且非常接近TFTP的工作方式。(到目前为止,我看到的唯一不同是TFTP不执行"+ 1“。)
发布于 2010-05-04 07:13:25
服务器实际上是在监听“众所周知的端口”,然后将随后的通信切换到每个客户端的专用端口。要求客户端发送到端口+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服务器可能会这样做,这样它就不必根据客户端的地址/端口对入站客户端数据进行反复用。这样做更有效率(通常),也有一些优势,这取决于服务器的设计,因为服务器上有一个“专用”套接字,这意味着如果他们做的是重叠的I/O,那么套接字在与您的整个通信期间保持不变,这可以使数据与套接字更容易和更有效地关联(这样,它们可能避免任何查找或锁定处理每个数据报)。无论如何,够了(请参阅这里,如果您想知道为什么I这样做的话)。
从客户端的角度来看(我在这里假设异步套接字),您需要首先使用Bind()本地套接字(只需使用INADDR_ANY和0来允许操作系统为您选择端口),然后在套接字上发出RecvFrom() (因此,在发出recv之前,向该套接字上的服务器发送数据与将数据发回给您之间没有任何争用)。然后向服务器的“知名端口”发出一个SendTo()。然后,服务器将向您发回一些数据,您的RecvFrom()将返回服务器发送给您的数据和地址。然后,您可以获取该地址,向端口添加一个地址,存储该地址,从那时起发出SendTo()到那个新的发送地址,同时继续发出RecvFrom()以读取服务器的数据;或者您可以使用Connect()巧妙地将套接字的远程端绑定到服务器的“发送地址”,然后只需从那时起使用Write()和RecvFrom()。
https://stackoverflow.com/questions/2763096
复制相似问题