我是套接字編程的新手,我已經介紹了select()
系統調用。我的問題是,可以說我正在用C編寫一個服務器(我試圖這樣做),並且我想在我的實現中使用select()
調用來練習。我試圖編寫一個從客戶端接收信息的服務器,所以我的方法是使用select()
,然後是read()
並輸出信息。在select()調用後知道哪些文件描述符已準備就緒C
根據我已閱讀的文檔select()
返回數字文件描述符在輸入集準備I/O。我的問題是,如何知道哪個原始集合中的文件描述符是準備好用於I/O的文件描述符?我似乎無法在搜索過程中找到這些信息,或者我在過去查看了過去的示例。
比方說,我的代碼看起來像下面:
int main() {
/* Create socket/server variables */
int select_value;
int this_socket;
int maxfd;
struct sockadder_in address;
fd_set allset;
/* Bind the socket to a port */
main_socket = socket(AF_INET, SOCK_STREAM, 0);
if (main_socket < 0) {
perror("socket()");
exit(1);
}
Connect(main_socket, (struct sockaddr *)&address, sizeof(address));
/* Add the socket to the list of fds to be monitored */
FD_ZERO(&allset);
FD_SET(main_socket, &allset);
fd_set read_ready = allset;
fd_set write_ready = allset;
while (1) {
/* Listen for a connection */
/* Accept a connection */
select_value = Select(maxfd+1, &read_ready, &write_ready, NULL, NULL);
if (select_value == -1) {
perror("select()");
exit(1);
}
else if(select_value > 0) {
/* How to access i/o ready file descriptors
now that we know there are some available? */
}
}
}
考慮使用[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)而不是舊的'select'。谷歌的「C10K問題」 –
我肯定會考慮它的未來實踐項目,感謝您的建議! – karysto
RTFM,特別是'select'和'select_tut'的手冊頁。 –