为什么我们需要为C中的并发服务器中的每个客户端创建不同的进程
发布时间:2020-12-16 09:49:57 所属栏目:百科 来源:网络整理
导读:我正在开发一个简单的客户端服务器程序,目的是创建一个聊天程序.我不熟悉C中的套接字编程.我了解到,为了服务多个客户端,服务器需要在每次客户端连接时分叉一个新进程.每次客户端请求连接时,accept()函数返回描述符id,在fork()之后,父关闭id. 相反,我没有关闭
我正在开发一个简单的客户端服务器程序,目的是创建一个聊天程序.我不熟悉C中的套接字编程.我了解到,为了服务多个客户端,服务器需要在每次客户端连接时分叉一个新进程.每次客户端请求连接时,accept()函数返回描述符id,在fork()之后,父关闭id.
相反,我没有关闭ID,这样当调用accept()时,每个新客户端都会获得一个newid. nsockfd = accept(lsockfd,(struct sockaddr *) &cli_addr,&cli_len); 现在这存储在2个变量中: if (client1 < 0) { client1 = nsockfd; printf("if loop %dn",nsockfd); } else { client2 = nsockfd; printf("else loop %dn",nsockfd); } 现在其余的代码是 snprintf(buf,sizeof(buf),"Hi client1 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); ret = send(client1,buf,strlen(buf),0); if (ret == -1) { perror("Error sending message"); exit(1); } printf("SRV - %sn",buf); strcpy(buf,""); snprintf(buf,"Hi client2 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); if(client2 > 0) {ret = send(client2,""); 这里的代码按预期工作;每个客户端只打印一个语句. 如果这是一个完美的方法,为什么教会fork()应该用于服务每个客户端. 我正在写一个本地主机?这就是这段代码对我有用的原因吗? 解决方法
如果你没有fork()或处理(new?)线程中的连接,它不是并发服务器.这是并发服务器的定义.
如果我正确地阅读您的代码,您所拥有的是一个简单的顺序服务器.它一次只能处理一个连接.如果每个响应所需的计算是最小的,那就没问题,如您的示例所示.如果计算涉及很多工作 – 例如访问磁盘或数据库,那就不太好了. 请注意,顺序服务器设计是完全合法的.并发服务器设计也是如此.它们应该应用于不同的工作负载.但是,通常,并发服务器将比顺序服务器更好地处理大流量.想象一下,如果谷歌使用顺序服务器来响应搜索请求! 另一种设计使用线程池或进程池,其中一个线程或进程将工作分配给其他线程或进程.这些写起来比较棘手,因此效果很好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |