2016-04-22 12 views
3

我用選擇同步I/O多路複用。它將檢查任何數據1秒.1秒後,如果沒有數據,它會顯示一個輸出(puts("Waited for 1 sec no data");)然後它會再次檢查數據。但這是工作只有在第一時間,它纔會進入無限循環。 有沒有其他解決方案。如何在C中超時後調用select?

//.............................. 
//............................. 
//Creating listener socket and other sort of things 
struct timeval tv; 
     tv.tv_sec=1; 
     tv.tv_usec=0; 

    while(1) 
    { 
    FD_ZERO(master); 


    FD_SET(listener,master); 
    fdmax = listener; 
    int retval=select(fdmax+1,master, NULL, NULL,&tv); 
    printf("retval is %d\n",retval); 

      if(retval == -1) 
      { 
        perror("Server-select() error"); 
      }else if(retval) 
      { 
        puts("Data available"); 
        //If there is no data do some work and checkagain. 

      }else 
      { 
        puts("Waited for 1 sec no data"); 
        //If there is no data do some work and checkagain. 

      } 
     } 
+0

了'timeval'結構宣告超時。如果你想在I/O之間等待一秒鐘,你應該按照@Pierre的建議。 – Leonard

+0

select()在超時後關閉套接字嗎? –

+2

非常徹底地閱讀'select'的手冊頁。它有很多提示:*考慮在select()返回後未定義超時。* – tofro

回答

2

man select

在Linux中,選擇()修改的超時,以反映的時間沒有睡量;大多數其他實現不這樣做。 (POSIX.1-2001允許任一行爲)。當讀取超時的Linux代碼移植到其他操作系統時,以及將代碼移植到Linux時,會導致問題,該代碼重複使用循環中的多個select()s的結構timeval重新初始化它。考慮在select()返回後超時被定義爲undefined。

所以像master,你必須每次select調用之前設置tv

在我的代碼,我經常碰到這樣的:

FD_ZERO(master); 
FD_SET(listener,master); 
fdmax = listener; 

while (1) 
{ 
    struct timeval tv = {1, 0}; 

    int retval=select(fdmax+1,master, NULL, NULL,&tv); 
    printf("retval is %d\n",retval); 

    if(retval == -1) { 
     perror("Server-select() error"); 
     break; // <-- notice the break here 
    } else if(retval) { 
     puts("Data available"); 
    } else { 
     puts("Waited for 1 sec no data"); 
    } 
} 
相關問題