MSDN 中关于  EndReceive 的解释是:
    如果您使用的是面向连接的协议,则 EndReceive 方法将读取所有可用的数据,直到达到 BeginReceive 方法的 size 参数所指定的字节数为止。     如果我发送的数据小于 BeginReceive 方法中指定的 size ,   那么Socket 此时是怎么读取的?

解决方案 »

  1.   

    当SOCKET传送数据的时候,一般来说,你需要构建自己的消息体,比如,我的消息体是如下定义的:
    消息类型-消息长度-消息本身
    这样,你在取数据的时候,就可以取到很确切的消息长度,接收方根据这个长度去获取消息本身就行。
    如下代码段:
                      recv = _currentSocket.Receive(dataType, 0, 4, 0);
                    if (recv == 0)
                        throw new Exception("receive dataType broken.");
                    recv = _currentSocket.Receive(datasize, 0, 4, 0);
                    if (recv == 0)
                        throw new Exception("receive dataSize broken.");
                    int size = BitConverter.ToInt32(datasize, 0);
                    int dataleft = size;                byte[] data = null;
                    if (Encoding.ASCII.GetString(dataType, 0, recv) == "data")
                    {
                        data = new byte[size];
                        while (total < size)
                        {
                            recv = _currentSocket.Receive(data, total, dataleft, 0);
                            if (recv == 0)
                                throw new Exception("receive data broken.");
                            total += recv;
                            dataleft -= recv;
                        }
                        total = 0;
                        dataleft = 0;
                        _receivedData(_connectIndex, Encoding.ASCII.GetString(data));
                        Debug.Print("data = " + Encoding.ASCII.GetString(data));
                    }
    先获取dataType,再获取datasize,继而获取data本身,具体参考下面的博文本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luminji/archive/2008/12/25/3606072.aspx
      

  2.   

    EndReceive 方法将读取所有可用的数据,直到达到 BeginReceive 方法的 size 参数所指定的字节数为止说的是读取尽可能多的数据,如果没数据了或者到达那个字节数了,就返回
      

  3.   

    1楼中  “接收方根据这个长度去获取消息本身就行。”  服务器端在 EndReceive   之前不知道 消息的具体长度的,  在  EndReceive   方法之后当然可以按照你的方法处理。我是问Socket在调用EndReceive   时是怎么去读取数据的?
      

  4.   

    EndReceive时读完了数据或者读满了,都返回