深入理解计算机系统-----基于IO复用的并发服务器

本文介绍了一个简易的TCP回显服务器的实现过程,通过C语言编程,利用select函数进行多路复用,实现了对客户端连接的高效处理。服务器能够接收并回显客户端发送的数据,同时具备基本的命令行交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实现代码

 #include "csapp.h"
 
 void echo(int connfd);
 void command(void);
 
 int main(int argc, char **argv)
 {
     int listenfd, connfd, port, clientlen;
     struct sockaddr_in clientaddr;
     struct hostent *hp;
     char *haddrp;
     fd_set read_set,ready_set;
     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);
     FD_ZERO(&read_set);
     FD_SET(STDIN_FILENO,&read_set);
     FD_SET(listenfd,&read_set);
     while (1)
     {
         ready_set=read_set;
         Select(listenfd+1,&read_set,NULL,NULL,NULL);
       
       if(FD_ISSET(STDIN_FILENO,&read_set)){
           command();   //从标准输入读命令行
       }
       if(FD_ISSET(listenfd,&ready_set)){
            clientlen = sizeof(clientaddr);
            connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);

       /* determine the domain name and IP address of the client */
             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);
             Close(connfd);


       }

    }

}

void command(void)
{
    char buf[MAXLINE];
    if(!Fgets(buf,MAXLINE,stdin))
      exit(0);
    printf("%s",buf);
}

2、代码分析

        一开始先用open_listenfd函数打开一个监听描述符,然后使用FD_ZERO创建一个空的读集合。

        

       之后定义由描述符0和描述符3组成的读集合。

        

        之后开始服务器循环,但是不调用accept函数等待一个连接请求,而是调用select函数,这个函数会一直阻塞,直到监听描述符或标准输入准备好可以读,比如用户按下回车键,select函数会返回ready_set的值。

        

       一旦select函数返回,就用FD_ISSET宏指令来确定哪个描述符准备好了可以读,如果是标准输入准备好了就调用command函数。如果是监听描述符准备好了,就调用accept函数,得到一个已连接描述符,然后调用echo函数。

        这个服务器一旦连接到某个客户端就会连续会送输入行,直到客户端关闭,这个时候键入一个命令到标准输入不会得到响应。一个更好的方法是,更细粒度的多路复用。

 

        

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值