使用fork()的并发服务器tcp

时间:2013-10-19 13:58:27

标签: networking g++ fork

我正在尝试使用并发服务器tcp中的fork()来处理多个客户端。 它处理第一个客户端,但是当我从linux终端运行另一个客户端时,它继续打印else语句。它没有创建处理它的子进程

服务器

while(1){
comm_sock=accept(conn_sock, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr);
if(!fork()){
close(conn_sock);
send(comm_sock, "Data received", 13, 0);
close(comm_sock);
}
else{
cout<<"Parent cannot handle it"<<endl;
close(comm_sock);
}
有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我没有测试过您的代码,但我认为您应该在完成其工作后完成您的子进程:

while(1){
    comm_sock=accept(conn_sock, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr);
    if(!fork()){
       /*Child process*/
       close(conn_sock);
       send(comm_sock, "Data received", 13, 0);
       close(comm_sock);
       _exit(EXIT_SUCCESS);
    }
    else{
       cout<<"Parent cannot handle it"<<endl;
      close(comm_sock);
    }
}

只有一条建议:使用此代码,您将完成大量已解散的子进程。如果您的父进程没有处理它们,一旦一个子进程死亡,它将以失效或僵尸状态结束。父进程应该知道SIGCHLD信号,以便从系统中删除死子进程。

看一下wait或waitpid的man页面:man wait / man waitpid

此外,有很多关于互联网的例子。