2013-04-22 2 views
5

私はUDPメッセージを受信するだけでなく、ユーザーからの入力も受け取りますが、STDINはまだselectでブロックしています。 FD_CLRを選択する前にstdin fdを実行すると、プログラムは正常に実行され、stdinソケットは常にデータを読み込む準備ができていることを示します。私はそれを時間切れにするために時間のテレビを導入しようとしましたが、これはどちらかのように動作しているように見えません。どこかでソケットを閉じたり、FD_CLRを呼び出すべきですか? 最終結果はブロックされていないSTDINである必要がありますが、現在はブロックされています。 はFD_ISSETは、あなたがそのソケットのバッファにメッセージを持っている場合、指定したファイルディスクリプタはファイルディスクリプタセットの一部である場合、それはtrueを返します1(またはtrue)を返しませんstdinでSelect()をブロックしてもタイムアウトしません

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

'select'呼び出しが返すものを確認しようとしましたか? –

+0

あなたは 'STDIN'がラインバッファであることを知っていますか? –

+0

@SergeyL - ラインバッファリングは、ライブラリまたは端末レベルで行われ、POSIXレイヤーでは行われません。 stdinをバッファなしで読み取ることは可能です。 – Unsigned

答えて

0

ありがとうございました。それは一つの問題です。

次は、ループを開始する必要があります(whileループはそれです)。これはselect文の前に開始し、ループします。選択によって返される値を取得する必要があります。 selectは、select(read、write、またはerror)の引数2で指定したバッファ内のビット数を返します。バッファーとしてreadを指定した場合、selectによってどのくらいのビットが返されたかを知りたいでしょう。

私はそれらが2つの主要な問題だと思います。お役に立てれば。

関連する問題