我正在开发一个类似FTP的程序,将大量小文件下载到Xbox 360 devkit(使用Winsock),并将其移植到Playstation3(也是一个devkit,并使用linux AFAIK).该程序使用BSD样式的套接字(TCP).两个程序都与同一服务器通信,下载相同的数据.该程序循环遍历循环中的所有文件,如下所示:
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选项,所以我不能说这是不同的.