(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析

问题:

zynq作为服务器,tcp建链后,接收来自发送端的大量数据时,不断进入回调函数accept_callback中,tcp的分包机制应将每包的p payload数据memcpy到全局变量处缓存,等接收全后跳出if(!p)进行处理。

现象:

流程中加入memcpy消耗时间太久,导致每包tcp接收的数据递增缓慢,长时间进不到结束分支if(!p)下,但是设置断点能进接收回调函数,没有达到tcp快速传输效果。

解决:

最终定位于mss配置问题

当前编译版本为vivado2017.4

1)--->进入mss配置内的lwip141协议栈

2)--->进入tcp_options选项

3)--->tcp_wnd default默认2048,但是定义是integer,为了提速就想当然改成65535,结果事与愿违,出现这个问题,后来改为2048恢复正常。

引申问题:

速度正常后,但是本地接收端对大包数据校验和不一致,发送端对16MB数据按字节累加做了校验和,接收端同样的计算方法,怀疑是tcp分包黏包了,或者是包接收错乱包。虽然长度一致,但是接收到大量数据后,检验收到的数据是否正确,校验和不对,就说明接收到的数据不对。

引申问题解决

问题依旧定位system.mss设置上,pubf_pool_bufsize 默认1700,改成4096,接收数据校验和正常!但是是否影响其他性能有待后续。

上位机Tcp 客户端,"发送按钮 "直接粘即可c#

private void TCP发送_Click(object sender, EventArgs e)

{

try

{

TcpClient tcpClient = new TcpClient();

tcpClient.Connect(IPAddress.Parse("192.168.1.1"), 5000);

复制代码
    NetworkStream NTWStream = tcpClient.GetStream();
    NTWStream.Write(g_ucSendBin, 0, (int)g_uiSendBinLength);

    NTWStream.Close();
    tcpClient.Close();
}
catch (Exception ex)
{
    MessageBox.Show(String.Format("发生错误,消息:{0}", ex.Message), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

相关推荐
德迅云安全-上官3 小时前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏
szxinmai主板定制专家3 小时前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
女神下凡3 小时前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范
星恒随风3 小时前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
|_⊙5 小时前
应用层协议HTTP与HTTPS
网络·网络协议·http
秦禹辰5 小时前
ClipSketch AI把视频改造成图文漫画:选关键帧、生成手绘分镜、融合IP形象并自动写小红书文案
人工智能·tcp/ip·音视频
路上有只喵5 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇5
单片机·嵌入式硬件·fpga开发
爱吃汽的小橘6 小时前
FPGA/数字IC设计的时序优化
fpga开发
叼烟扛炮6 小时前
Linux 学习笔记(三十九):网络基石——TCP/IP 模型与 UDP 实战
linux·运维·网络·笔记·学习·tcp/ip