TCP无保护消息边界的解决
最近在看《Visual C#网络编程技术与实践》
看到第2章
2.3 TCP无保护消息边界
2.3.2采用变长的消息 这1小节时有些代码没看明白
------
TCP无保护消息边界的解决
针对这个问题,一般有3种解决方案:
(1)发送固定长度的消息
(2)把消息的尺寸与消息一块发送
(3)使用特殊标记来区分消息间隔
------
(2)、消息长度与消息一同发送
我们可以这样做:通过使用消息的整形数值来表示消息的实际大小,所以要把整形数转换为字节类型。下面是发送变长消息的SendMessage方法。具体代码如下:
下面是接收变长消息的ReciveVarMessage方法。代码如下:
谁能详细的解释下接收的函数啊
看到第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;
}
谁能详细的解释下接收的函数啊
...全文
相关推荐
TCP 数据粘连分析及解决文档
这种现象的根本原因在于TCP协议的流式传输特性,它没有保护消息边界的机制,而将数据视为一个连续的数据流。1.
c# socket Server/Client 解决消息边界问题
**解决消息边界**:常见的解决方案包括固定长度消息、消息头包含消息长度、使用特定分隔符等。
tcp 粘包 拆包解决思路以代码
这个DEMO可以帮助理解TCP粘包拆包的解决思路,并提供了实践代码实现,有助于深入理解网络编程中遇到的这类问题。
Tcp通讯例子之消息封装
在TCP通讯中,消息的封装至关重要,尤其是当传输大对象时。TCP不处理消息边界,它提供的是无边界的字节流。因此,应用程序需要自己定义消息格式,以区分不同的消息。
Tcp通讯,客户端监听,server发消息client接收消息
至此,TCP连接建立完成。**二、服务器发送消息**在连接建立后,服务器可以开始向客户端发送消息。


