zoukankan      html  css  js  c++  java
  • linux多线程处理多客户1

    这几天在看linux下关于网络通信的知识,相当于做点笔记。

    这里给出了一个利用多线程的机制来处理的例子。先看代码,再来分析实现的原理。干货如下:

    #include<sys/types.h>
    
    #include<sys/socket.h>
    
    #include<stdio.h>
    
    #include<netinet/in.h>
    
    #include<signal.h>
    
    #include<unistd.h>
    
     
    
    int main()
    
    {
    
    int server_sockfd,client_sockfd;
    
    int server_len,client_len;
    
    struct sockaddr_in server_addr;
    
    struct sockaddr_in client_addr;
    
     
    
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
     
    
    server_addr.sin_family = AF_INET;
    
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    server_addr.sin_port = htons(9734);
    
    server_len = sizeof(server_addr);
    
     
    
    bind(server_sockfd,(struct sockaddr *)&server_addr,server_len);
    
     
    
    listen(server_sockfd,5);
    
     
    
    signal(SIGCHLD,SIG_IGN);//忽略僵尸进程
    
     
    
    while(1){
    
        char ch;
    
        printf("server waiting!
    ");
    
         
    
        client_len = sizeof(client_addr);
    
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_addr,
    
                             &client_len);
    
         
    
        if(fork()==0) {
    
            read(client_sockfd,&ch,1);
    
            sleep(5);
    
            ch++;
    
            write(client_sockfd,&ch,1);
    
            close(client_sockfd);
    
            exit(0);
    
        }
    
        else {
    
            close(client_sockfd);
    
        }
    
    }
    
    }

    这里先看看操作步骤:

        1、创建客户端的套接字,server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

        2、服务器端地址填充。

            server_addr.sin_family = AF_INET;

            server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY代表0.0.0.0,实际就是任意地址

            server_addr.sin_port = htons(9734);//指定端口号

            server_len = sizeof(server_addr);

         3、端口绑定。bind(server_sockfd,(struct sockaddr *)&server_addr,server_len);

         4、监听端口。listen(server_sockfd,5);

         5、等待客户端请求。client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_addr,&client_len);

         6、创建一个子进程来处理该请求。 if(fork()==0)

         7、处理,并休眠5s。

        8、关闭客户端,继续等待新请求。

           再从头开来,服务器端实际是在进行一个轮回查询的工作,就是休眠5s来看看有没有客户端请求,休眠的5s是不处理任何请求的。也就是5s才响应一次请求,假如你春节买票刷票,对不起,5s刷一次才有效,否则都是徒劳,刷再多次还是在睡觉。

           假设客户端有个请求在刚开始休眠就请求进来了,这必然导致一个问题,就是要缓冲5s,这个在很多时候用户是不能忍受的,而且这样的设计处理多客户请求也没有充分利用网络带宽,带宽本可以响应很大的数据量,但是服务器自己做死。所以这种处理方式是一个很low的设计。

           下一节将讲解关于其他方式处理多客户请求的设计。

  • 相关阅读:
    C语言中的异常处理
    silverlight与游戏中的人工智能基本追逐与闪躲(二)
    具有3D旋转效果的图片组的一种实现
    [转]ColorMatrixFilter颜色矩阵滤镜
    silverlight effect的一些整理
    silverlight练习之利用DridSplitter和Drid,Line制作可变行列宽度的表格
    str_replace函数详解
    《JavaScript高级程序设计(第2版)》
    FCKEditor+jQuery+PHP实现分页
    如何书写高效、可维护、组件化的CSS。
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5196820.html
Copyright © 2011-2022 走看看