【发布时间】:2008-11-26 01:40:59
【问题描述】:
我正在开发一个类似 FTP 的程序,用于将大量小文件下载到 Xbox 360 开发工具包(使用 Winsock)上,并将其移植到 Playstation3(也是开发工具包,并使用 linux AFAIK)。该程序使用 BSD 样式的套接字 (TCP)。这两个程序都与同一台服务器通信,下载相同的数据。程序循环遍历所有文件,如下所示:
对于每个文件
发送(检索命令)
发送(文件名)
接收(响应)
测试响应
接收(大小)
接收(数据)
在 Xbox 360 实现上,整个下载需要 1:27,最后一次发送和第一次接收之间的时间大约需要 14 秒。这对我来说似乎很合理。
Playstation3 实施需要 4:01 处理相同的数据。瓶颈似乎在最后一次发送和第一次接收之间,占用了 3:43 的时间。网络和磁盘时间都大大少于 Xbox 360。
这两个 devkit 与我的 PC 位于同一台交换机上,我的 PC 负责提供文件服务,并且该交换机上没有其他流量。
我尝试设置TCP_NODELAY 标志,但并没有显着改变。我还尝试将SO_SNDBUF/SO_RCVBUF 设置为 625KB,这也没有显着影响时间。
我假设 Winsock 和 linux 之间的 TCP/IP 堆栈实现之间存在差异;是否可以设置一些套接字选项以使 linux 实现的行为更像 Winsock?还有什么我没有考虑到的吗?
唯一的解决方案似乎是重写它,以便将所有文件请求一起发送,然后全部接收。
不幸的是,索尼的实现没有 TCP_CORK 选项,所以我不能说这是否有区别。
【问题讨论】:
-
您使用的是哪种 FTP 模式,被动还是主动?另外,您说“最后一次发送和第一次接收之间的时间大约需要 14 秒。这对我来说似乎很合理。”我很惊讶等待 14 秒来回复 RETR 命令是合理的,尤其是在 PS3 更长的时候。
标签: networking sockets winsock xbox360 playstation