select 함수

34454 단어
select 함수는 비저항 방식을 실현할 수 있는 프로그램입니다.그것은 우리가 감시해야 할 파일 설명자의 변화 상황인 읽기와 쓰기, 이상을 감시할 수 있다.
**int select(int maxfdp,fd_set readfds,fd_set writefds,fd_set errorfds,struct timevaltimeout); 헤더 파일: #include
maxfdp는 정수치로 집합 중의 모든 파일 설명자의 범위를 가리킨다. 즉, 모든 파일 설명자의 최대 값에 1을 더한다.readfds는 fd 를 가리킨다구조의 지침, 이 집합에는 파일 묘사자가 포함되어야 한다. 우리는 이 파일 묘사자의 읽기 변화를 감시해야 한다. 즉, 우리는 이 파일에서 데이터를 읽을 수 있는지에 관심을 가진다. 만약에 이 집합에 파일을 읽을 수 있다면 select는 0보다 큰 값을 되돌려 파일을 읽을 수 있음을 나타낸다. 읽을 수 있는 파일이 없으면 타임아웃 파라미터에 따라 시간 초과 여부를 판단한다. 타임아웃의 시간을 초과하면select는 0을 되돌려줍니다. 오류가 발생하면 마이너스를 되돌려줍니다.파일의 읽기 변경 사항에 관심이 없음을 나타내기 위해 NULL 값을 전달할 수 있습니다.writefds는 fd 를 가리킨다구조의 지침, 이 집합에는 파일 묘사자가 포함되어야 한다. 우리는 이 파일 묘사자의 쓰기 변화를 감시해야 한다. 즉, 우리는 이 파일에 데이터를 쓸 수 있는지에 관심을 가진다. 만약에 이 집합에 파일을 쓸 수 있다면 select는 0보다 큰 값을 되돌려주고 쓸 수 있는 파일이 있음을 나타낸다. 쓸 수 있는 파일이 없으면 타임아웃에 따라 시간 초과 여부를 판단한다. 타임아웃의 시간을 초과하면select는 0을 되돌려줍니다. 오류가 발생하면 마이너스를 되돌려줍니다.NULL 값을 전송하여 파일의 쓰기 변경에 관심이 없음을 나타낼 수 있습니다.errorfds는 파일의 오류 이상을 감시하기 위해 위의 두 인자와 같은 의도입니다.timeout은 select의 시간 초과입니다. 이 매개 변수는 매우 중요합니다. 이것은 select를 세 가지 상태에 있게 할 수 있습니다.첫째: 만약에 NULL을 형참으로 전송하면 전송되지 않는 시간 구조는select를 막힌 상태에 놓고 감시 파일 묘사자 집합 중의 어떤 파일 묘사자가 변화할 때까지 기다려야 한다.둘째, 시간 값을 0초 0밀리초로 설정하면 순수한 비저항 함수로 변한다. 파일 설명자에 변화가 있든 없든 즉시 다시 실행하고 파일은 변화가 없으면 0으로 돌아가고 변화가 있으면 하나의 값을 되돌린다.셋째:timeout의 값이 0보다 크다. 이것은 기다리는 시간 초과 시간이다. 즉,select는timeout 시간 내에 막히고 시간 초과 시간 안에 이벤트가 오면 되돌아온다. 그렇지 않으면 시간 초과 후에 어쨌든 반드시 되돌아온다. 되돌아오는 값은 상기와 같다.
반환값:음값:select 오류;양수 값: 일부 파일의 읽기 및 쓰기 오류0: 대기 시간이 초과되어 읽기 및 쓰기 오류가 있는 파일이 없습니다.
텍스트 링크:https://blog.csdn.net/mayue_web/article/details/89021273
서버
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 
  #define SIZE   1024
  
 int main()
 {
      int ret;
      int fd[SIZE] = {0};
  
      //  socket(  )
      int sockfd = socket(PF_INET, SOCK_STREAM, 0);  
      //IPV4             (TCP)         (  0)
      if (-1 == sockfd)
      {
          perror("socket");
          exit(1);
      }
  
      int opt = 1;
      setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
       //         (    )

      struct sockaddr_in server_addr;   //          
      struct sockaddr_in client_addr;   //        
  
      memset(&server_addr, 0, sizeof(server_addr));   //     
      server_addr.sin_family = PF_INET;    //      socket     
      server_addr.sin_port = 7000;         
      //   (  1024   65536)          (    )
      //    ,      man inet_addr
      server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
      //ip   ifconfig>        127.0.0.1  ip(    )
     
      //    
      ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))    ;
      if (-1 == ret)
      {
          perror("bind");
          exit(1);
      }
  
      //      
      ret = listen(sockfd, 10);
      if (-1 == ret)
      {
          perror("listen");
          exit(1);
      }
      
      fd_set readfd, tmpfd;   //  
      FD_ZERO(&readfd);          //    
      FD_SET(sockfd, &readfd);   // sockfd      
     int maxfd = sockfd;
  
      int length = sizeof(struct sockaddr_in);
      int i;
      char buf[128] = {0};
  
      while (1)
      {
          tmpfd = readfd;    //select       
          ret = select(maxfd + 1, &tmpfd, NULL, NULL, NULL); 
           //    NULL    
          if (-1 == ret)
          {
              perror("select");
              exit(1);
          }
  
         if (FD_ISSET(sockfd, &tmpfd))   //            
         {
              printf("        ...
"
); for (i = 0; i < SIZE; i++) { if (0 == fd[i]) { break; } } fd[i] = accept(sockfd, (struct sockaddr *)&client_addr, &length) ; if (-1 == fd[i]) { perror("accept"); exit(1); } printf(" %d !
"
, fd[i]); if (fd[i] > maxfd) { maxfd = fd[i]; } FD_SET(fd[i], &readfd); } else // { for (i = 0; i < SIZE; i++) { if (FD_ISSET(fd[i], &tmpfd)) // { ret = recv(fd[i], buf, sizeof(buf), 0); if (-1 == ret) { perror("recv"); exit(1); } if (0 == ret) { printf(" %d
"
, fd[i]); close(fd[i]); // TCP FD_CLR(fd[i], &readfd); // fd[i] = 0; break; } if (!strcmp(buf, "bye")) { printf(" %d !
"
, fd[i]); close(fd[i]); // TCP FD_CLR(fd[i], &readfd); // fd[i] = 0; break; } printf(" %d %s
"
, fd[i], buf); memset(buf, 0, sizeof(buf)); break; } } } } return 0; }

클라이언트
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
      
 int main() 
 {   
     int sockfd = socket(PF_INET, SOCK_STREAM, 0)
     if (-1 == sockfd)
     {
          perror("socket");
          exit(1);
      }
      
      //           
      struct sockaddr_in server_addr;
      memset(&server_addr, 0, sizeof(server_addr));
      //        
      server_addr.sin_family = PF_INET;
      server_addr.sin_port = 7000;
      server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
      int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
      if (-1 == ret)
      {
          perror("connect");
          exit(1);
      }
 
      char buf[128] = {0};
      while (1)
      {
          scanf("%s", buf);
          ret = send(sockfd, buf, strlen(buf), 0); //write
          if (-1 == ret)
         {
              perror("send");
              exit(1);
         }
         if (!strcmp(buf, "bye"))
         {
              break;
          }
      }
      close(sockfd);   //  TCP  
 
      return 0;
 }

좋은 웹페이지 즐겨찾기