Re: [問題] select read & write同一fd

看板C_and_CPP (C/C++)作者 (說好的年終呢~~~~)時間16年前 (2009/07/31 12:30), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《godman362 (青)》之銘言: : 請問各位 : 就是我目前要對一個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 裡面作 : while (1) : { // select 每次都會重設 ReadSet WriteSet // 所以要在 select 之前都要初始化這兩個變數 FD_ZERO(&ReadSet); FD_ZERO(&WriteSet); FD_SET(Sock, &ReadSet); FD_SET(Sock, &WriteSet); : Select_Check = select(maxfd, &ReadSet, &WriteSet, NULL, Timeout); : /* : * 以下進入問題,不多做其他的判斷及處理 : */ : if (Select_Check) { // Select_Check 會有三種回傳值 // > 0 多少個 io 有資料可以處理 // == 0 timeout // < 0 其他錯誤 , 有可能是收到 signal : ......... : ......... : ......... : } : } : 我想請問的是黃色區塊的部份 : 這個部份,我是應該直接去做FD_ISSET的判斷嗎? : 像是如下: : if (FD_ISSET(Sock, &ReadSet) { : ....... : } : else if (FD_ISSET(Sock, &WriteSet) { : ....... : } : else { : ....... : } : 我想問一下,上述的寫法會不會有問題? 是的這邊就這樣判斷就好 : 因為我不懂select是用什麼去判別資料是否準備好 : 還請各位先進指點一番,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.160.66

07/31 13:42, , 1F
請教一下,如果fd_set的內容每次迴圈都重設的話
07/31 13:42, 1F

07/31 13:43, , 2F
那麼server accept到的client不就會被清光嗎?
07/31 13:43, 2F

07/31 14:26, , 3F
記錄起來就好啦 不然你也可以用一個暫時性的 fd_set
07/31 14:26, 3F

07/31 15:49, , 4F
嗯,這樣我明白了,謝謝您的指點
07/31 15:49, 4F
文章代碼(AID): #1ASdD-U1 (C_and_CPP)
文章代碼(AID): #1ASdD-U1 (C_and_CPP)