select函数(2)

服务器端代码:

  引用

  #include <sys/types.h>

  #include <sys/socket.h>

  #include <stdio.h>

  #include <netinet/in.h>

  #include <sys/time.h>

  #include <sys/ioctl.h>

  #include <unistd.h>

  #include <stdlib.h>

  int main()

  {

  int server_sockfd, client_sockfd;

  int server_len, client_len;

  struct sockaddr_in server_address;

  struct sockaddr_in client_address;

  int result;

  fd_set readfds, testfds;

  /*创建套接字:IPv4, tcp流套接字*/

  server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

  server_address.sin_family = AF_INET;

  /*INADDR_ANY代表本机IP,htonl将其转换为网络字节顺序(大端模式)*/

  server_address.sin_addr.s_addr = htonl(INADDR_ANY);

  server_address.sin_port = htons(9734);

  server_len = sizeof(server_address);

  /*将端口与套接字绑定*/

  bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

  /*监听,可接受5个连接请求*/

  listen(server_sockfd, 5);

  FD_ZERO(&readfds);

  FD_SET(server_sockfd, &readfds);

  /*等待客户端请求*/

  while(1) {

  char ch;

  int  fd;

  int  nread;

  testfds = readfds;

  /*服务器在select后等待客户端的请求(服务器阻塞)*/

  printf("server waiting\n");

  result = select(FD_SETSIZE, &testfds, (fd_set *)0,

  (fd_set *)0, (struct timeval *)0);

  if (result < 1) {

  perror("server");

  exit(1);

  }

  /*轮询,实际程序不使用这种极度耗时的方法*/

  for (fd = 0; fd < FD_SETSIZE; fd++) {

  if (FD_ISSET(fd, &testfds)) {

  if (fd == server_sockfd) {

  client_len = sizeof(client_address);

  client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address,

  &client_len);                    /*接收客户端连接请求,并返回连接套接字用于收发数据*/

  FD_SET(client_sockfd, &readfds);    /*需要监视发来请求的客户端*/

  printf("adding client on fd %d\n", client_sockfd);

  } else {                                                           /*客户端发生“状况”*/

  ioctl(fd, FIONREAD, &nread);

  if (nread == 0) {

  close(fd);                                        /*读取不到任何内容,关闭与客户端的连接套接字*/

  FD_CLR(fd, &readfds);              /*清除客户端套接字描述符,不再对其"关注"*/

  printf("removing client on fd %d\n", fd);

  } else {

  read(fd, &ch, 1);

  sleep(5);

  printf("serving client on fd %d\n", fd);

  ch++;

  write(fd, &ch, 1);

  }

  }

  }

  }

  }

  }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值