gpt4 book ai didi

networking - winsock 和 linux 套接字的区别

转载 作者:行者123 更新时间:2023-12-04 15:38:15 25 4
gpt4 key购买 nike

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

对于每个文件
发送(检索命令)
发送(文件名)
接收(响应)
测试 react
接收(尺寸)
接收(数据)

在 Xbox 360 实现上,整个下载需要 1:27,最后一次发送和第一次接收之间的时间大约需要 14 秒。这对我来说似乎很合理。

Playstation3 实现需要 4:01 来获取相同的数据。瓶颈似乎在最后一次发送和第一次接收之间,占用了 3:43 的时间。网络和磁盘时间都明显少于 Xbox 360。

这两个 devkit 与我的 PC 位于同一交换机上,它提供文件服务,并且该交换机上没有其他流量。

我试过设置 TCP_NODELAY标志,这并没有显着改变。我也试过设置 SO_SNDBUF/SO_RCVBUF到 625KB,这也没有显着影响时间。

我假设区别在于 Winsock 和 linux 之间的 TCP/IP 堆栈实现;是否有一些套接字选项可以设置使 linux 实现的行为更像 Winsock?还有什么我没有考虑的吗?

唯一的解决方案似乎是重写它,以便将所有文件请求一起发送,然后全部接收。

不幸的是,索尼的实现没有 TCP_CORK 选项,所以我不能说这是否有区别。

最佳答案

你要TCP_CORK .它将防止发送部分帧以增加吞吐量(以延迟为代价) - 就像 winsock 一样。

int v,vlen;
v=1; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);

套装 v=0在接收之前刷新帧:
int v,vlen;
v=0; vlen=sizeof(v);
setsockopt(fd, IPPROTO_TCP, TCP_CORK, &v, &vlen);

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

关于networking - winsock 和 linux 套接字的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com