好吧,据我所知,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);
}
}
接收:
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);
}