我在连接到 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/