为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2018-12-07 02:12:45
请问在.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中的数据还未达到指定的数量,接收方会怎么做? 在接收方缓冲已满的情况下,发送方会自动停止发送数据吗?还是会继续发送? 请知道的朋友不吝赐教,不胜感激!
查看完整描述

4 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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

查看完整回答
反对 回复 2019-01-21
?
富国沪深

TA贡献1790条经验 获得超9个赞

不需要分两次发送吧。receive函数的返回值就是你读取到的字节数,所以在消息内容里加四个字节包含消息长度,和receive的返回值比较就知道了是不是接收正确。

不过我觉得溢出应该是你使用了长连接,循环发送导致的。

socket我也就是前端时间搞过,没有深入。说的不对还请包含

查看完整回答
反对 回复 2019-01-21
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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

TA贡献1824条经验 获得超5个赞

可以给每张图片发送开始和结束的时候加上起始码和结束码试试
查看完整回答
反对 回复 2019-01-21
  • 4 回答
  • 0 关注
  • 448 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信