0

私はあまり機能しない小さなサーバークライアントアプリケーションを持っています(クライアントはサーバーに接続し、パイプを介して番号を送信し、別の番号を受信します)。

ただし、一度に1つの接続でのみ機能します(クライアントが接続されている間、他のクライアントはサーバーにアクセスできません)

複数のクライアントが一度にサーバーに接続できるようにしたいのですが、これはワーカースレッドで行う予定です。

Obs:

#define CONNECT_NAMEDPIPE "\\\\.\\pipe\\ClientToServer"

サーバ:

HANDLE namedPipe = CreateNamedPipe (CONNECT_NAMEDPIPE, 
                                    PIPE_ACCESS_DUPLEX,
                                    PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
                                    2,
                                    sizeof(MinMax),
                                    sizeof(NumberList),
                                    0,                  // timeout
                                    NULL);

if (namedPipe == INVALID_HANDLE_VALUE) {
    printf("Unable to create named pipe\r\nServer closing\r\n");
    printf("CreateNamedPipe failed, GLE=%d.\r\n", GetLastError());
} // Error unable create pipe
else {
    printf("Server created\r\n");
    printf("Awaiting connection\r\n");

    ConnectNamedPipe(namedPipe, NULL);
    etc ...
}

したがって、サーバーはクライアントが接続するまでConnectNamedPipeを待機し、その後、他の接続には使用できなくなります。

複数の接続を有効にしたい場合、ワーカースレッドをどのように作成すればよいですか?

すべての接続が新しいパイプを作成する必要があります(新しいパイプ名/パスを使用して-CONNECT_NAMEDPIPEをすべてに使用することはできません)

他の誰かが接続しようとしていることをどのように知ることができますか?私のスレッドはどこにあるべきですか?私は立ち往生しています。

4

1 に答える 1

1

これには Berkeley ソケットの方が適していると思います。パイプを使用する必要がある場合は、次のようなものが機能します。

  1. クライアントは、メインの名前付きパイプを介して接続要求を制御スレッドに送信します。
  2. サーバーは、別の一意のパイプをリッスンするワーカー スレッドを作成 (またはプールからフェッチ) します。
  3. 制御スレッドは、この新しいパイプの名前で応答します。
  4. クライアントは制御パイプを閉じ、実際の要求データを新しいパイプに送信します。
  5. ワーカー スレッドは、要求を読み取って処理し、応答を返します。
  6. 一方、制御スレッドは、別のクライアントからの別の接続要求を読み取る準備ができています。
于 2013-01-14T15:18:26.393 に答える