c++ - 虚幻引擎 4 : Recv function would keep blocking when TCP server shutdown

标签 c++ sockets tcp blocking unreal-engine4

我在连接到 tcp 服务器的客户端使用了一个阻塞式 FSocket,如果没有来自服务器的消息,套接字线程将阻塞在函数 FScoket::Recv(),如果 TCP 服务器关闭,套接字线程仍然阻塞在这个函数中。但是当使用BSD Socket API的blocking socket时,当TCP服务器关闭时线程会从recv函数返回并返回errno,所以是缺陷FSocket 的?

uint32 HRecvThread::Run()
{
    uint8* recv_buf = new uint8[RECV_BUF_SIZE];

    uint8* const recv_buf_head = recv_buf;
    int readLenSeq = 0;

    while (Started)
    {
        //if (TcpClient->Connected() && ClientSocket->GetConnectionState() != SCS_Connected)
        //{
        //  // server disconnected
        //  TcpClient->SetConnected(false);
        //  break;
        //}

        int32 bytesRead = 0;
        //because use blocking socket, so thread would block in Recv function if have no message
        ClientSocket->Recv(recv_buf, readLenSeq, bytesRead);

        .....

        //some logic of resolution for tcp msg bytes

        .....
    }

    delete[] recv_buf;
    return 0
}

最佳答案

如我所料,您忽略了返回代码,这可能表示成功或失败,因此您在出现错误或流结束条件时无限循环(阻塞)。

注意您应该在堆栈上分配recv_buf,而不是动态分配。不要在不必要时使用堆。

关于c++ - 虚幻引擎 4 : Recv function would keep blocking when TCP server shutdown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383400/

相关文章:

c++ - 如何在我的 vc++ 代码中包含 CTime

c - C 中的套接字编程错误

java - 如何让异步tcp服务器继续监听 channel 而不是关闭它

c# - TCP 在不关闭连接的情况下发送多条消息

c++ - 如何保持在 vector 范围内?

c++ - 如何在不循环的情况下仅计算数字的二进制表示形式中的 1 位

c++ - 在 C++ 中向 CPLEX 模型添加约束

java - 每个 SelectionKey(或 SelectionKeyImpl)是否都有一个可供我使用的唯一标识符 (id)?

sockets - 使用 SIOCGIFINDEX 获取接口(interface)索引时出错

.net - SocketOptionName.ReuseAddress 有什么用?