首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

VxWorks SOCKET发送有关问题,在线求解

2013-02-18 
VxWorks SOCKET发送问题,在线求解!平台:Vx6.8,CPU:ARM9问题背景:客户端B通过TCP SOCKET连接从服务端A下载

VxWorks SOCKET发送问题,在线求解!
平台: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"); //打印此分支




[解决办法]
Vxwork6.8下面有个针对这个问题的补丁, 更新一下代码包了

热点排行