winsock和linux套接字之间的区别

aro*_*101 6 sockets networking playstation winsock xbox360

我正在开发一个类似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选项,所以我不能说这是不同的.

geo*_*car 2

你要TCP_CORK。它将阻止发送部分帧,从而增加吞吐量(以延迟为代价)——就像winsock一样。

int v,vlen;
v=1; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);
Run Code Online (Sandbox Code Playgroud)

设置v=0为在接收之前刷新帧:

int v,vlen;
v=0; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);
Run Code Online (Sandbox Code Playgroud)

writev()在大多数 Unix 上,您可以通过使用或sendfile()...进一步提高吞吐量。