1

私は WinSock サーバーを持っていて、それをマルチスレッドにする方法を考えていました。以前にスレッドを使用したことがあり、その機能を理解しています。しかし、サーバーコードでそれらを使用する方法がわかりません。だからここにあります:

main.cpp

/* This is our Server */

//Includes
#include "Functions.h"

//Main function
int main(){
    DLLVERSION = MAKEWORD(2,1);
    answer = WSAStartup(DLLVERSION, &wsaData);
    sConnect = socket(AF_INET, SOCK_STREAM, NULL);
    addr.sin_addr.s_addr = inet_addr(HostIP);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    sListen = socket(AF_INET, SOCK_STREAM, NULL);
    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    listen(sListen, SOMAXCONN);

    //Listening for clients
    for(;;){
        Print("Waiting for incoming connections");
        //If a connection is found
        if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen)){
            Print("Connection found!");
            Send("Hello!");
        }
    }
}

このサーバーをマルチスレッド化するにはどうすればよいですか?

使ってみCreateThread();たのですが、別のスレッドができた途端に最後のスレッドがなぜか終了してしまいます。誰でも助けることができますか?

4

2 に答える 2

0

おそらくいくつかのことが必要です。

  • ソケットはテキスト ストリームですが、おそらくメッセージを使用します。おそらく、それぞれが多数のソケットをリッスンするいくつかのスレッドが必要です。メッセージがある場合は、通常、そのメッセージを別のスレッドにディスパッチします。
  • Windows では、WSAWaitForMultipleObjects()複数のソケットをリッスンするために使用します。
  • 実際、スレッドで新しい着信接続を処理する必要があります。1つで十分なはずです。新しい接続はそれぞれ、それらのリスナー スレッドの 1 つに追加するために送信する必要があります。
  • ウェルカム メッセージは、リスナー スレッドが着信接続を取得するときに送信できます。
  • セマフォを使用して、リッスン スレッドによってまだ取得されていない着信接続の数を追跡できます。セマフォを に追加するWSAWaitForMultipleObjectsと、最初のアイドル リスニング スレッドが着信接続を取得します。これにより、スレッド間で負荷が分散されます。
于 2013-08-29T10:03:10.857 に答える
0

selectサーバーソケットで待機するために(pollPOSIXランドにいる場合も)使用できます。

select:ノンブロッキング ソケットに select() を使用する

メインサーバープロセスはソケットをリッスンし、リクエストが来るとすぐに、クライアントと対話するスレッドを(スレッドプールから)スピンオフします。それが要点です。Windows には使用するスレッド プールがありますQueueUserWorkItem。Win 32 呼び出しhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspxをご覧ください。

于 2013-08-29T04:26:52.803 に答える