无法弄清楚如何在我的客户端 - 服务器模型中实现线程

时间:2013-01-14 15:04:40

标签: c multithreading client-server named-pipes

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

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

我希望一次可以让多个客户端连接到服务器,我计划用工作线程执行此操作。

观测值:

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

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

1 个答案:

答案 0 :(得分:1)

我认为伯克利插座更适合这种情况。如果你必须使用管道,这样的东西可以工作:

  1. 客户端通过主命名管道向控制线程发送连接请求。
  2. 服务器创建(或从池中提取)侦听另一个唯一管道的工作线程。
  3. 控制线程使用此新管道的名称进行回答。
  4. 客户端关闭控制管道并将实际请求数据发送到新管道。
  5. 工作线程读取请求,处理请求并发回响应。
  6. 同时,控制线程已准备好从另一个客户端读取另一个连接请求。