目前FScoket无法做到感知服务端关闭tcp链接,要做到只能通过两种其他方式:
1,使用BSD socket(建议使用non-blocking mode,因为这样方便终止接收线程);
2,客户端发送心跳包给服务端,如果没有得到回应则认为关闭。
下面方法仅适用于客户端自己关闭连接,如果是服务端关闭是没法感知的
if (Socket->GetConnectionState() != SCS_Connected)
{
// Socket disconnected
}
else
{
if (Socket->HasPendingData(Size))
{
Socket->Recv(Data, MaxBuffer, BytesRead);
}
}
之前在answerhub上提了一个bug说明这个情况,但是得到的回复是让我仔细检查自己的代码,说FSocket就是基于BSD实现的, 本来想直接贴代码给他解释下的,但是感觉麻烦不想折腾。
参考:
FSocket - How to handle client disconnection
https://answers.unrealengine.com/questions/265930/fsocket-how-to-handle-client-disconnection.html