完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用 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
测试无效果, 有没有遇到同样问题的朋友? 虽然接到消息后立即就回就没事, 但是消息回复在其他线程里,有没有其他方法? |
|
相关推荐
3个回答
|
|
TCP_NODELAY主要对发送有效
TCP_NODELAY应该设在connent.socket上,server.socket不需要 如果是select引起接收延迟,可以试下不用select,直接用阻塞接收看看。 如果不用select没延迟,可以试着调整下应用程序与协议栈线程的优先级关系。 |
|
|
|
感觉应该是电脑网络调试助手没设置 TCP_NORELAY选项, 不用 select 是没有问题的, 阻塞接受没遇到过这个问题, 优先级也不至于产生248ms 的超长延迟
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
883 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3025 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1409 浏览 0 评论
2039 浏览 0 评论
1574 浏览 0 评论
75142 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 17:27 , Processed in 0.765175 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号