gpt4 book ai didi

multithreading - Winsock 本地环回延迟

转载 作者:行者123 更新时间:2023-12-01 02:53:37 27 4
gpt4 key购买 nike

我正在使用 tcp 套接字在 Windows XP 上的两个应用程序之间提供进程间通信。由于各种原因,我选择了 tcp 套接字。我看到平均往返时间为 2.8 毫秒。这比我预期的要慢得多。分析似乎表明延迟是在一个应用程序调用 send 和另一端的阻塞 recv 返回之间。

我也有应用程序、守护进程和客户端。它们的结构类似于以下伪代码:

守护线程 1(监听新连接):

while (1) {
SOCKET listener_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(listener_socket, (SOCKADDR*)&server_info, sizeof(SOCKADDR));
listen(listener_socket, 1);
SOCKET client_socket = accept(listener_socket, NULL, NULL);
closesocket(listener_socket);
CreateThread(client_thread);
}

守护进程 client_socket 线程(监听来自客户端的数据包):
char cmdBuf[256];
int cmdBufAmountData = 0;

while (1)
{
char recvBuf[128];
int bytesTransferred = recv(m_clientSocket, recvBuf, sizeof(recvBuf), 0);

// Copy received data into our accumulated command buffer (commands
// may be split across packet boundaries)
memcpy(cmdBuf + cmdBufAmountData, recvBuf, bytesTransferred);
cmdBufAmountData += bytesTransferred;

// See if there is one or more complete commands in cmdBuf
// (commands are separated by '\0')
while (commandExists(cmdBuf, cmdBufAmountData))
{
// do stuff with command
send(m_clientSocket, outBuf, msgLen, 0);

// Throw away the command we just processed by shuffling
// the contents of the command buffer left
for (int i = 0; i < cmdBufAmountData - cmdLen; i++)
cmdBuf[i] = cmdBuf[i + cmdLen];
cmdBufAmountData -= cmdLen;
}
}

客户端线程 1:
start_timer();
send(foo);
recv(barBuf);
end_timer(); // Timer shows values from 0.7ms to 17ms. Average 2.8ms.

任何想法为什么延迟如此糟糕?我怀疑 Nagel 的算法,但在我的代码中乱扔垃圾:
BOOL bOptVal = TRUE;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&bOptVal, sizeof(BOOL));

没有帮助。我需要在客户端和守护进程套接字上都这样做吗(我正在做)?

我在四核机器上,几乎没有负载,没有磁盘事件等。

最佳答案

首先,在您的服务器中,while 循环应该围绕 Accept 而不是 listen...您只需要听一次,所以,更像是...

SOCKET listener_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(listener_socket, (SOCKADDR*)&server_info, sizeof(SOCKADDR));
listen(listener_socket, 1);
while (1) {
SOCKET client_socket = accept(listener_socket, NULL, NULL);
closesocket(listener_socket);
CreateThread(client_thread);
}

接下来,是的,如果您想关闭 nagle,您需要在接受的服务器套接字和连接的客户端套接字上执行此操作。您可以在连接/接受后立即执行。因此,如果您只在一个 socket 上设置 nagle,那么这可能是您的问题。

鉴于您使用的是 TCP,我假设您正在阅读,直到您获得完整的消息,而不是假设一侧发送 == 另一侧接收。 (即我假设您的代码是缩写的并且不显示正常的 recv 循环)。

有多少客户?多少线程?

关于multithreading - Winsock 本地环回延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915883/

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