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

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

服务器端
/*************************************************************************
* 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>\n", 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", 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>\n", 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)

posted @ 2017-06-19 19:50  草滩小恪  阅读(412)  评论(0编辑  收藏  举报