.版本 2
.程序集 程序集1
.程序集变量 缓冲区指针, 整数型
.程序集变量 缓冲区大小, 整数型
.程序集变量 粘包偏移, 整数型
.子程序 接收
.参数 到达数据, 整数型
.参数 到达长度, 整数型
.局部变量 所需长度, 整数型
.局部变量 剩余长度, 整数型
.循环判断首 ()
.如果真 (缓冲区指针 ≠ 0) ' 缓冲区不为空就要粘包
.如果真 (粘包偏移 < 4) ' 居然不足4字节?
剩余长度 = 取最小整数 (到达长度, 4 - 粘包偏移)
memmove (整数相加 (缓冲区指针, 粘包偏移), 到达数据, 剩余长度)
粘包偏移 = 粘包偏移 + 剩余长度
.如果真 (粘包偏移 < 4) ' 还是不足4字节?
跳出循环 () ' 那就等下次接收吧。
.如果真结束
到达数据 = 到达数据 + 剩余长度
到达长度 = 到达长度 - 剩余长度
.如果真结束
所需长度 = ntohl (指针到整数 (缓冲区指针))
.如果真 (所需长度 > 缓冲区大小)
缓冲区大小 = 所需长度
缓冲区指针 = realloc (缓冲区指针, 缓冲区大小) ' 重分配内存
.如果真结束
剩余长度 = 所需长度 - 粘包偏移
.如果真 (剩余长度 ≥ 0)
剩余长度 = 取最小整数 (到达长度, 剩余长度)
memmove (整数相加 (缓冲区指针, 粘包偏移), 到达数据, 剩余长度) ' 拷贝内存
粘包偏移 = 粘包偏移 + 剩余长度
.如果真 (粘包偏移 < 所需长度)
跳出循环 () ' 还不是一个完整包
.如果真结束
完整接收 (缓冲区指针, 所需长度)
到达数据 = 到达数据 + 剩余长度
到达长度 = 到达长度 - 剩余长度
.如果真结束
free (缓冲区指针) ' 释放内存
粘包偏移 = 0
缓冲区指针 = 0
.如果真结束
.判断循环首 (到达长度 > 0)
.如果 (到达长度 < 4)
所需长度 = 4
.否则
所需长度 = ntohl (指针到整数 (到达数据))
.如果结束
.如果 (所需长度 ≤ 4 或 所需长度 > 到达长度)
缓冲区大小 = 所需长度
缓冲区指针 = malloc (缓冲区大小) ' 分配内存
memmove (缓冲区指针, 到达数据, 到达长度) ' 拷贝内存
粘包偏移 = 到达长度
跳出循环 ()
.否则
完整接收 (到达数据, 所需长度) ' 是个完整包就不需要缓冲了
到达数据 = 到达数据 + 所需长度
到达长度 = 到达长度 - 所需长度
.如果结束
.判断循环尾 ()
.循环判断尾 (假)
.子程序 完整接收
.参数 数据指针, 整数型
.参数 数据长度, 整数型
' 这里收到的数据都是完整的