博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多路复用IO一例
阅读量:7116 次
发布时间:2019-06-28

本文共 2396 字,大约阅读时间需要 7 分钟。

下面程序实现了功能是:

编写一个TCP服务器,只有一个进程,同时实现实时输出用户从键盘输入的数据,并且当有客户端的连接请求时,该服务器能迅速做出响应。

由上面的内容可知:该服务器的文件描述符有0(stdin),1(stdout),2(stderr)以及一个监听套接字描述符listenfd,和一个已连接套接字描述符confd。但只需要将描述符0和listenfd设置为多路复用IO即可。

 

代码如下:

1:  #include 
2:  #include 
3:  #include 
4:  #include 
5:  #include 
6:  #include 
7:  #include 
8:  #include 
9:  #include 
10:   
11:   
12:  #define N 256
13:  typedef struct sockaddr SA;
14:   
15:  int main(int argc, char *argv[])
16:  {
17:   
18:      char buffer[N];
19:      struct sockaddr_in myaddr;
20:      int sockfd, confd;
21:      fd_set rdfs;
22:      int max_fd;
23:      int i;
24:
25:   
26:   
27:      if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
28:      {
29:          perror("fail to socket");
30:          exit(-1);
31:      }
32:   
33:      bzero(&myaddr, sizeof(myaddr));
34:   
35:      myaddr.sin_family = PF_INET;
36:      myaddr.sin_port = htons(atoi(argv[2]));
37:      myaddr.sin_addr.s_addr = inet_addr(argv[1]);
38:   
39:      if(bind(sockfd, (SA *)&myaddr, sizeof(myaddr)) < 0)
40:      {
41:          perror("fail to bind");
42:          exit(-1);
43:      }
44:   
45:      if(listen(sockfd, 5) <0)
46:      {
47:          perror("fail to listen");
48:          exit(-1);
49:      }
50:      max_fd = sockfd;
51:   
52:   
53:      while(1)
54:      {
55:          FD_ZERO(&rdfs);
56:          FD_SET(STDIN_FILENO, &rdfs);
57:          FD_SET(sockfd, &rdfs);
58:   
59:          if(select(max_fd + 1, &rdfs, NULL, NULL, NULL) < 0)
60:          {
61:              perror("fail to select ");
62:              exit(-1);
63:          }
64:   
65:          for(i = 0; i <= max_fd; i++)
66:          {
67:   
68:              if(FD_ISSET(i, &rdfs))
69:              {
70:                  if(i == STDIN_FILENO)
71:                  {
72:                      fgets(buffer, N, stdin);
73:                      printf("----------> %s", buffer);
74:                  }
75:                  else if(i == sockfd)
76:                  {
77:                      confd = accept(sockfd, NULL, NULL);
78:                      printf("client connection! %d\n", confd);
79:                      close(confd);
80:                  }
81:              }
82:
83:          }
84:   
85:   
86:      }
87:   
88:   
89:      return 0;
90:  }

 

测试方法:

运行服务器,然后从键盘向该终端输入数据,再开一个窗口,通过使用telnet工具发起一次客户端的连接请求,使用方法:

telnet <服务器IP> <服务器的端口>

 

运行效果:

转载地址:http://neyel.baihongyu.com/

你可能感兴趣的文章
vSphere部署系列之05——虚拟机的创建和设置
查看>>
进程间通信的方式及比较
查看>>
Pnp安装过程
查看>>
Linux 下 Oracle 10g 安装“三部曲”
查看>>
ubuntu面板恢复方法
查看>>
高通总裁回应博通收购:5G就要来了 合作伙伴需要定心丸
查看>>
CCNP-18 IS-IS试验1(BSCI)
查看>>
Comet和WebSocket
查看>>
C#程序实现窗体的最大化/最小化
查看>>
使用委托进行异步编程
查看>>
Gmail在outlook设置
查看>>
scala模式匹配
查看>>
JPush删除别名及回调函数(SWIFT)
查看>>
silverlight 跨域socket
查看>>
编程不是功能实现了就可以了
查看>>
利用Dockerfile构建一个nginx容器
查看>>
Linux/Freebsd下时间转化
查看>>
VMware vSphere 5.1 群集深入解析(十五)-DRS推荐向导
查看>>
sklearn.metrics.auc
查看>>
Context Switch Definition(译文)
查看>>