2011-09-06 187 views
0

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

简单的例子:

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 punch holing来发送数据。 udp punch holing使您能够借助服务器在路由器后面的两个用户之间建立连接。如果你在谷歌这里能够找到很多信息,那么解释在这里的工作将会很长。反正我只是想让你知道我为什么用udp代替tcp。我现在不能用这个协议发送文件,确保没有数据丢失。也许我必须创建一个算法。或者UdpClient.Client.Send方法可以确保数据将被接收,并且UdpClient.Send方法不能确保数据将被接收。

回答

1

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

UNIX Network Programming有关于此主题的章节。 (22.5为UDP应用程序添加可靠性)。你也可以看看libginble它支持NAT穿越功能(STUN或中继)和通信的可靠性。

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

1

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

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

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

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

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

+0

我希望我可以使用tcp。我无法在nat后面的两个用户之间建立tcp连接。通过在服务器的帮助下完成udp打孔操作,我已经能够通过udp完成这项工作。也许我可以用ftp等其他协议来打孔。我的意思是,我想用udp来做这件事的原因是它是唯一的协议,它使我能够在nat后面连接两个对等端,而无需在路由器上启用端口转发 –

相关问题