加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么我们需要为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?)线程中的连接,它不是并发服务器.这是并发服务器的定义.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读