2012-02-20 70 views
0

我正在寫這個使用ncurses作爲接口的聊天程序。我想如何同時處理socket文件描述符和用戶interation?我的想法如下。問題是現在循環只爲我按下的每個按鈕執行一次。我如何構建我的程序,以便套接字和用戶交互在準備好後立即進行處理?我試圖讓我的民意調查包含標準輸入和輸出的文件描述符,但這不起作用。如何同時處理用戶交互和套接字事件?

while(ch = getch()) { 
    poll sockets 
    loop sockets { 
     ... 
    } 
    switch(ch) { 
     ... 
    } 
} 

也作爲一個更一般的問題。人們通常會如何編寫處理用戶交互和其他事情的程序?看起來好像會有這樣做的標準方式。

回答

1

您可以在輸入屏幕上嘗試nodelay()

nodelay(stdscr,TRUE); // turn off getch() blocking 

while(getch() == ERR) 
{ 
    //do other stuff 
} 
else 
    //handle input 

但是你有可能想要穿線。

0

建立一個包含STDIN的文件描述符集(FD_SET)以及您正在嘗試讀取的套接字,然後在集上使用select()。像下面這樣::

int main(int argc, char **argv) 
{ 
    fd_set fds; 
    int fd = open(/* your socket */); 
    struct timeval tv; 

    FD_ZERO(&fds); 
    FD_SET(STDIN_FILENO, &fds); 
    FD_SET(fd, &fds); 

    while (1) { 
    tv.tv_sec = 1; // wait for up to 1 sec 
    int retval = select(2, &fds, NULL, NULL, &tv); 
    if (retval > 0) { 
     if (FD_ISSET(STDIN_FILENO, &fds)) 
      // process stdin 
     else if (FD_ISSET(fd, &fds)) 
      // process data from your socket 
    } else if (retval == 0) 
     // timeout 
    else 
     // some error 
    } 
    exit 0; 
} 

(注意我沒編譯這個,但你應該明白我的意思。)

fd_setselect tutorial