在localhost上测试UDP

时间:2013-09-03 05:25:53

标签: c# sockets testing networking udp

我目前正在尝试制作一款在线视频游戏,目前使用TCP发送数据包。我想使用UDP,但我对UDP非常新,我遇到了一些问题。

当我在同一台计算机(localhost)上测试我的服务器/客户端时,数据包似乎互相干扰。

例如,如果客户端向服务器发送数据包(UDP,127.0.0.1:1338),则客户端最终收到数据包,因为客户端也在端口1338上侦听来自127.0.0.1的数据包。当我尝试测试2个客户端和1个服务器时,客户端可能会发送出适用于服务器的数据包,但是被其他客户端接收。

如何在localhost上测试UDP,因为所有数据包都是从127.0.0.1:1338接收/发送的?我是否需要在数据包中实现某种层,以区分数据包是用于服务器还是特定客户端?

3 个答案:

答案 0 :(得分:4)

只有您的服务器应该侦听定义的端口号(1338)。每个客户端都应选择一个空闲端口号,并向服务器发送此端口号。服务器必须存储客户端信息,然后将数据包发送到此客户端列表中的客户端。

当客户端关闭时,客户端还应该发送一个goodby数据包,以便在服务器端知道哪些客户端仍然可用,哪些客户端不再参与。

您还应该在此客户列表中实施某种内务管理。例如,存储来自客户端的最后一个接收到的数据包的时间戳,并从列表中删除一段时间内未发送数据的客户端(崩溃的客户端,丢失的连接...)。

答案 1 :(得分:3)

附加层无济于事 - 因为服务器可能永远不会真正获取数据包。

使服务器和客户端上的端口可配置。这样,您可以在同一台计算机上使用不同的端口进行测试,并在进入生产时进行更改。请记住,您需要在客户端和服务器中配置两个端口。无论如何,这是一个很好的做法。

您还有另一个问题 - 多个客户端驻留在同一台计算机上并侦听同一端口。您可以为每个客户端提供一个随机端口(客户端随机选择一个端口,然后通知服务器)。或者您可以尝试绑定到不同的IP地址(一个将使用127.0.0.1,另一个将使用PC的真实IP),但它不可扩展。

答案 2 :(得分:0)

如果要在局域网设置中使用此功能,则可以始终根据发件人的地址过滤收到的数据包 - UDP的recvmsg()允许您检索发件人的地址和端口号。如果您要在WAN设置中使用它,那么除非您尝试进行多播,否则这可能不会成为问题。而且,即使使用多播,也不会将重复数据包发送回接收方。您可以使用IP_MULTICAST_LOOP禁用此选项。