[英]Non-blocking select()?
我正在嘗試實現簡單的網絡游戲(客戶端-服務器),該游戲使用UDP通過網絡傳輸游戲事件,並且我的工作情況很好,但是現在我想在同一控制台應用程序中通過tcp進行游戲聊天。 我嘗試使用select()
和非阻塞主套接字實現多客戶端聊天。 聊天正在作為獨立應用程序運行,但是將其組合在一起時遇到了問題。
基本上,我的服務器循環如下所示:
while(true)
{
sendUDPdata()
...
while(true)
{
receiveUDPdata()
}
}
問題是,當我想像這樣將聊天添加到服務器的主循環(處理UDP)時:
while(true)
{
HandleTCPConnections();
sendUDPdata();
...
while(true)
{
receiveUDPdata();
}
}
在HandleTCPConnections()
調用select()
阻塞整個服務器。 有什么辦法可以解決這個問題?
有兩種很好的方法可以做到這一點:
使用線程。 有一個線程來處理您的TCP套接字,並有一個線程來處理您的UDP套接字。
使用電抗器。 UDP代碼和TCP代碼都將其套接字注冊到反應堆。 反應器在所有套接字上阻塞(通常使用poll
),並在該套接字上發生活動時調用相應的代碼。
如果您不想重新發明輪子,可以使用很多庫來使用這兩個選項(例如libevent和boost.asio )。
如果您的套接字沒有可用數據,則select
是阻塞調用。
您的聊天可以與服務器一起運行,也可以與服務器並行運行。 第二,您最好選擇一個單獨的線程來處理聊天。 C ++具有<thread>
,您可能需要研究一下。
在這種情況下,使用單獨的線程更容易實現,因為您擁有單獨的連接,因此也有了單獨的套接字,否則,在進行並發訪問時需要注意這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.