1、概述:

lwip是轻量型的TCP/IP实现,只需10几KB的RAM和40几KB的ROM就能够跑起来,适合应用于嵌入式设备的网络通信。有牛人Adam Dunkels发明,提供给用户上那种接口

RAW TCP/IP、Squential API, BSD API(也就是常说的socket编程),前者编程稍微复杂点,协议和应用程序在一个进程里面,但是效率高。中者首先要操作系统的支持,但是一旦实现了操作系统模拟层的实现,编程妥妥的。后者是为了符合人们使用socket编程的习惯而模拟的socket实现。所以王者乃RAW TCP/IP。网上提供了源码的下载,现在已经更新至1.4.x(doc 开发与移植指导文档, src 源码 test 测试例子),doc里面罗列了RAW TCP/IP的开发接口函数。

2、demo搭建:

服务器端:

0 open_tap()里面选择适合的网卡

1 开辟新进程 sys_thread_new("http thread",server_init, NULL, 0, 0);

2 设定网址和默认路由器 netif_add(&netif, &ip, &mask, &gw, NULL, ethernetif_init, tcpip_input);

3 在server_init里面 分别调用pcb = tcp_new(); tcp_bind(pcb, IP_ADDR_ANY, 8000);pcb = tcp_listen(pcb);

tcp_accept(pcb, server_accept); tcp_poll(pcb, tcp_poll, 10);// 每5s执行一次tcp_poll;

4 当有新的连接到来时,即有新的数据接收时, server_accept 就好调用。在server_accept里面注册调用函数tcp_recv(pcb, server_recv);

此后每次新的数据过来时,就会调用server_recv函数。

5 在函数 static err_t server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)里面对pbuf进行分析,要注意p->next的值。

并且借鉴其他资料知道立即要调用tcp_recevd;很神秘的告诉你要调用否则不好使。后面这里有重要发现!!!。

6 调用pbuf_free函数,来释放pbuf;

客服端:

0~2步基本相同

3在client_init里面 分别调用pcb = tcp_new(); ret_val = tcp_connect(pcb, &dest, 8000, client_connected);

4 在client_connected里面发送连接请求。同时调用tcp_accept(pcb, client_recv)来注册数据接收处理回调函数。

5 在static err_t client_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);对接收到的数据进行处理

类似server_recv。

搭建完成之后:发现,在server_recv 函数里面只能够tcp_write 128个字节的数据。当发送大于128个数据时,就会只能够接收128个数据。

找了半天发现[2]是由opt.h里面的参数MSS 128决定的, 另外还要注意一个参数即TCP_SND_WND 256。

改变这两个后,发送比TCP_SND_WND小且比MSS大的数据时, 客户端可以接受到一次等于MSS的数据。

试了各种策略后,客户端只接收一次。我们甚至怀疑是回调函数注册一次只能使用一次的问题,都无效。

后面查询各种资料[3], 后面发现英文资料lwip-user给出了很多启示:

包括分析TCP segment(底层自行封装成不同packet,不带ACK) 和 IP segment(>MTU时,会带ACK)

了解了opt.h中:

MSS (the smaller, the better) 128

TCP_SND_BUF 256

MEM_SIZE (1600) HEAP SIZE 如果tcp_write 用COPY的方式时是需要设置较大的值;

TCP_SND_QUEUELEN  4*(TCP_SND_BUF/tcp_mss)(最小为除式的两倍);

MEMP_NUM_TCP_SEG: 至少跟上面一样大

MEMP_NUM_PBUF(16) --->32

TCP_WND 2048 接收窗口,接收多少个数据包的问题。

今天通过wireshark抓包发现,1.15 端发送给了 1.111端后面多于MSS的数据报文,而且发送端一直发送MSS长度的报文,可以得知应该是接收端的没有应答正确。前面提到的tcp_recevd调用的是tcp_ack函数。其实就是对接收到的数据进行应答但是同时发现有一个好用的函数 tcp_ack_now(pcb),是直接发送应答,因为后面跟了tcp_output(pcb)函数。

并且要了解flags 设置 pcb->flags |= TF_NODELAY | TF_ACK_NOW; len = tcp_sndbuf(pcb);会告知剩余的buf的长度并且多次发送的时候可以设置这个值,从而手动告知系统还有多少buf可以发送,从而实现了多次发送的操作。

改了这两处之后,实验可以发送32000个字节,不错。

lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录 | 求索阁相关推荐

  1. lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录;

    这两天,师弟在两台电脑上搭建了lwipwin32通信平台,目的是能够不断发送一幅幅图片图像大小为1280*720大小的图片.如果不考虑压缩情况且是256色即1字节,这样大小的一幅图片需要发送大约发送1 ...

  2. lwip连续发数据卡死_LwIP用TCP连接方式在数据量比较大协议栈卡死

    这段时间用STM32移植LwIP做语音传输.但是遇到一个问题困扰许久,在使用TCP方式做一个client去连接server,由于数据量比较大经常在连接一个多小时候就出现断线而 也ping不通.接下来我 ...

  3. keras时间序列数据预测_使用Keras的时间序列数据中的异常检测

    keras时间序列数据预测 Anomaly Detection in time series data provides e-commerce companies, finances the insi ...

  4. 基于plotly数据可视化_如何使用Plotly进行数据可视化

    基于plotly数据可视化 The amount of data in the world is growing every second. From sending a text to clicki ...

  5. 数据多重共线性_多重共线性对您的数据科学项目的影响比您所知道的要多

    数据多重共线性 Multicollinearity is likely far down on a mental list of things to check for, if it is on a ...

  6. 什么事数据科学_如果您想进入数据科学,则必须知道的7件事

    什么事数据科学 No way. No freaking way to enter data science any time soon-That is exactly what I thought a ...

  7. python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程

    本文是<怎样 七周成为数据剖析 师>的第十八篇教程,假定 想要了解 写作初衷,能够 先行阅读七周指南.温馨提示:假定 您曾经 熟习 Python,大可不用 再看这篇文章,或只选择 部分 . ...

  8. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  9. 数据结构设计_撮合引擎开发:数据结构设计

    价值超5万的撮合引擎:开篇 价值超5万的撮合引擎:MVP版本 交易委托账本 交易委托账本(OrderBook)是整个撮合引擎里最核心也是最复杂的数据结构,每个交易对都需要维护一份交易委托账本,账本里保 ...

最新文章

  1. 写聊天室之前 了解聊天室拓展出来的各种知识点
  2. xml web service
  3. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法
  4. C 语言实现数组冒泡排序
  5. 关于JS中的 NEW 和VAR
  6. JS-内置对象内置构造函数事件-拖拽轮播图无缝滚动
  7. nodejs实践录:我的nodejs编码风格
  8. Ubuntu Linux环境下的Android开发环境的配置
  9. 排名如何得到快速提升?
  10. LoadRunner启动自带例子Web Tours报错
  11. 13.Serving Frontend Files
  12. sql统计表中各类型金额_各类型模具设计中“脱料结构”种类、使用范围揭秘,值得收藏...
  13. 阿里旺旺垃圾消息分析及解决方案探讨
  14. 杀不死的人狼——我读《人月神话》(一)
  15. opencv学习笔记十八:模板匹配(cv2.matchTemplate、cv2.minMaxLoc)
  16. 【Matlab】Niblack算法和Otsu算法
  17. Form--Form表单
  18. Handler详解(中)
  19. 冒泡排序的概念和代码范例 Python
  20. 手机桌面左右滑屏不成功问题log分析

热门文章

  1. 2022年都在说软件测试饱和了,是真的吗?
  2. AI大军已经兵临城下,我们离失业还有多远?
  3. 说说jvm什么时候会回收垃圾
  4. latex语法_【研创基地科研实训】关于举办第27期“LaTeX使用技巧交流分享会” 线上科研实训交流活动的通知...
  5. office2013来了
  6. android如何基于父布局,如何根据父视图的尺寸调整Android视图的大小
  7. Android 蓝牙 搜索周围设备代码流程分析-framework到协议栈流程
  8. 检验特殊字符java_java中文及特殊字符的校验方法
  9. vscode注释代码后无法将其折叠,在注释掉的代码前后分别加上//#regin和//#endregion
  10. node-js——将excel表格转换成json文件