gpt4 book ai didi

Windows TCP 套接字接收延迟

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

外部 Controller 每 30 毫秒通过 TCP/IP 套接字发送 120 字节的消息。应用程序通过标准的 tcp/ip 套接字接收函数接收此消息。它在 Linux 和 OSX 下完美运行(recv 每 30 毫秒返回 120 字节的消息)。在 Windows 下,recv 大约每 1 秒返回 ~3500 字节缓冲区。其余时间返回 0。Windows 下的 Wireshark 显示消息确实每 30 毫秒发送一次。

如何使windows tcp socket正常工作(不延迟)?

PS:我已经玩过 TCP_NODELAY 和 TcpAckFrequency。 Wireshark 显示一切正常。所以我认为这是一些 Windows 优化,应该关闭。

读书--

int WMaster::DataRead(void)
{
if (!open_ok) return 0;
if (!CheckSocket())
{
PrintErrNo();
return 0;
}
iResult = recv(ConnectSocket, (char *)input_buff,sizeof(input_buff),0);

nError=WSAGetLastError();
if(nError==0) return iResult;
if(nError==WSAEWOULDBLOCK) return iResult;

PrintErrNo();
return 0;
}

初始化-

ConnectSocket = INVALID_SOCKET;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ZeroMemory(&clientService, sizeof(clientService));
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( deviceName.toLatin1().constData() );
clientService.sin_port = htons( port);

iResult = setsockopt(ConnectSocket, IPPROTO_TCP, TCP_NODELAY, (char *) &flag,
sizeof (int));

u_long iMode=1;
iResult=ioctlsocket(ConnectSocket,FIONBIO,&iMode);

iResult = ::connect( ConnectSocket, (SOCKADDR*) &clientService,
sizeof(clientService) );

检查套接字-

bool WMaster::CheckSocket(void)
{
socklen_t len = sizeof (int);
int retval = getsockopt (ConnectSocket, SOL_SOCKET, SO_ERROR, (char*)(&valopt), &len );
if (retval!=0)
{
open_ok=false;
return false;
};
return true;
}

最佳答案

考虑禁用 Nagle 算法。 120 字节非常小,数据可能在发送前被缓冲。我认为这是 Nagle 算法的另一个原因是大约 33 次发送应该在 1 秒内发生。这对应于 33*120 = 3960 字节/秒,与您看到的 3500 非常相似。

关于Windows TCP 套接字接收延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15588961/

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