Socket.Recive(buffer,0,size) 这个函数什么情况会返回?
我在服务端发一个较大的包,有时就会被拆成两个收到,就是说执行两次Recive的值加起来才是一个完整的数据。
但是有时候有正常,
这个Recive是收到什么标记还是什么时间就会结束返回?

解决方案 »

  1.   

    两种情况会返回:
    一、收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。
    二、发送方主动关闭Socket,此时Socket.Recive会取消阻塞状态,返回0字节接收,所以当收到0字节就只可能是对方主动关闭了Socket(除非有人无聊,真发生了0字节数据,这种情况没测试过)。
      

  2.   

    buffer,0,size,buffer返回数据,size返回实际接收的大小
      

  3.   

    这个方法Recive()只管接受数据,他无法确保本次接受的一定是完整的数据包
    必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。
      

  4.   


    但是问题显然是这样的,我服务端调用了一次Send(buffer),然后到客户端却拆成了两个buffer,两个buffer的包长加起来正好等于我发送的长度。也就是说,recive收到一半的时候返回了,为什么?
      

  5.   


    接受端有buffer缓存的,缓存有大小的这个方法Recive()只管接受数据,他无法确保本次接受的一定是完整的数据包
    必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。
      

  6.   


    收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。
    socket内部自己封装的东西,
      

  7.   

    而且不存在网络问题,因为我是本机发本机收。
    也没丢包,收到的两部份数据 加起来就是我发送的数据。(数据包长十几K的样子)
    而且只有偶尔会这样,发送越快,接收越慢(线程sleep),这种情况就越频繁,
    谁能解答。。
      

  8.   

    数据过大C#中的Socket会自己去识别包内容,在接收完全之后返回你要的内容,如果没有接受完则不返回东西,省去了你自己做一个拆包拼包的过程。
      

  9.   

    你发送多少不代表系统就给你一次性打包发送了,TCP会自动拆包发送的,如果是UDP,则直接给你丢弃(罢工不发)。为什么呢,因为一个IP数据包最大只能1500字节,超过了路由器上就不认了。如果你定义一个小于1500字节的数组,每次发送例如1K的数据出去,接收方就不会被拆了。至于接收次数你定不了,但可以在你的数据包前添加后续数据大小的信息,告知接收方。
      

  10.   

    当你的IP和端口接收到数据的时候,buffer会有返回
    this.ip = ip;
    this.port = port;
    this.threadCount = threadCount;
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPAddress serverIp = IPAddress.Parse(this.ip);
    IPEndPoint iep = new IPEndPoint(serverIp, Convert.ToInt32(this.port));    //本地终结点
    socket.Bind(iep);//Socket类的一个重要函数, 绑定一个IP,
    socket.Listen(threadCount * 3);
    Byte[] byteMessage = new Byte[1024]; //存放消息的字节数组缓冲区, 注意数组表示方法,和C不同的.childSocket = socket.Accept();     //Socket类的一个重要的方法:Accept, 该方法接受来自外面的Socket连接请求, 并返回一个Socket套接字, 这个套接字就开始处理这一个client与Server之间的对话int intReceive = childSocket.Receive(byteMessage); //接受client发送过来的数据保存到缓冲区.
    程序会停在最后一句,直到你的IP和端口接收到数据
                
      

  11.   

    大数据包, 拆成小数据包发送, 每个小数据包都是一个独立的, 有标记头的包. 要标记这个小数据包属于那个大的包, 要有系列. 包头还有标记一共有多少数据长度. 当接收到当前数据长度不够总长度, 那么继续等待, 当够了, 就可以拿到这些小的数据包, 安装系列, 吧每个小的数据包的包头去掉, 组合成一个大的数据包, 然后解码. 
    参考Mina的编码,解码协议的事例.