猿问

关于.Net 中Socket运行机制的问题

请问在.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中的数据还未达到指定的数量,接收方会怎么做? 在接收方缓冲已满的情况下,发送方会自动停止发送数据吗?还是会继续发送?

请知道的朋友不吝赐教,不胜感激!

慕姐8265434
浏览 449回答 4
4回答

holdtom

应该是接受和发送不同步造成的

富国沪深

不需要分两次发送吧。receive函数的返回值就是你读取到的字节数,所以在消息内容里加四个字节包含消息长度,和receive的返回值比较就知道了是不是接收正确。 不过我觉得溢出应该是你使用了长连接,循环发送导致的。 socket我也就是前端时间搞过,没有深入。说的不对还请包含

慕桂英3389331

谢谢您的回答。但我考虑过,因为图片是连续发送的,所以必须先知道当前要接收的图片的大小,否则无法判断当前图片数据在哪里结束,这样连续两张图片就可能混在一起,使得无法得到完整的图片。

沧海一幻觉

可以给每张图片发送开始和结束的时候加上起始码和结束码试试
随时随地看视频慕课网APP
我要回答