• 多进程客户端-服务器模型


    多进程服务器 -- 实现字符回射

    服务器端
    /*************************************************************************
    * File Name: echoserverp.c
    * Author: Chen WenKe
    * Email: chenwenke666@gmail.com
    * Blog: https://caotanxiaoke.github.io
    * Created Time: Sun 18 Jun 2017 05:47:46 PM PDT
    *
    * Description: 
        多进程并发 客户端-服务器, 完成回射功能。    
     ************************************************************************/
    
    #include "csapp.h"
    
    void echo(int fd); 
    void sigchld_handler(int sig)
    {
        while (waitpid(-1, 0, WNOHANG) > 0)
            ;
        return;
    }
    
    int main(int argc, char **argv)
    {
        int listenfd, connfd, port; 
        socklen_t clientlen = sizeof(struct sockaddr_in);
        struct sockaddr_in clientaddr;
    
        if (argc != 2)
        {
            fprintf(stderr, "usage: %s <port>
    ", argv[0]);
            exit(0);
        }
        port = atoi(argv[1]); 
    
        Signal(SIGCHLD, sigchld_handler);
        listenfd = Open_listenfd(port);
        while(1)
        {
            connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen);
            if(Fork() == 0)
            {
                Close(listenfd); 
                echo(connfd); 
                Close(connfd);
                exit(0);
            }
            Close(connfd); 
        }
    }
    
    void echo(int connfd)
    {
        int n; 
        char buf[MAXLINE]; 
        rio_t rio; 
    
        Rio_readinitb(&rio, connfd); 
        while(( n= Rio_readlineb(&rio, buf, MAXLINE)) != 0)
        {
            printf("server received %d bytes
    ", n); 
            Rio_writen(connfd, buf, n); 
        } 
    }
    
    


    ##### 客户端
    /*************************************************************************
    * File Name: echoclient.c
    * Author: Chen WenKe
    * Email: chenwenke666@gmail.com
    * Blog: https://caotanxiaoke.github.io
    * Created Time: Sun 18 Jun 2017 08:00:49 PM PDT
    *
    * Description: 
        
     ************************************************************************/
    
    #include "csapp.h"
    
    int main(int argc, char **argv)
    {
        int clientfd, port; 
        char *host, buf[MAXLINE];
        rio_t rio;
    
        if (argc != 3)
        {
            fprintf(stderr, "usage: %s <host> <port>
    ", argv[0]);
            exit(0); 
        }
        host = argv[1]; 
        port = atoi(argv[2]);
    
        clientfd = Open_clientfd(host, port); 
        Rio_readinitb(&rio, clientfd); 
    
        while (Fgets(buf, MAXLINE, stdin) != NULL)
        {
            Rio_writen(clientfd, buf, strlen(buf)); 
            Fputs(buf, stdout); 
        }
        Close(clientfd);
       exit(0);
    }
    
    


    [上面代码中所使用的头文件及编译方法](http://www.cnblogs.com/acm1314/p/5623562.html)

  • 相关阅读:
    寒假学习记录19
    寒假学习记录18
    寒假学习记录17
    寒假学习记录16
    寒假学习记录15
    寒假学习记录14
    寒假学习记录13
    寒假学习记录12
    寒假学习记录11
    学习进度(10)
  • 原文地址:https://www.cnblogs.com/acm1314/p/7050301.html
Copyright © 2020-2023  润新知