嵌入式技术论坛
直播中

chumowei

8年用户 703经验值
擅长:电源/新能源
私信 关注
[问答]

LWIP TCP server连续接收数据为什么会延迟248ms呢

使用 tcpserver 或者 netserver 软件包, 开启tcp 服务器后, 使用select 函数进行判断接收, 实际测试发现, 如果tcp 接收到数据后, 立即发送回去, 那么没有问题, 如果只接收,不进行网络发送, 那么电脑那边发送到单片机这边, 会产生248ms 的延迟

测试代码如下

//netserver tcp 接收回调函数

static int netserver_readable_cb(ns_session_t *ns, void *data, int sz) {

int ret = 0;

can_write(data, sz);

// ret = netserver_write(ns, data, sz); // 此行取消注释(内部调用 send()), 可以立即接收到下一个数据包

// 电脑端以50ms 周期发送, 此回调函数在没有上一行发送函数的情况下, 250ms 触发一次,有上述一行发送,则可以正常触发

return ret;

}

进一步测试, 发现时间卡在了 select 函数里, 不是特别了解运行机制, 上网查阅资料, 发现有短数据包优化算法 nagle 算法, 会对linux 造成 20ms 的数据延迟.

于是添加如下代码, 在 server.socket , 与connent.socket

int option = 1; // 关闭短包优化 // 实际测试无效果



setsockopt(mgr->listener->socket, IPPROTO_TCP, TCP_NODELAY, (const void *)&option, sizeof(int));

测试无效果, 有没有遇到同样问题的朋友? 虽然接到消息后立即就回就没事, 但是消息回复在其他线程里,有没有其他方法?

回帖(3)

张娟

2022-9-8 10:04:33
TCP_NODELAY主要对发送有效
TCP_NODELAY应该设在connent.socket上,server.socket不需要
如果是select引起接收延迟,可以试下不用select,直接用阻塞接收看看。
如果不用select没延迟,可以试着调整下应用程序与协议栈线程的优先级关系。
举报

chumowei

2022-9-8 10:04:49
感觉应该是电脑网络调试助手没设置 TCP_NORELAY选项, 不用 select 是没有问题的, 阻塞接受没遇到过这个问题, 优先级也不至于产生248ms 的超长延迟
举报

张娟

2022-9-8 10:05:01
怀疑电脑,可以仔细从抓包上确认。
或在LINUX上面写个C代码来设置,同样来抓包确认。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分