UE4使用TcpSocket發生畫面凍結問題 (socket block)

情況說明:
在UE4中透過winsock來與客戶傳輸資料,保持連線且雙向傳輸(雙方都有傳送與接收),對方在長時間閒置下會停止傳送與接收,我這邊仍持續傳送與接收,最終引發socket block,又因在這個案例中我僅socket->recv()有做thread,send()則無,所以最後ue4 main thread被send()卡住,造成UE4畫面凍結。

解法:
socket->SetNonBlocking(); // 將此socket設定為非阻塞模式,預設為阻塞模式

ue4 socket實現參考
socket block

-------------------------------------

延伸閱讀

Online Subsystem模組為UE4提供一些用於跟Steam, Xbox Live, Facebook...等外部網路服務連接的接口。而winsock也被封裝在內

FSocket* socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)
->CreateSocket(NAME_Stream, TEXT("default"), false);
// 這裡的 "PLATFORM_SOCKETSUBSYSTEM" 會判定你使用的作業系統
// 這邊的 "NAME_Stream" 則決定選用哪種的socket type

這邊使用 "NAME_Stream" 最終追蹤到 c:\Program Files (x86)\Windows Kits\8.1\Include\um\winsock.h,內容實現則在WINSOCK.DLL裡
// windows裡還有分 winsock.h 跟 WinSock2.h 就不在這討論

Online Subsystem
UE4网络底层概览
Facebook Online Subsystem
WinSock TCP keepalive的机理及使用

這個網誌中的熱門文章

Windows10 版本1607後可啟用支援長路徑檔名 (Maximum Path Length Limitation)

標準使用者如何執行需系統管理者權限的程式

Shared Memory