好的,据我所知,UDP的工作原理如下:
您有要发送的数据,您对UDP客户端说,嘿发送此数据。
UDP客户端然后说,确定为什么不,并将数据发送到选定的IP和端口。
如果它是通过或以正确的顺序是另一个故事,它已发送数据,你没有要求任何其他。
现在从这个角度来看,发送数据并组装它几乎是不可能的。 例如,我有一个1mb的图像,我发送它。
所以我把它分成60kb文件(或适合包装的东西),并从头到尾逐个发送。
所以从理论上讲,如果添加所有内容,图像应该完全相同。
但是,这个理论打破了,因为没有法律告诉包裹它是否可以比另一个更快或更慢地到达,所以只有你做了某种等待计时器才有可能,并希望最好的到达按照发送的顺序。
无论如何,我想要理解的是,为什么这样做:
void Sending(object sender, NAudio.Wave.WaveInEventArgs e)
{
if (connect == true && MuteMic.Checked == false)
{
udpSend.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);
}
}
Recieving:
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);
}
答案 0 :(得分:1)
你应该使用TCP。你写道:几乎不可能发送数据并组装它。例如,我有一个1mb的图像,我发送它。所以我发送它分为60kb文件(或适合包的东西),并从头到尾逐个发送它们。 ......但是,这个理论打破了,因为没有法律告诉包裹它是否可以比另一个更快或更慢地到达,所以只有你做一些等待计时器才有可能,并且希望最好的到达按照发送的顺序。这正是TCP的作用:确保按照发送的顺序接收数据流的所有部分,没有遗漏,重复或修改。如果您真的想要自己重新实现,那么您应该阅读RFC 793 - 它详细讨论了如何在不可靠的数据包服务上构建可靠的数据流。
但实际上,只需使用TCP。
答案 1 :(得分:0)
您遗漏了许多有用的详细信息,但根据所提出的理解程度,我会尝试以类似的级别回答:
你是绝对正确的,通常UDP协议不保证交付顺序甚至交付。您的本地主机将按照从发送应用程序接收数据包的顺序发送数据包(即您的请求消息的一部分),然后从那里发送数据包以决定您的请求是如何传递的。然而,在本地网络中(在原始请求者的少数几个跳跃中),实际上并没有很多方向的数据包。因此,他们可能只是排队,从不打嗝。
然而,在更大的互联网上,请求主机和目的地之间的每个路由器可能有多种路由选择。沿途的每个路由器都可以选择消息的部分的方向。假设所有路径都相等(它们不是)并且保证了2个主机之间每个网段的可靠性,它可能会看到与网络内相似的结果(增加延迟)。不幸的是,这些提出的条件都不能被认为是可靠的(互联网上的不同路径根据客户端和服务器的不同而有所不同,并且互联网上的任何一条路径都不应该被认为是可靠的(这就是为什么它是“网络”)。
这些当然基于我自己在网络支持和管理角色方面的一般观察。其他StackExchange网站的成员可能能够提供更好的反馈。