有关c# socket client端异步接受的问题!

问题遇到的现象和发生背景

我写了一个异步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条,所以我们说这是靠巧合和运气编程,而不是靠逻辑编程”