簡體   English   中英

非阻塞select()?

[英]Non-blocking select()?

我正在嘗試實現簡單的網絡游戲(客戶端-服務器),該游戲使用UDP通過網絡傳輸游戲事件,並且我的工作情況很好,但是現在我想在同一控制台應用程序中通過tcp進行游戲聊天。 我嘗試使用select()和非阻塞主套接字實現多客戶端聊天。 聊天正在作為獨立應用程序運行,但是將其組合在一起時遇到了問題。

基本上,我的服務器循環如下所示:

while(true)
{
    sendUDPdata()
    ...

    while(true)
    {
        receiveUDPdata()
    }
}

問題是,當我想像這樣將聊天添加到服務器的主循環(處理UDP)時:

while(true)
{
    HandleTCPConnections();

    sendUDPdata();
    ...

    while(true)
    {
        receiveUDPdata();
    }
}

HandleTCPConnections()調用select()阻塞整個服務器。 有什么辦法可以解決這個問題?

有兩種很好的方法可以做到這一點:

  1. 使用線程。 有一個線程來處理您的TCP套接字,並有一個線程來處理您的UDP套接字。

  2. 使用電抗器。 UDP代碼和TCP代碼都將其套接字注冊到反應堆。 反應器在所有套接字上阻塞(通常使用poll ),並在該套接字上發生活動時調用相應的代碼。

如果您不想重新發明輪子,可以使用很多庫來使用這兩個選項(例如libeventboost.asio )。

如果您的套接字沒有可用數據,則select 阻塞調用。

您的聊天可以與服務器一起運行,也可以與服務器並行運行。 第二,您最好選擇一個單獨的線程來處理聊天。 C ++具有<thread> ,您可能需要研究一下。

在這種情況下,使用單獨的線程更容易實現,因為您擁有單獨的連接,因此也有了單獨的套接字,否則,在進行並發訪問時需要注意這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM