gpt4 book ai didi

C 套接字客户端/服务器滞后

转载 作者:太空狗 更新时间:2023-10-29 17:06:12 26 4
gpt4 key购买 nike

我正在编写 C/C++ 客户端/服务器套接字应用程序。此时,客户端每 50ms 连接一次服务器并发送一条消息。

似乎一切正常,但数据流不连续:突然,服务器不再接收任何消息,然后一次收到 5 条消息...有时一切正常...

有人知道这种奇怪行为的起源吗?

部分代码:

客户:

while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket = new socket();
socket->write("blah");
message.clear();
message = socket->read();
socket->close();
delete socket;
time=SDL_GetTicks();
}
}

服务器:

while (true) {
fd_set readfs;
struct timeval timeout={0,0};
FD_ZERO(&readfs);
FD_SET(sock, &readfs);
select(sock + 1, &readfs, NULL, NULL, &timeout)
if(FD_ISSET(sock, &readfs))
{
SOCKADDR_IN csin;
socklen_t crecsize = sizeof csin;
SOCKET csock = accept(sock, (SOCKADDR *) &csin, &crecsize);
sock_err = send(csock, buffer, 32, 0);
closesocket(csock);
}
}

编辑:1.我试着做

int flag = 1;
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);

客户端和服务端都有,但问题依旧。

2.是的,那些连接/断开连接非常低效,但是当我尝试写的时候

socket = new socket();
while (true)
{
if (SDL_GetTicks()-time>=50)
{
socket->write("blah");
message.clear();
message = socket->read();
time=SDL_GetTicks();
}
}

那么消息只发送一次(或接收)...

最后:

我忘记将 TCP_NODELAY 应用于服务器端的客户端套接字。现在它完美地工作了!我将进程放在线程中,以便套接字保持打开状态。谢谢大家:)

最佳答案

这就是所谓的“Nagle delay”。该算法在实际向网络发送任何内容之前等待 TCP 堆栈以等待更多数据到达,直到超时到期。因此,您应该修改 Nagle 超时 ( http://fourier.su/index.php?topic=249.0 ) 或完全禁用 Nagle 延迟 ( http://www.unixguide.net/network/socketfaq/2.16.shtml ),这样数据将在每次 send 调用时发送。

关于C 套接字客户端/服务器滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348536/

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