作者godman362 (青)
看板C_and_CPP
標題[問題] select read & write同一fd
時間Thu Jul 30 19:53:49 2009
請問各位
就是我目前要對一個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