之前在代码测试中发现以下问题:
socket通信中,client连续发送大包(约500KB/每包)数据到server,期间偶尔出现send()返回-1,打印errno对应问题,显示为:No such file or directory。
问题分析:
每次出现问题时,设置的send的长度为40960,但实际上一次send的长度小于40960,如40460,即一包40960的数据在send时未完全copy到发送缓冲区,剩余460数据在继续copy时发生异常。
分析原因可能是,第一次拷贝的时候的发送缓冲区可用空间小于40960,则仅拷贝40460,此时发送缓冲区已经满了,且在继续拷贝剩余460字节数据时,发送缓冲区还未释放相应长度空间,所以造成数据拷贝失败,即send返回-1.
问题验证:
第一次send返回结果ret>0,且ret≠40960时,延时3ms,然后继续;
经测试,不再返回-1,40960数据能完整发送;
问题改进:
调用linux提供的ioctl(fd, SIOCOUTQ, &count)方法来查询socket的发送缓冲区(write buffer)当前占用量是否为0,若为0则表示之前的数据已经发送完成,然后继续发送剩余部分数据。这样就可以将固定延时替换并控制。之后重新测试,问题得以解决。
参考连接:https://blog.csdn.net/thwack/article/details/79960935