我已经用谷歌搜索并搜索了 stackoverflow,但我找不到与我的问题相关的任何内容。
首先,让我简单描述一下场景。
想象一台摄像机通过 UDP 通过网络发送所有时间片段(从现在起我将称它们为“块”)。使用 UDP 是一种约束,我无法改变它,所以请不要回答“你为什么不使用 TCP?”,因为你知道我的意思:“因为我不能”。
另一方面,客户端接收 cam 发送的块。为了构建一种流控制,我在数据报的开头设置了三个字段(三个字节用于存储 JPEG 编号、块索引、块数量),然后是块本身。
到目前为止,我正在测试我自己的笔记本电脑中通过环回(127.0.0.1)发送和接收的双方,但问题是虽然相机(发件人)说它已经正确发送了所有块(我正在使用单个 JPEG 进行测试图片被分成 161 个块)客户端收到随机数量的块(有时接近 70 个,其他一些 100 个,并且有几次全部)。我尝试使用 rawcap (http://www.netresec.com/?page=RawCap) 嗅探我的环回,它检测到另一数量的 UDP“数据报”,不同于 161(应该发送),并且来自客户声称已收到的金额。
那么,发送语句是否可能没有按预期工作?还有其他建议继续调查吗?
这是我的发送方法。
private void startSendingData(IPEndPoint target)
{
fatherForm.writeMessage("START command received. Sending data to " + target.Address.ToString() + " port " + target.Port.ToString() + "...");
//Get chunks prepared
List<byte[]> listOfChunks = getChunksInAList(collectFiles());
List<uint> chunksSucces = new List<uint>();
List<uint> chunksFailed = new List<uint>();
byte[] stopDatagram = getStopDatagram();
//Initialise the socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Stopwatch sw = Stopwatch.StartNew();
foreach (byte[] chunk in listOfChunks)
{
if (s.SendTo(chunk, target) == chunk.Length)
chunksSucces.Add(BitConverter.ToUInt32(chunk,sizeof(uint)));
else
chunksFailed.Add(BitConverter.ToUInt32(chunk, sizeof(uint)));
}
Debug.WriteLine(chunksSucces.Count + " sent successfully");
//Tell the receiver not to continue receiving
s.SendTo(stopDatagram, target);
long ellapsedMs = sw.ElapsedMilliseconds;
sw.Stop();
writeTransmissionRate(listOfChunks.Count, ellapsedMs);
Debug.WriteLine(sw.ElapsedMilliseconds + "ms ellapsed");
sw.Stop();
s.Close();
}
输出是:
161 chunks to be sent
161 sent successfully
6ms ellapsed
Transmission rate: 37000.65KB/s 36.13MB/s
但另一方面,我在这个测试中只收到 22 个数据报。
先感谢您。