C套接字-保留连接池以供重用-s
我正在编写一个两个守护程序应用程序——一个客户端和一个服务器。它是分布式shell的一个非常基本的版本。客户端正在连接到服务器,服务器发出一个命令,该命令将传播到每个客户端 我不知道如何在服务器端创建套接字逻辑——我做了一些测试,现在我接受一个循环中的连接,对于每个传入的连接,我都会分支一个子节点来处理连接C套接字-保留连接池以供重用-s,c,linux,system,C,Linux,System,我正在编写一个两个守护程序应用程序——一个客户端和一个服务器。它是分布式shell的一个非常基本的版本。客户端正在连接到服务器,服务器发出一个命令,该命令将传播到每个客户端 我不知道如何在服务器端创建套接字逻辑——我做了一些测试,现在我接受一个循环中的连接,对于每个传入的连接,我都会分支一个子节点来处理连接 while (1) { clisockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen); if
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创建新进程确实会创建一个新进程,该进程将与主侦听进程的父进程并行运行吗?因此,没有返回到主进程或恢复,除非您明确告诉主进程,否则主进程不会停止。此外,如果连接不相关,即服务器不需要将数据从一个连接传递到另一个连接,我认为使用进程处理数据没有任何问题。你能详细说明一下你目前的代码有哪些问题,你想解决的实际问题是什么吗?相关阅读:您的用例并不清晰。从阅读。。。服务器发出一个我理解的命令:客户端连接->服务器发出命令->连接关闭。那么,为什么要保存/存储/重用任何套接字呢?