使用 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));
测试无效果, 有没有遇到同样问题的朋友? 虽然接到消息后立即就回就没事, 但是消息回复在其他线程里,有没有其他方法?
更多回帖