UdpClient.Send方法和UdpClient.Client.Send方法之间的区别

时间:2011-09-06 02:41:54

标签: c# networking udp hole-punching

我可以使用UdpClient.Send(字节数组)或UdpClient.Client.Send(stream)方法在整个udp协议中发送数据。两种方法都有效。唯一的区别是,在一个方法上,我传递一个字节数组,另一个方法是传递一个流。

快速示例:

UdpClient udpClient = new UdpClient(localEndPoint);
// I can eather send data as:
udpClient.Send(new byte[] { 0, 1, 2 }, 3);
udpClient.Client.Send(new byte[5]);

另外哪种方法可以确保我的数据到达目的地而不会丢失信息?我已经读过udp协议不能确保所有字节到达它的目的地,因此更适合流式传输视频,音频,但不能像我一样传输文件。我使用udp而不是tcp的原因是因为在恰好位于路由器后面的两个用户之间建立tcp连接非常复杂。我知道如果其中一个用户在其路由器上启用端口转发,则可能。我设法通过做所谓的udp打孔来发送数据。 udp punch holing使您可以在服务器的帮助下在路由器后面的两个用户之间建立连接。如果你谷歌它,你可以在这里解释如何在这里找到很多信息。无论如何我只是想让你知道为什么我使用udp而不是tcp。我现在不知道是否可以使用此协议发送文件,确保没有数据丢失。也许我必须创建一个算法。或者UdpClient.Client.Send方法可以确保接收数据,并且UdpClient.Send方法不能确保接收数据。

2 个答案:

答案 0 :(得分:1)

这两种方法没有区别,UdpClient是Socket的包装器。 UdpClient.Client只是让您直接访问UdpClient正在使用的Socket。他们最终都通过套接字发送数据。

两者都不保证会收到所有数据。 UDP不保证1.数据将被传送,2。如果传送它将按顺序传送。如果你需要这两个(并且不能使用TCP),你必须自己编写代码。

您可以使用的最简单的协议是为每个数据包添加一个序列。让服务器发送一个数据包并等待客户端收到它的响应,然后发送下一个数据包。序列很重要,因为如果客户端对服务器的响应丢失,客户端可能会从服务器收到两次相同的数据包。

您的序列号可以是文件大小的当前位置(以字节为单位) - 这就是TCP使用的。

我建议您阅读TCP协议,以便了解它用于处理可靠性的机制(记住TCP和UDP都建立在IP上 - TCP只是一个更强大的(和coplex)协议,因此您可以实现部件它自己)

答案 1 :(得分:1)

UDP不保证数据传送或它们的顺序。它只保证如果您成功收到数据包,数据包就完成了。您需要使用自己的实现使网络通信可靠。这两个功能应该没有任何区别。

UNIX Network Programming有一个关于这个主题的章节。 (22.5为UDP应用程序增加可靠性)。您还可以查看支持NAT遍历功能(使用STUN或中继)的libginble和通信可靠性。

这篇文章Reliability and Flow Control也可能有助于您了解实现它的一种可能方法。祝你好运!