2013-04-22 36 views
5

Tôi đang viết chương trình nhận tin nhắn UDP cũng như nhận dữ liệu từ người dùng tuy nhiên STDIN của tôi vẫn đang chặn với lựa chọn. Khi tôi FD_CLR fdin fd trước khi chọn chương trình chạy tốt, chỉ ra rằng ổ cắm stdin luôn sẵn sàng để có dữ liệu đọc từ nó. Tôi đã cố gắng giới thiệu một tv thời gian để thời gian nó ra nhưng điều này không xuất hiện để được làm việc, hoặc. Tôi có nên đóng socket ở đâu đó hay gọi FD_CLR ở đâu không? Kết quả cuối cùng phải là STDIN không chặn nhưng hiện tại nó bị chặn. cảm ơnChọn() chặn trên stdin, sẽ không hết thời gian

int 
wait_for_input(){ 
      fd_set fds; 
      int maxfd, sd, err, n; 
      struct sockaddr_in addr; 
      char stdbuf[BUFLEN]; 
      unsigned char udpbuf[BUFLEN]; 

      //memset(stdbuf,0x0,sizeof(stdbuf)); 
      memset(stdbuf,0x0,sizeof(udpbuf)); 

      sd = socket(AF_INET, SOCK_DGRAM, 0); 

      if(sd<0) { 
      printf("Failed to Open UDP socket"); 
      } 

      addr.sin_family = AF_INET; 
      addr.sin_addr.s_addr = htonl(INADDR_ANY); 
      addr.sin_port = htons(host_list[0]->port); 
      err = bind(sd,(struct sockaddr *) &addr,sizeof(addr)); 

      if(err < 0){ 
          printf("ERROR: Cant bind port"); 

      } 

          struct timeval tv; 
      while(1){ 
          FD_ZERO(&fds); 
          FD_SET(STDIN_FILENO,&fds); 
          FD_SET(sd,&fds); 
          tv.tv_sec = 1; 
          tv.tv_usec = 0; 
          fflush(stdout); 
          select(sd+1,&fds,NULL,NULL,&tv); 

          // If a UDP message arrives 
          if(FD_ISSET(sd,&fds)){ 
              n = recv(sd,udpbuf,sizeof(udpbuf),0); 
              unpack(udpbuf); 
              recompute_my_dv(); 
              fflush(stdout); 

          } 
          //If console data is entered. 
           if(FD_ISSET(STDIN_FILENO, &fds)){ 
              fgets(stdbuf,sizeof(stdbuf),stdin); 
              parse(stdbuf); 
              printf("server> "); 
              fflush(stdout); 
              FD_CLR(STDIN_FILENO,&fds); 


          } 

        } 



return 0; 
} 
+4

Bạn đã thử kiểm tra xem lệnh gọi 'select' có trả về không? –

+0

Bạn có biết rằng 'STDIN' là dòng đệm không? –

+0

@SergeyL - Việc tạo đường kẻ được thực hiện ở thư viện hoặc cấp thiết bị đầu cuối, không phải ở lớp POSIX. Có thể đọc stdin theo cách không bị cản trở. – Unsigned

Trả lời

0

FD_ISSET không trả lại 1 (hoặc true) nếu bạn có một tin nhắn trên đệm của ổ cắm đó, nó trả về true nếu mô tả tập tin nhất định là một phần của bộ mô tả tập tin. Đó là một vấn đề.

Tiếp theo là vòng lặp của bạn nên bắt đầu (vòng lặp while) sẽ bắt đầu trước khi chọn statment và lặp lại điều đó. Bạn nên nắm bắt giá trị được trả về bởi lựa chọn. Điều này là do chọn trả về số lượng bit trong bộ đệm bạn đã chỉ định trong đối số 2 của chọn (đọc, viết hoặc lỗi). Vì vậy, nếu bạn chỉ định đọc là bộ đệm, bạn sẽ muốn đọc bao nhiêu bit được trả về bằng cách chọn.

Tôi nghĩ đó là 2 vấn đề chính. Hi vọng điêu nay co ich.

Các vấn đề liên quan