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的设计。

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

  • 相关阅读:
    js代码点击触发事件
    鼠标经过事件(onmouseover)
    Python使用win32com实现的模拟浏览器功能
    python 操作剪切板
    python 比较两个yaml文件
    Python:ModuleNotFoundError: No module named 'windows'
    ModuleNotFoundError: No module named 'pymouse'
    Javascript中点击(click)事件的3种写法
    如何调整 php 应用的上传附件大小?
    如何用 iptables 禁止某个ip?
  • 原文地址:https://www.cnblogs.com/farbeyond/p/5196820.html
Copyright © 2011-2022 走看看