TCP无保护消息边界的解决

I_was_a_novice I_was_a_novice 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在看《Visual C#网络编程技术与实践》
看到第2章
2.3 TCP无保护消息边界
2.3.2采用变长的消息 这1小节时有些代码没看明白
------
TCP无保护消息边界的解决
针对这个问题,一般有3种解决方案:
(1)发送固定长度的消息
(2)把消息的尺寸与消息一块发送
(3)使用特殊标记来区分消息间隔
------
(2)、消息长度与消息一同发送
我们可以这样做:通过使用消息的整形数值来表示消息的实际大小,所以要把整形数转换为字节类型。下面是发送变长消息的SendMessage方法。具体代码如下:

private static int SendMessage(Socket s, byte[] msg)
{
int offset = 0;
int sent;
int size = msg.Length;
int dataleft = size;
byte[] msgsize = new byte[2];
//将消息尺寸从整形转换成可以发送的字节型
msgsize = BitConverter.GetBytes(size);

//发送消息的长度信息
sent = s.Send(size);//书上是这样写的,我想应该是sent = s.Send(msgsize);吧
while (dataleft > 0)
{
sent = s.Send(msg, offset, dataleft, SocketFlags.None);
//设置偏移量
offset += sent;
dataleft -= sent;
}
return offset;
}

下面是接收变长消息的ReciveVarMessage方法。代码如下:

private byte[] ReciveVarMessage(Socket s)
{

int offset = 0;
int recv;

//问题开始
//中间的部分没有明白什么意思
//不应该是先接收消息长度消息,将长度消息转换为int类型,根据长度接收发送的消息么
byte[] msgsize = new byte[2];

//将字节数组的消息长度信息转换为整形
int size = BitConverter.ToInt16(msgsize);
int dataleft = size;
byte[] msg = new byte[size];

//接收2个字节大小的长度信息
recv = s.Receive(msgsize, 0, 2, 0);
//问题结束

while (dataleft > 0)
{
//接收数据
recv = s.Receive(msg, offset, dataleft, 0);
if (recv == 0)
{
break;
}
offset += recv;
dataleft -= recv;
}
return msg;
}

谁能详细的解释下接收的函数啊
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
I_was_a_novice
C# 111,128 成员 642,536 内容