Socket.Receive的一个疑问

athlon128 2013-07-17 10:16:24
int count = socket.Receive(data, receiveLength, SocketFlags.None);
我在用上面的代码收数据的时候,如果对方发送的一帧数据少于我设定的receiveLength,也会接收完成
比如我设置receiveLength=20,而对方一帧只发了19个,代码会执行完,不应该是中断在这里的吗?
现在要怎么样才能满足我的需求,收满我需要的数据才继续往下?
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我卷福 2013-07-18
  • 打赏
  • 举报
回复
这个receiveLength的意义是指:你程序中接收数据缓冲区的大小 可以是1024 也可以是100 理论上可以是随意大小 并不是说只有缓冲区装满了 Receive才会返回 Receive什么时候返回不是你能控制的 如果数据量大 一般转满就返回 否则 没装满 Receive它也会返回 Tcp中是这样的
Nomerciness 2013-07-18
  • 打赏
  • 举报
回复
定义的Length 的意义是 从接收缓冲区一次拿取的最大的长度 如果一次发过来的长度大于你这个定义的长度则会抛异常 反之 如果小于你定义的长度的话 则会直接 Receive出来 注意 Receive 方法的返回值是 int 类型 表示 读出的有效位
  • 打赏
  • 举报
回复
自定义包结构,包头含包的编码和包体的大小,接收方接到数据先提取包头,然后判断剩下的是否够了包体大小,不够下次接受到的在补充不够的包里面去。确实麻烦些。。。
yangfan1981 2013-07-17
  • 打赏
  • 举报
回复

EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
                        int recvNum = m_udpListenSckt.ReceiveFrom(m_recvBuffer, ref remoteEP);

                        StateObject stateObj = new StateObject();
                        stateObj.remoteIpe = (IPEndPoint)remoteEP;
                        byte[] recvData = new byte[recvNum];
                        Array.Copy(m_recvBuffer, 0, recvData, 0, recvNum);
                        stateObj.buffer = recvData;


class StateObject
    {
        /// <summary>
        /// 远程服务器端点
        /// </summary>
        public IPEndPoint remoteIpe;
        public byte[] buffer;
    }

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧