2014-03-19 34 views
0

我有這樣的:選擇()不拾取標準輸入

#define STDIN 0 

    char buffer[512]; 
    bzero(buffer,512); 
    struct sockaddr_in from; 
    string input; 
    RoutingMessage parser; 

    cout << "Listening...\n"; 

     /* Temporary fix. 
    /* This should be abstracted, and more widely used 
    /********* Start Select() ***********/ 
    fd_set readfds; 
    struct timeval tv; 
    tv.tv_sec = 120; 
    tv.tv_usec = 0; //wait for 1.5 second here 

    int rv = 1; 

    // clear the set ahead of time 
    FD_ZERO(&readfds); 

    // add our descriptors to the set 
    FD_SET(mySocket, &readfds); 
    FD_SET(STDIN, &readfds); 

    // the n param for select() 
    int n = mySocket + 1; 
    /********* End Select() ***********/ 

    while(rv != 0) 
    { 
     rv = select(n, &readfds, NULL, NULL, &tv); 

     if (rv == -1) 
      perror("select"); // error occurred in select() 

     if (FD_ISSET(STDIN, &readfds)) 
     { 
       cin >> input; 
       cout << input << endl; 
     } 
     else 
     { 
      bzero(buffer,512); 
      int n = recvfrom(mySocket,buffer,512,0,(struct sockaddr *)&from, &sockLen); 

      if (n < 0) 
       perror("recvfrom"); 

      if (n > 0) 
      { 
       parser.ParseMessage(buffer, fromNode, messages); 
       ProcessMessages(); 
      } 
     } 
    } 

然而,當我嘗試在我的程序輸入任何東西,我沒有得到來自COUT響應:

Listening... 
3702 has converged! 
3701 has converged! 
3703 has converged! 
test 
// blank line 

難道我做錯了什麼?

+0

對不起 - 現在澄清 – MrDuk

回答

2

選擇更改您傳入的readfds。每次調用select時,都必須提供要觀看事件的文件描述符。例如

while(rv != 0) { 
    FD_ZERO(&readfds); 
    FD_SET(mySocket, &readfds); 
    FD_SET(STDIN, &readfds); 
    rv = select(n, &readfds, NULL, NULL, &tv); 
+0

美麗。謝謝。 – MrDuk