【发布时间】: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(而且它看起来过大),也不能保证你在循环之外的“最终”读取会得到 所有剩余字节。 -
谢谢,我认为这些小数据包可以在一个电话中收到,但事实并非如此。我不能接受它作为正确答案,因为它是评论。