请问在.Net的Socket中,通信双方数据传输的机制是怎么样的? 我需要在发送方不断地发送图像,接收方不断地地接收图片。发送方发送每张图片前,先发送图片的大小DataSize。接收方接收时先接收四字节,并转成一个整型变量,即图片的大小DataSize,然后再根据DataSize设置接收缓存的大小,接着再接收图片。
接收方代码如下:
void receive()
{
byte[] tmp = new byte[4];
//接收图片大小
sClient.Receive(tmp, 0, 4, 0);
DataSize = BitConverter.ToInt32(tmp, 0);
sClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, DataSize);//设置接收缓存
buffer = new byte[DataSize];
sClient.Receive(buffer, 0, DataSize, 0); //接收图片
ms = new MemoryStream(buffer);
bmp = new Bitmap(ms);
pictureBox1.Image = bmp;//显示图片
theThread = new Thread(new ThreadStart(receive));
theThread.Start();//继续接收下一张图片
return;
}
发送代码如下:
for (;;)
{ int DataSize;
//准备数据
ms = new MemoryStream();
SendImage[index].Save(ms, ImageFormat.Bmp);
bytData = ms.ToArray();
DataSize = bytData.Length;
byte[] SizeBuff = BitConverter.GetBytes(DataSize);
sendSocket.Send(SizeBuff, 0, SizeBuff.Length, 0);//发送图片大小
sendSocket.BeginSend(bytData, 0,DataSize, 0, new AsyncCallback(SendCallback), sendSocket); //发送图片
SendDone.WaitOne();
}
回调函数如下:
private void SendCallback(IAsyncResult ar)
{
try
{
Socket sendSocket = (Socket)ar.AsyncState;
sendSocket.EndSend(ar);
SendDone.Set();
}
catch (System.Exception e)
{
MessageBox.Show("error3:" + e.Message + "\n" + e.Source);
}
}
实验过程中总是会报“算术运算导致溢出”,经变量监视发现接收到的DataSize会出现负值或者超大的数,从而导致溢出。但DataSize是发送端传送过来的图片大小,不可能出现负数或超大的数。我想肯定是传送和接收的过程中出现的错误。但本人对Socket编程实在不熟,所以请教各位Socket传输的过程是怎么样的?尤其是以下问题请各位解答:
发送方发送的数据在接收方未接收时都存放在哪的(我知道有sendBuffer,但实验中貌似在接收方接收之前,发送方可以连续发送好几个sendBuffer大小的数据)? 另外,接收方用receive接收指定大小的数据时,如果receiveBuffer中的数据还未达到指定的数量,接收方会怎么做? 在接收方缓冲已满的情况下,发送方会自动停止发送数据吗?还是会继续发送?
请知道的朋友不吝赐教,不胜感激!
holdtom
富国沪深
慕桂英3389331
沧海一幻觉