Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP数据包丢失_C#_Sockets_Tcp - Fatal编程技术网

C# TCP数据包丢失

C# TCP数据包丢失,c#,sockets,tcp,C#,Sockets,Tcp,我将视频流从一个c#应用程序传输到另一个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)

我将视频流从一个c#应用程序传输到另一个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);
//接收机
插座;
IPAddress ipAd=IPAddress.Parse(“127.0.0.1”);
var ip=IPAddress.Any;
myList=新的TcpListener(ipAd,8001);
myList.Start();
s=myList.AcceptSocket();
while(运行线程)
{
int buffertype=-1;MemoryStream img=null;int size=0;int
pos=0;
尝试
{
//框架长度
字节[]长度b=新字节[32];
int k=s.Receive(长度,SocketFlags.None);
大小=位转换器.ToInt32(长度,0);
pos=0;
字节[]长度帧=新字节[大小];
//数据分块
int chunksize=100;
while(pos
如何确保收到所有包裹的安全?

发件人:

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字节的缓冲区,其中包括beggining中的
长度
字段,其余部分是编码视频流的一部分。然后你扔掉那部分。听起来不太好。

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