我正在 Unix 系统上用 C 语言编写客户端-服务器 (TCP) 程序。客户端发送一些信息,服务器回答。每个子进程只有一个连接。新连接使用池中的预运行进程,并且池大小是动态的,因此如果空闲进程(不为客户端提供服务的进程)的数量下降得太少,它应该创建新进程,同样如果它变得太高额外应该终止进程。
这是我的服务器代码。每个连接都使用fork()
. 每个连接都在一个新进程中运行。我怎样才能像上面解释的那样制作一个动态池?
int main(int argc, char * argv[])
{
int cfd;
int listener = socket(AF_INET, SOCK_STREAM, 0); //create listener socket
if(listener < 0){
perror("socket error");
return 1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int binding = bind(listener, (struct sockaddr *)&addr, sizeof(addr));
if(binding < 0){
perror("binding error");
return 1;
}
listen(listener, 1); //listen for new clients
signal(SIGCHLD,handler);
int pid;
for(;;) // infinity loop on server
{
cfd = accept(listener, NULL, NULL); //client socket descriptor
pid = fork(); //make child proc
if(pid == 0) //in child proc...
{
close(listener); //close listener socket descriptor
... //some server actions that I do.(receive or send)
close(cfd); // close client fd
return 0;
}
close(cfd);
}