0

我有一个小型服务器-客户端应用程序,它做的不多(客户端连接到服务器,通过管道发送一个数字并接收另一个数字)。

但它一次只能使用一个连接(连接客户端时,没有其他客户端可以访问服务器)

我想让多个客户端一次连接到服务器成为可能,我打算用工作线程来做到这一点。

观察:

#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

我认为伯克利插座更适合这个。如果您必须使用管道,则可以使用以下方法:

  1. 客户端通过主命名管道向控制线程发送连接请求。
  2. 服务器创建(或从池中获取)侦听另一个唯一管道的工作线程。
  3. 控制线程用这个新管道的名称来回答。
  4. 客户端关闭控制管道并将真实的请求数据发送到新管道。
  5. 工作线程读取请求,对其进行处理,然后发回响应。
  6. 同时,控制线程准备好从另一个客户端读取另一个连接请求。
于 2013-01-14T15:18:26.393 回答