0

我可以使用 UdpClient.Send(byte array) 或 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 打孔使您能够在服务器的帮助下在路由器后面的两个用户之间建立连接。在这里解释它是如何工作的将会很长,如果你用谷歌搜索它,你可以找到很多信息。不管怎样,我只是想让你知道我为什么使用 udp 而不是 tcp。我现在不知道是否可以使用此协议发送文件以确保没有数据丢失。也许我必须创建一个算法。或者 UdpClient.Client.Send 方法可能确保接收到数据,而 UdpClient.Send 方法不确保接收到数据。

4

2 回答 2

1

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

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

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

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

我建议您阅读 TCP 协议,以便了解它用于处理可靠性的机制(请记住 TCP 和 UDP 都是基于 IP 构建的 - TCP 只是一个更健壮(和复杂)的协议,因此您可以自己实现部分协议)

于 2011-09-06T04:01:30.163 回答
1

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

UNIX 网络编程有一个关于这个主题的章节。(22.5 增加 UDP 应用程序的可靠性)。你也可以看看libginble,它支持 NAT 穿越功能(带 STUN 或中继)和通信的可靠性。

本文Reliability and Flow Control也可以帮助您了解实现它的一种可能方法。祝你好运!

于 2011-09-06T04:10:29.220 回答