UDP发送数据,我不知道;我不太明白
本文关键字:明白 我不知道 数据 UDP | 更新日期: 2023-09-27 18:28:15
据我所知,UDP的工作原理是这样的:
你有你想要发送的数据,你对UDP客户端说,嘿,发送这个数据。
UDP客户端然后说,确定为什么不,并将数据发送到选定的IP和端口。
如果它通过了,或者按照正确的顺序是另一回事,它已经发送了数据,你没有要求其他任何东西。
现在,从这个角度来看,发送数据和组装数据几乎是不可能的。例如,我有一个1mb的图像,我发送它。
所以我把它分成60kb的文件(或者一些适合包的文件),然后从第一个到最后一个一个地发送。
所以从理论上讲,如果加上所有的get,图像应该完全相同。
但是,这一理论被打破了,因为没有法律规定告诉包裹的到达速度是快还是慢,所以只有当你制作某种等待计时器,并希望包裹按照发送顺序到达时,这才是可能的。
无论如何,我想了解的是,为什么这个工作:
void Sending(object sender, NAudio.Wave.WaveInEventArgs e)
{
if (connect == true && MuteMic.Checked == false)
{
udpSend.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);
}
}
接收:
while (connect == true)
{
byte[] byteData = udpReceive.Receive(ref remoteEP);
waveProvider.AddSamples(byteData, 0, byteData.Length);
}
所以这基本上是,它通过udp发送音频缓冲区。
接收par只是将接收到的udp数据添加到缓冲区中并播放
现在,这是有效的。
我想知道。。为什么?
这是怎么回事,为什么数据以正确的顺序发送并添加,从而显示为恒定的音频流?
因为如果我用一个图像来做这个,我可能会得到所有的数据。
但它们可能是按随机顺序排列的,我只能通过标记包裹之类的东西来解决这个问题。然后根本没有理由,TCP接管了它。
所以,如果有人能解释一下,我就是不明白
下面是一个发送图像时的代码示例,它很有效。但是,如果不发送整个字节数组,意味着图像的某个部分已损坏,则它似乎会更好地工作(不确定原因,可能与字节数组的大小有关)。
发送:
using (var udpcap = new UdpClient(0))
{
udpcap.Client.SendBufferSize *= 16;
bsize = ms.Length;
var buff = new byte[7000];
int c = 0;
int size = 7000;
for (int i = 0; i < ms.Length; i += size)
{
c = Math.Min(size, (int)ms.Length - i);
Array.Copy(ms.GetBuffer(), i, buff, 0, c);
udpcap.Send(buff, c, adress.Address.ToString(), 1700);
}
接收:
using (var udpcap = new UdpClient(1700))
{
udpcap.Client.SendBufferSize *= 16;
var databyte = new byte[1619200];
int i = 0;
for (int q = 0; q < 11; ++q)
{
byte[] data = udpcap.Receive(ref adress);
Array.Copy(data, 0, databyte, i, data.Length);
i += data.Length;
}
var newImage = Image.FromStream(new MemoryStream(databyte));
gmp.DrawImage(newImage,0,0);
}
您应该使用TCP你写道:几乎不可能发送数据并对其进行汇编。例如,我有一个1mb的图像,我发送它。所以我发送将其分割成60kb的文件(或适合包的东西),并从第一个到最后一个逐个发送。。。但是,这一理论被打破了,因为没有法律规定告诉包裹的到达速度是快还是慢,所以只有当你制作某种等待计时器,并希望包裹按照发送顺序到达时,这才是可能的的想自己重新实现它,您应该阅读RFC 793——它详细介绍了如何在不可靠的数据包服务上构建可靠的数据流。
但实际上,只需使用TCP。
您的问题中遗漏了许多有用的细节,但根据所提供的理解水平,我将尝试以类似的水平回答:
你是绝对正确的,一般来说,UDP协议不能保证交货顺序,甚至根本不能保证交货。您的本地主机将按照从发送应用程序接收数据包的顺序发送数据包(即请求消息的一部分),然后由网络组件决定如何发送您的请求。然而,在本地网络中(在原始请求者的几跳内),数据包并没有太多的去向。因此,他们很可能只是排队,永远不会打嗝。
然而,在更大的互联网上,每个路由器在请求主机和目的地之间可能有各种各样的路由选择。沿途的每个路由器都可以选择消息的部分的方向。假设所有路径都是相等的(事实并非如此),并且保证了2台主机之间每个网段的可靠性,则可能会看到与网络内类似的结果(增加延迟)。不幸的是,这两种条件都不能被认为是可靠的(互联网上的不同路径根据客户端和服务器的不同而表现不同,互联网上的任何一条路径都不应该被认为是可信的(这就是为什么它是一个"网")。
当然,这些都是基于我自己在网络支持和管理角色方面的经验的一般观察。其他StackExchange站点的成员可能能够提供更好的反馈。