首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UdpClient.Send法与UdpClient.Client.Send法的区别

UdpClient.Send法与UdpClient.Client.Send法的区别
EN

Stack Overflow用户
提问于 2011-09-06 10:41:54
回答 2查看 1.4K关注 0票数 0

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

快速示例:

代码语言:javascript
复制
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方法不确保数据将被接收。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-06 12:10:29

UDP不保证数据传送或它们的顺序。它只保证当你成功接收数据包时,数据包是完整的。您需要使用自己的实现来确保网络通信的可靠性。这两个函数应该没有任何区别。

UNIX Network Programming有一章介绍了这个主题。(22.5向UDP应用程序添加可靠性)。你也可以看看libginble,它支持NAT穿越功能(带有STUN或中继)和通信的可靠性。

本文Reliability and Flow Control可能还会帮助您理解实现它的一种可能方法。祝好运!

票数 1
EN

Stack Overflow用户

发布于 2011-09-06 12:01:30

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

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

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

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

我建议您阅读TCP协议,以便理解它用来处理可靠性的机制(请记住,TCP和UDP都是建立在IP之上的- TCP只是一个更健壮的(和复合的)协议,所以您可以自己实现它的一部分)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7314422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档