我正在编写两个应用程序(在C中),这些应用程序进行多次发送和接收调用(例如,我正在实现远程文件复制).
我总是发送一个64字节的标题,其中包含以下消息正文的长度和一些其他信息.
在一些文件上测试我的应用程序时,我发现一些recv调用需要很长时间才能完成(大约40 毫秒).使用strace我发现它首先发送一个377字节的消息体(在这种情况下它是我要复制的文件的全部内容).
服务器应用程序开始发送消息体,大约需要48 us.现在客户端应用程序消耗大约38 毫秒来接收这些字节.
从那时起,每个接收呼叫消耗这么多时间,因为它们每个都在接收中阻塞并等待回复.
服务器的strace
[pid 27158] 1292236124.465827发送(6,"\ 0\0\1\271\0\0\0\0\0\0\0\0core.fwrite\0\0\0\0\0\0\0\0\0\0"...,64,0)= 64 <0.000031>
[pid 27158] 1292236124.466074发送(6,"\ 0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\0\1\\ 0\0\0\0\0\0\0\1\0\0\0\0"......,377,0)= 377 <0.000048>
客户的strace
[pid 27159] 1292236124.466364 recv(4,"\ 0\0\1\271\0\0\0\0\0\0\0\0core.fwrite\0\0\0\0\0\0\0\0\0\0"...,64,0)= 64 <0.000027>
[pid 27159] 1292236124.466597 recv(4,"\ 0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\0\1\1\\ 0\0\0\0\0\0\0\1\0\0\0\0"......,377,0)= 377 <0.037456>
这个问题确实给我带来了困难,因为我不明白为什么客户端上的接收呼叫花了这么多时间.
任何提示都将受到高度赞赏.