2011-05-24 56 views
1

我在寫一個執行服務器 - 客戶端關係的程序。
在程序中,我使用select()以獲取客戶端的請求,以及用戶從stdin發出的請求(服務器後面的請求)。
它似乎是select()適合客戶的要求,但似乎沒有迴應來自stdin的輸入。
此外,我沒有成功從stdinrecv()。 有沒有辦法以非阻塞的方式從stdin獲取輸入?我試過使用fgets()而不是select(),並且我已經將fcntl()設置爲非阻塞,它似乎不起作用 - 它仍然阻塞。使用select()從stdin讀取 - 以非阻塞的方式

你有什麼建議? 謝謝。

+0

您可以發佈基於怎樣你試過一些代碼? – cpx 2011-05-24 07:29:44

+0

winsock意味着windows? ;)我認爲select()僅適用於Windows上的套接字,文件處理程序不能通過select來處理,但可以在Unix上獲得文件描述符並將其添加到FD_SET – tvn 2011-05-24 07:49:59

+0

什麼是stdin連接到常規文件?管?插座?它是如何打開的?嘗試發佈展示該問題的小程序。 – Gilles 2011-05-24 08:26:32

回答

1

stdin是行緩衝的 - 你不能以非阻塞的方式讀取它。

+1

行緩衝是C或C++標準庫流的函數,在諸如'recv()'和'select()'等POSIX I/O系統調用級別上沒有意義。對於問題中的「stdin」,如果有幫助,請閱讀「STDIN_FILENO」。 – JdeBP 2011-05-24 13:48:31

0

您總是可以使用kbhit來查看輸入緩衝區是否有任何字符準備好被讀取。

在你不必kbhit訪問時,這裏是一個簡單的實現我已經在過去使用:

int kbhit() { 
    int count = 0; 
    struct termios otty, ntty; 
    tcgetattr(STDIN_FILENO, &otty); 
    ntty = otty; 
    ntty.c_lflag &= ~ICANON; 
    if(tcsetattr(STDIN_FILENO, TCSANOW, &ntty) == 0) { 
     ioctl(STDIN_FILENO, FIONREAD, &count); 
     tcsetattr(STDIN_FILENO, TCSANOW, &otty); 
    } 
    return count; 
}