c++ - ioctlsocket 或 recv 在 windows 套接字编程中需要更多时间来执行?

标签 c++ winsock

在套接字编程中,向服务器发送一些数据,服务器收到后立即发送确认响应消息。它超过 1 个字节,所以我在接收时检查了超过一个字节的检查,这里我丢失了大约 120-200 毫秒。这是一个非常大的问题。因为客户需要发回确认信息。当服务器发送时,我已经嗅探到数据同时到达我的 IP。但是 recv 或 ioctlsocket(检查是否已准备好读取超过 1 个字节)需要时间来读取超过一个字节。我该如何解决这个问题。代码如下。

        DWORD RecvCount = 0;    
        char szBuff1[2048];         
        bool stop = false;          
        while(!stop)
        {               
            ioctlsocket(*socket, FIONREAD, &RecvCount);
            if(RecvCount > 1)
                stop = true;
        }
        int Res = recv(*socket, szBuff1, RecvCount,0);

最佳答案

您应该在 Windows 上禁用 Nagle 算法,否则套接字将占用您的数据,直到缓冲区已满(或者至少等待几百毫秒,然后再发送)。

您可以通过设置 TCP_NODELAY 套接字选项来做到这一点:

int flag = 1;
int result = setsockopt(m_Socket,IPPROTO_TCP,TCP_NODELAY,(char *) &flag,sizeof(int));

关于c++ - ioctlsocket 或 recv 在 windows 套接字编程中需要更多时间来执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312014/

相关文章:

c++ - 当服务器重新启动并且客户端收到 WSAECONNRESET 错误代码时,我是否应该重新创建整个套接字

c++ - 在这种情况下可以避免循环吗?

c++ - 根据 C++ 版本和编译器初始化数组

c++ - 如何将包含纪元时间的十六进制字符串转换为time_t?

c++ - 带有 CMake 的 QtCreator,在编辑器中错误地解析了 __cplusplus 值

c++ - 在 C++ 上获取本地计算机的 IP 地址

c++ - 使用 Winsock、GetDIBits 和 SetDiBits 传输位图

c++ - 是否可以使用 WINAPI 或 GDI+ 在 C++ 中创建 CommandLink 对话框?

c++ - Winsock -> WinRT Windows.Networking.Sockets -- 映射错误代码

C++ 套接字 : communication between PCs over internet