看板 C_and_CPP 關於我們 聯絡資訊
請問各位 就是我目前要對一個Socket fd做動作 由於他是在Server端,而且這個fd要可以做讀、寫的動作 所以我採用select做出Async I/O的作業方式 那以下簡略描述一下目前的想法: int Select_Check; /* * Socket 設定 */ ...... ...... ...... Sock.Bind(); Sock.Listen(10); FD_SET(Sock, &ReadSet); FD_SET(Sock, &WriteSet); while (1) { Select_Check = select(maxfd, &ReadSet, &WriteSet, NULL, Timeout); /* * 以下進入問題,不多做其他的判斷及處理 */ if (Select_Check) { ......... ......... ......... } } 我想請問的是黃色區塊的部份 這個部份,我是應該直接去做FD_ISSET的判斷嗎? 像是如下: if (FD_ISSET(Sock, &ReadSet) { ....... } else if (FD_ISSET(Sock, &WriteSet) { ....... } else { ....... } 我想問一下,上述的寫法會不會有問題? 因為我不懂select是用什麼去判別資料是否準備好 還請各位先進指點一番,謝謝 -- 要感謝的人太多了,那就謝天吧 要改得程式碼太多了,那就改天吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.0.83
giveatry:select就是去monitor一堆fd(rfd, wfd, ...)有沒有event 07/30 21:26
giveatry:發生,有相對於某個fd的event發生,select就會收到東西 07/30 21:26
giveatry:這是我的理解,有錯請高手嚴格指正,謝謝 07/30 21:27
godman362:read的部份我能理解,但是write的部份就不太清楚了 07/30 22:35
godman362:可否詳加說明一點,謝謝 07/30 22:35
sunneo:我猜是在TCP的時候會有重新write的關係 所以要空了才set 07/30 22:38
sunneo:manual 說 fd is ready to write 07/30 22:42
godman362:不知道我理解的對不對 07/31 08:16
godman362:看過S大的講法,也就是說memory清空之後 07/31 08:17
godman362:就是ready to write嗎? 07/31 08:17
godman362:這樣的話,select也算是edge trigger了嘛? 07/31 08:18
sunneo:我不曉得你的edge trigger是什麼意思 我只知道說 08/01 00:18
sunneo:這可以當成類似 if( kbhit() ) getch(); 的動作 08/01 00:19