迭代式客户端-服务系模型

迭代式服务器 -- 实现字符回射

服务器端
/* 
 * echoserveri.c - An iterative echo server 
 */ 
#include "rio.h"

void echo(int connfd);

int main(int argc, char **argv) 
{
    int listenfd, connfd, port, clientlen;
    struct sockaddr_in clientaddr;  // Enough space for any address 
    struct hostent *hp; 
    char *haddrp; 

    if (argc != 2) {
	fprintf(stderr, "usage: %s <port>\n", argv[0]);
	exit(0);
    }
    port = atoi(argv[1]); 

    listenfd = Open_listenfd(port);
    while (1) {
	clientlen = sizeof(clientaddr); 
	connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
    
    hp = Gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
                        sizeof(clientaddr.sin_addr.s_addr), AF_INET); 
    haddrp = inet_ntoa(clientaddr.sin_addr);

    printf("server connected to (%s, %s)\n", hp->h_name, haddrp);
	echo(connfd);
    sleep(5);   // wait 5s before close connfd
	Close(connfd);
    }
    exit(0);
}



##### 客户端
/*
 * echoclient.c - An echo client
 */

#include "rio.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));
	Rio_readlineb(&rio, buf, MAXLINE);
	Fputs(buf, stdout);
    }
    Close(clientfd); 
    exit(0);
}



上面代码中所使用的头文件(rio.h)及其实现(rio.c)在上篇博客里。

posted @ 2017-06-15 18:20  草滩小恪  阅读(167)  评论(0编辑  收藏  举报