Can';我不知道如何在我的客户机-服务器模型中实现线程

Can';我不知道如何在我的客户机-服务器模型中实现线程,c,multithreading,client-server,named-pipes,C,Multithreading,Client Server,Named Pipes,我有一个小型的服务器-客户机应用程序,它做的不多(客户机连接到服务器,通过管道发送一个号码,然后接收另一个号码) 但它一次只能使用一个连接(当一个客户端连接时,其他客户端都无法访问服务器) 我想让多个客户端同时连接到服务器成为可能,我计划使用工作线程来实现这一点 Obs: 服务器: HANDLE namedPipe = CreateNamedPipe (CONNECT_NAMEDPIPE, PIPE_ACCESS_DUPL

我有一个小型的服务器-客户机应用程序,它做的不多(客户机连接到服务器,通过管道发送一个号码,然后接收另一个号码)

但它一次只能使用一个连接(当一个客户端连接时,其他客户端都无法访问服务器)

我想让多个客户端同时连接到服务器成为可能,我计划使用工作线程来实现这一点

Obs:

服务器:

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\u NAMEDPIPE不能用于所有管道)


我如何知道其他人何时尝试连接?我的线程应该在哪里?我被卡住了。

我认为伯克利插座更适合这个。如果你必须使用管道,类似这样的方法可能会奏效:

  • 客户端通过主命名管道向控制线程发送连接请求
  • 服务器创建(或从池中获取)一个工作线程,该线程侦听另一个唯一管道
  • 控制线程以这个新管道的名称进行应答
  • 客户端关闭控制管道并将实际请求数据发送到新管道
  • 工作线程读取请求,处理它,然后发回响应
  • 同时,控制线程准备从另一个客户端读取另一个连接请求

  • “或从池中提取”。我听说过线程池,但我不确定它们是什么意思。你能详细说明一下吗?线程池只是处于某种等待状态的线程的集合。当一个工作单元到达时,您从池中唤醒一个踏板,并指示它接受该单元。当它结束时,它又睡着了。这比为每个工作单元创建新线程要快。
    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 ...
    }