UDP套接字协议

时间:2011-02-21 23:04:52

标签: sockets network-programming udp

我正在设计一个UDP协议,只需要一个客户端和一个服务器,但我希望能够在同一台机器上支持多个客户端,甚至更好的多个客户端。

当客户端连接到服务器时,服务器会接收客户端的IP和传出UDP端口以及消息。但是,我没有成功通过该传出端口响应客户端。

我想我的问题是,如果要以双向方式发送数据(客户端到服务器,服务器返回客户端),那么实现这样的事情的正确方法是什么。在我看来,单个套接字是不够的,客户端和服务器都必须同时保持“监听”套接字和单独的“发送”套接字。如果收件人更改,还必须重复打开和关闭发送套接字。也许服务器每个连接的客户端都有一个发送套接字。

由于传出的UDP端口似乎不是实际有用的值,因此我必须跟踪协议中的端口,以便特定计算机上的两个客户端可以计算出各自的侦听端口,到服务器,服务器只需在明确告知它们是什么后,就会将数据发送到适当的端口。

编辑:好的,我不想要“使用TCP”答案,即使它可能是一个有效的答案。我将稍微描述一下应用程序:我通过互联网实时远程控制硬件。我希望尽可能减少延迟,TCP的数据完整性和有序保证根本无济于事。我只需要一个熟悉基于数据报的网络代码的人来帮助我确保我的方法是理智的。

2 个答案:

答案 0 :(得分:2)

由于UDP是无状态且有损的,您确定它是正确的选择吗?您选择UDP over TCP是否有原因?

编辑:What do you use when you need reliable UDP?如果您还没有看到它可能值得一读,那里讨论了各种基于UDP的选项,如果你认为你肯定需要关注它,我认为这些选项可能会对你有用UDP路由。

答案 1 :(得分:1)

你的第一直觉是正确的。使用UDP,您只需要服务器端的单个套接字和客户端的单个套接字。双方都使用该套接字进行发送和接收,在服务器的情况下,它可以使用该单个套接字与多个对等体进行通信。

服务器应保存recvfrom()呼叫提供的客户端地址,并在回复该客户端时将其用作sendto()呼叫中的目的地。

客户端应检查recvfrom()调用提供的地址是否与预期从(或connect()套接字接收响应的服务器匹配,这将过滤掉伪造的回复)。

如果此方法无效,那么您的代码中存在错误 - 但 是正确的方法。