我正在开发一个类似FTP的程序,将大量小文件下载到Xbox 360 devkit(使用Winsock),并将其移植到Playstation3(也是一个开发工具包,并使用Linux据我所知)。该程序使用BSD风格的套接字(TCP)。这两个程序都与同一台服务器通信,下载相同的数据。该程序遍历在这样的循环中的所有文件:winsock和linux套接字之间的区别
for each file send(retrieve command) send(filename) receive(response) test response receive(size) receive(data)
在Xbox 360执行,整个下载时间1:27,最后发送之间和第一接收时间大约需要14秒。这对我来说似乎很合理。
对于相同的数据,Playstation3实施需要4点01分。瓶颈似乎在最后一次发送和第一次接收之间,这个时间占用了3:43。网络和磁盘时间都比Xbox 360要小得多。
这两个devkits与我的PC都在同一个交换机上,这个文件服务器提供文件服务,并且在所述交换机上没有其他流量。
我试过设置TCP_NODELAY
标志,这并没有显着改变事情。我也尝试将SO_SNDBUF
/SO_RCVBUF
设置为625KB,这也不会显着影响时间。
我假设不同之处在于Winsock和linux之间的TCP/IP栈实现;是否有一些套接字选项可以让linux实现更像Winsock?还有别的我没有考虑的吗?
唯一的解决方案是重写它,以便它将所有文件请求发送到一起,然后全部接收它们。
不幸的是,索尼的实施没有TCP_CORK选项,所以我不能说这是否是差异。
您正在使用哪种FTP模式,被动还是主动? 另外,你说“上次发送和第一次接收之间的时间大约需要14秒,这对我来说似乎很合理。”我很惊讶,等待14秒钟回复RETR命令是合理的,特别是当PS3的时间更长时。 – Alexander 2008-11-27 16:50:40