gpt4 book ai didi

windows - 最小 Winsock2 应用程序的性能调试网络吞吐量

转载 作者:可可西里 更新时间:2023-11-01 02:40:25 25 4
gpt4 key购买 nike

我有一个非常简单的 Winsock2 TCP 客户端——下面的完整列表——它只是发送一堆字节。但是,它在网络上的运行速度非常慢;数据只是慢慢流过。

这是我尝试过并发现的(两台 Windows PC 在同一个 LAN 上):

  • 从一台机器到另一台机器运行这个应用程序很慢 - 发送 8MB 大约需要 50 秒。
  • 两个不同的服务器 - netcat 和一个自定义编写的服务器(就像下面的客户端一样简单) - 产生了相同的结果。
  • taskmgr 显示 CPU 和网络几乎未被使用。
  • 在同一台机器上使用服务器运行此应用程序速度很快 - 发送 8MB 大约需要 1-2 秒。
  • 另一个客户端 netcat 工作正常 - 发送 20MB 的数据大约需要 7 秒。 (我用的是Cygwin自带的nc。)
  • 改变缓冲区大小(1*4096、16*4096 和 128*4096)几乎没有什么区别。
  • 在不同 LAN 上的 Linux 机器上运行几乎相同的代码效果很好。
  • send 调用周围添加一堆打印语句表明我们将大部分时间花在阻塞上。
  • 在服务器端,我们看到一堆 <= 4K block 的接收(无论发送方推送的缓冲区大小如何)。但是,其他客户端也会发生这种情况,例如全速运行的 netcat。

有什么想法吗?预先感谢您提供任何提示。

#include <winsock2.h>
#include <iostream>

using namespace std;

enum { bytecount = 8388608 };
enum { bufsz = 16*4096 };

int main(int argc, TCHAR* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);

struct sockaddr_in sa;
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_port = htons(9898);
sa.sin_addr.s_addr = inet_addr("157.54.144.70");
if (sa.sin_addr.s_addr == -1) {
cerr << "inet_addr: " << WSAGetLastError() << endl;
return 1;
}

char *blob = new char[bufsz];
for (int i = 0; i < bufsz; ++i) blob[i] = (char) i;

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (s == INVALID_SOCKET) {
cerr << "socket: " << WSAGetLastError() << endl;
return 1;
}

int res = connect(s, reinterpret_cast<sockaddr*>(&sa), sizeof sa);
if (res != 0) {
cerr << "connect: " << WSAGetLastError() << endl;
return 1;
}

int sent;
for (int j = 0; j < bytecount; j += sent) {
sent = send(s, blob, bufsz, 0);
if (sent < 0) {
cerr << "send: " << WSAGetLastError() << endl;
return 1;
}
}

closesocket(s);

return 0;
}

最佳答案

为了获得更好的照片,您可以执行以下操作。

  • 您可以检查它在“连接”、“发送”API 调用中花费了多少时间。您可以查看连接调用是否有问题。您可以使用探查器来完成,但如果您的应用程序非常慢,您将能够在调试时看到它。
  • 尝试运行 Wireshark(或 Ethereal)来转储您的网络流量,以便您看到 TCP 数据包在传输时有一些延迟。如果响应很快,那么它只与您的系统有关。如果您发现延迟,那就是路由/网络问题。
  • 您可以运行“route print”来检查您的 PC 如何将流量发送到目标机器 (157.54.144.70)。您将能够查看是否使用网关并检查不同路由的路由优先级。
  • 尝试发送较小的 block 。 (我的意思是将“bufsz”更改为 1024)。性能和缓冲区大小之间是否存在关联?
  • 检查是否安装了防病毒、防火墙应用程序?确保将其关闭。您可以尝试在具有网络支持的安全模式下运行相同的应用程序。

关于windows - 最小 Winsock2 应用程序的性能调试网络吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611191/

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