我写了一个异步socket
server端发送了一条长度为2086的消息
client端beginreceive异步接收 有时候正常收到2086长度 大部分时候却被拆成了1388和698两条消息 这是为啥呢。。求帮助
补充一下 我用的是mac
我朋友用windows测试的时候一切正常不会拆消息。
public void BeginReceive()
{
m_socket.BeginReceive(m_recvBuff, 0, m_recvBuff.Length, SocketFlags.None, m_recvCb, this);
}
public void RecvCallback(IAsyncResult iar)
{
int len = m_socket.EndReceive(iar);
Debug.Log(len);
if (len > 0) {
byte[] msg = new byte[len];
Array.Copy(m_recvBuff, msg, len);
}
}
消息不再被拆分
1、你用的是异步处理,拆分也是正常的,没用过mac,但是socket原理是一样的。
2、不用过分担心拆分,重要的是你接收到数据后,要进行数据组合然后分析数据的。
正常现象,但凡基于stream开发(包括tcp,串口类通讯,写入硬盘文件等)人都应该明白一件事情,写入stream只是写到“缓冲区”,具体缓冲区到实际物理发送是驱动调度,所以你send buffer的过程是 讲buffer写到socket内存缓冲区,网卡驱动得到信号量通知中断,自己使用DMA技术去缓冲区读取数据,并按照TCP协议栈的窗口通讯要求去发送数据
接收过程是反向过程,先按照Tcp协议栈的窗口通讯要求接收一段数据,注意他是接收一段窗口数据,并不是指一个完整的业务逻辑封包。接收数据以后通过DMA技术写到接收专用内存缓冲区,发送信号量中断通知上层应用去接收数据,上传应用收到信号中断处理缓冲区数据(注意,此时缓冲区里也许是一个窗口的数据,也许是多个窗口的数据,但是无论是多少个窗口数据,也并不代表他就是一条完整的业务逻辑数据)
tcp移动窗口说明
https://blog.csdn.net/qq_40276626/article/details/120230202
所以任何当使用Stream类进行通讯的人,请了解“封包的粘包,拆包”的处理过程,此过程无关他是windows还是mac,你说你的朋友如何,我只能说“程序员凭逻辑,不凭运气,你要是运气好,也能回回2086,比如那个园子的sleep---收快了么,那就是sleep一下收慢点,运气好每次睡醒的时候就刚好1条,所以我们说这是靠巧合和运气编程,而不是靠逻辑编程”