C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么我们需要为C中的并发服务器中的每个客户端创建不同的进程?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个简单的客户端服务器程序,目的是创建一个聊天程序.我不熟悉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 %d\n",nsockfd);
    }
    else 
    {   client2 = nsockfd;
        printf("else loop %d\n",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 - %s\n",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?)线程中的连接,它不是并发服务器.这是并发服务器的定义.

如果我正确地阅读您的代码,您所拥有的是一个简单的顺序服务器.它一次只能处理一个连接.如果每个响应所需的计算是最小的,那就没问题,如您的示例所示.如果计算涉及很多工作 – 例如访问磁盘或数据库,那就不太好了.

请注意,顺序服务器设计是完全合法的.并发服务器设计也是如此.它们应该应用于不同的工作负载.但是,通常,并发服务器将比顺序服务器更好地处理大流量.想象一下,如果谷歌使用顺序服务器来响应搜索请求!

另一种设计使用线程池或进程池,其中一个线程或进程将工作分配给其他线程或进程.这些写起来比较棘手,因此效果很好.

大佬总结

以上是大佬教程为你收集整理的为什么我们需要为C中的并发服务器中的每个客户端创建不同的进程?全部内容,希望文章能够帮你解决为什么我们需要为C中的并发服务器中的每个客户端创建不同的进程?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。