VxWorks SOCKET发送问题,在线求解!

whut_lcy 2013-01-09 08:42:55
平台:Vx6.8,CPU:ARM9

问题背景:客户端B通过TCP SOCKET连接从服务端A下载文件。 B每从A收到10KB就向B回复20BYTE的确认帧(大小均为TCP数据,不含以太网、IP、TCP头), A则向B继续传下10个KB。

问题现象:A过来的数据很快,但B回送给A的确认帧很慢,调用send后,协议栈不是立即将报文发出,而是间隔了4秒(很稳定,几乎都是4秒)才调用网卡驱动将报文发出。最终导致文件下载非常慢。

中间做了其他尝试:如果同时调用send向协议栈冲包(100ms送1.5KB的包),发现响应帧发送快很多,最终下载速度提升非常明显。

百度后,有人说可能是协议栈把小报文打包发送了,需要设置SOCKET的属性,禁用发送延迟(TCP_NODELAY)属性,设置后,问题还是存在。实际上协议栈并没有打包。

整个下载过程,netstat "-s",未发现TCP存在重传。

附客户端B的SOCKET相关代码(片段):

SOCKET iClientSock = socket(AF_INET, SOCK_STREAM, 0));
connect(iClientSock,serverAddr,sizeof(serverAddr));
//以上应该都没问题

连接上后,最后设置SOCKET属性:
int o = 1;
socklen_t ol = sizeof(long);
int ret = setsockopt(iClientSock,IPPROTO_TCP, TCP_NODELAY,(char*)&o, ol);
if(ret == -1) printf("set option fail\n");
else printf("set option ok\n"); //打印此分支



...全文
1612 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2013-01-31
  • 打赏
  • 举报
回复
问题解决。 同时设置三个属性才奏效: 禁用NAGEL,即TCP_NODELAY=1 SENDBUFF=0 MSS=1000
hunle 2013-01-22
  • 打赏
  • 举报
回复
写个简单的server, 收到包以后就往回返, 如果还是可以的, 就该查你们应用的代码了
whut_lcy 2013-01-21
  • 打赏
  • 举报
回复
引用 12 楼 hunle 的回复:
另外尝试一下写一段测试代码直接由B调用send()往外发包, 看看有没有迟延
直接调用,是没有延迟的
hunle 2013-01-17
  • 打赏
  • 举报
回复
iptcp_input()里面改成 param.send_immediate_ack = IP_BIT_ISTRUE(tcp_hdr->offset_flags, IPTCP_FLAG_PSH);
whut_lcy 2013-01-17
  • 打赏
  • 举报
回复
引用 7 楼 hunle 的回复:
引用 5 楼 whut_lcy 的回复:引用 4 楼 hunle 的回复:Vxwork6.8下面有个针对这个问题的补丁, 更新一下代码包了 确实有听说这么回事,有更详细的介绍么? 和push的实现有关系
是否有实例,或者代码?该问题急需解决掉。搞定全分送上
hunle 2013-01-17
  • 打赏
  • 举报
回复
引用 5 楼 whut_lcy 的回复:
引用 4 楼 hunle 的回复:Vxwork6.8下面有个针对这个问题的补丁, 更新一下代码包了 确实有听说这么回事,有更详细的介绍么?
和push的实现有关系
whut_lcy 2013-01-17
  • 打赏
  • 举报
回复
引用 2 楼 zqckzqck 的回复:
设置成两个任务,将send任务级别定高点,试试。
已经是多任务处理了,发送任务专门从消息队列取报文,调用send发送。提高到和协议栈的tNet0任务一个优先级(50),还是不行。
whut_lcy 2013-01-17
  • 打赏
  • 举报
回复
引用 4 楼 hunle 的回复:
Vxwork6.8下面有个针对这个问题的补丁, 更新一下代码包了
确实有听说这么回事,有更详细的介绍么?
hunle 2013-01-17
  • 打赏
  • 举报
回复
另外尝试一下写一段测试代码直接由B调用send()往外发包, 看看有没有迟延
hunle 2013-01-17
  • 打赏
  • 举报
回复
抓包发上来看看
whut_lcy 2013-01-17
  • 打赏
  • 举报
回复
引用 9 楼 hunle 的回复:
iptcp_input()里面改成 param.send_immediate_ack = IP_BIT_ISTRUE(tcp_hdr->offset_flags, IPTCP_FLAG_PSH);
看了风河源码,已经是这样实现的了
hunle 2013-01-14
  • 打赏
  • 举报
回复
Vxwork6.8下面有个针对这个问题的补丁, 更新一下代码包了
zhenghn2010 2013-01-14
  • 打赏
  • 举报
回复
抓包看一下。 arp是否过期了重新来
夫人的泡泡鱼 2013-01-14
  • 打赏
  • 举报
回复
设置成两个任务,将send任务级别定高点,试试。
whut_lcy 2013-01-09
  • 打赏
  • 举报
回复
看现象,应该是SOCKET的属性设置有问题。 在线等。

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧