【问题标题】:TCP packets lostTCP 数据包丢失
【发布时间】:2018-08-28 20:27:20
【问题描述】:

我将视频流从一个 c# 应用程序传输到另一个。当我将帧速率设置为高时,一段时间后我无法获得正确的数据。

//Receiver
Socket s;
IPAddress ipAd = IPAddress.Parse("127.0.0.1");
var ip = IPAddress.Any;
myList = new TcpListener(ipAd, 8001);
myList.Start();
s = myList.AcceptSocket();

while (runThread)
{
        int buffertype = -1; MemoryStream img = null; int size = 0; int 
        pos = 0;
        try
        {
            // length of frame
            byte[] lengthb = new byte[32];
            int k = s.Receive(lengthb, SocketFlags.None);
            size = BitConverter.ToInt32(lengthb, 0);
            pos = 0;

            byte[] lengthframe = new byte[size];
            // chunking of data
            int chunksize = 100;
            while (pos < size - chunksize)
            {
                int rec = s.Receive(lengthframe, pos, chunksize, SocketFlags.None);
                pos += rec;
            }
            s.Receive(lengthframe, pos, size - pos, SocketFlags.None);

            img = new MemoryStream(lengthframe);
        }
 }

 // Other app: Sender (all is send)
 MemoryStream ms = new MemoryStream();
 img.CopyTo(ms);                
 byte[] ba = ms.ToArray();
 var buffer = BitConverter.GetBytes(ba.Length);
 stm.Write(buffer, 0, buffer.Length);
 stm.Write(ba, 0, ba.Length);

我怎样才能确保收到所有包裹?

【问题讨论】:

  • 你必须注意来自Receive的每一个返回值。你不能保证 lengthb 实际上得到 enough 字节来得到一个 int (而且它看起来过大),也不能保证你在循环之外的“最终”读取会得到 所有剩余字节。
  • 谢谢,我认为这些小数据包可以在一个电话中收到,但事实并非如此。我不能接受它作为正确答案,因为它是评论。

标签: c# sockets tcp


【解决方案1】:

发件人:

stm.Write(buffer, 0, buffer.Length);

接收者:

byte[] lengthb = new byte[32];
int k = s.Receive(lengthb, SocketFlags.None);

您确定 buffer.Length 类型是 32 字节长(256 位)吗?我想它有 4 或 8 个字节长。因此,您可能会收到 32 字节的缓冲区,其中包括开头的 length 字段,其余部分是编码视频流的一部分。然后你扔掉那部分。不好听。

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2020-03-17
    • 2018-09-04
    • 2021-09-11
    相关资源
    最近更新 更多