C套接字-保留连接池以供重用-s

C套接字-保留连接池以供重用-s,c,linux,system,C,Linux,System,我正在编写一个两个守护程序应用程序——一个客户端和一个服务器。它是分布式shell的一个非常基本的版本。客户端正在连接到服务器,服务器发出一个命令,该命令将传播到每个客户端 我不知道如何在服务器端创建套接字逻辑——我做了一些测试,现在我接受一个循环中的连接,对于每个传入的连接,我都会分支一个子节点来处理连接 while (1) { clisockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen); if

我正在编写一个两个守护程序应用程序——一个客户端和一个服务器。它是分布式shell的一个非常基本的版本。客户端正在连接到服务器,服务器发出一个命令,该命令将传播到每个客户端

我不知道如何在服务器端创建套接字逻辑——我做了一些测试,现在我接受一个循环中的连接,对于每个传入的连接,我都会分支一个子节点来处理连接

while (1) {
   clisockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen);
   if (clisockfd < 0) {
       log_err("err on opening client socket");
       exit(EXIT_FAILURE);
   }

   /* create a new child to process the connection  */
   if((pid = fork()) < 0) {
       log_err("err on forking, something is really broken!");
       exit(EXIT_FAILURE);
   }

   if(!pid) {
       /* here we are in forked process so we dont need the sockfd */
       close(sockfd);
       /* function that handles connection */
       handle_connection(clisockfd);
       exit(EXIT_FAILURE);
   } else {
       close(clisockfd);
   }
 }
然而,我现在拥有的有一些缺点——我可以接受一个连接,用它做一些事情,然后返回到主进程。分叉进程必须返回,然后在主进程中继续执行。我想把每只袜子都放在什么地方?并且能够选择其中一个或全部,并向这个socketfd发送我想在我的客户机上发出的命令。我假设我不能用传统的accept->fork->return to main流程方式来完成

所以它可能看起来像:

客户端连接->服务器设置一个新的socketfd并将其保存到某个地方->放置到shell中,我可以选择其中一个socket并向其发送命令->在整个过程中的某个地方,它还应该等待下一个传入的客户端连接-但在哪里

如果有人能给我一个想法,我应该使用什么机制来创建我需要的逻辑?也许最好是从服务器到客户机,而不是从客户机到服务器

问候,, Krzysztof

我假设我不能用传统的accept->fork->return to main流程方式来完成

您可以,但这将很难设计/维护

最好的解决方案是根据您的平台使用POSIX、Linux、BSD或Windows。 有一个很好的例子/解释关于选择输入

我假设我不能用传统的accept->fork->return to main流程方式来完成

您可以,但这将很难设计/维护

最好的解决方案是根据您的平台使用POSIX、Linux、BSD或Windows。
关于select in,有一个很好的例子/解释。

使用事件循环和ePoll您知道,使用fork创建一个新进程确实会创建一个新进程,该进程将与主侦听进程的父进程并行运行吗?因此,没有返回到主进程或恢复,除非您明确告诉主进程,否则主进程不会停止。此外,如果连接不相关,即服务器不需要将数据从一个连接传递到另一个连接,我认为使用进程处理数据没有任何问题。你能详细说明一下你目前的代码有哪些问题,你想解决的实际问题是什么吗?相关阅读:您的用例并不清晰。从阅读。。。服务器发出一个我理解的命令:客户端连接->服务器发出命令->连接关闭。那么,为什么要保存/存储/重用任何套接字呢?使用事件循环和epoll。您知道,使用fork创建新进程确实会创建一个新进程,该进程将与主侦听进程的父进程并行运行吗?因此,没有返回到主进程或恢复,除非您明确告诉主进程,否则主进程不会停止。此外,如果连接不相关,即服务器不需要将数据从一个连接传递到另一个连接,我认为使用进程处理数据没有任何问题。你能详细说明一下你目前的代码有哪些问题,你想解决的实际问题是什么吗?相关阅读:您的用例并不清晰。从阅读。。。服务器发出一个我理解的命令:客户端连接->服务器发出命令->连接关闭。那么,为什么要保存/存储/重用任何套接字呢?