UDP中的通信协议

时间:2010-05-04 05:53:44

标签: sockets client udp protocols

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

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

所以我想问这种是一种已知的协议/握手,还是只对这台服务器有用?

PS:所有上述通信都在C#中的udp套接字中 PS:与上一个问题相关:About C# UDP Sockets

由于

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

服务器有效地监听“众所周知的端口”,然后将后续通信切换到每个客户端的专用端口。要求客户端发送到端口+ 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然后套接字在与您的整个通信期间保持不变,这可以使数据与套接字关联更容易和更有效(这样他们可以避免任何查找或锁定来处理每个数据报)。无论如何,足够的(见here,如果你想知道为什么这样做)。

从您作为客户端的角度来看(我假设这里是异步套接字),您需要先Bind()本地套接字(只需使用INADDR_ANY0即可操作系统为您选择端口)然后在套接字上发出RecvFrom()(因此在您向此套接字上的服务器发送数据并在发出recv之前将数据发回给您之间没有竞争)。然后向服务器的“众所周知的端口”发出SendTo()。然后,服务器将向您发回一些数据,RecvFrom()将返回服务器发送给您的数据和地址。然后,您可以获取该地址,将一个地址添加到端口,将该地址存储起来,然后将问题SendTo()存储到该新发送地址,同时继续发出RecvFrom() s以读取服务器的数据;或者您可以使用Connect()做一些聪明的事情,将套接字的远端绑定到服务器的“发送到地址”,然后再使用Write()RecvFrom()