一般socket本身可以設定屬性,阻塞或者非阻塞,阻塞模式下accept,connect,send,recv,sendto,recvfrom操作都會等待socket的訊號,send要等待操作完成後才會返回,等待的時間也是在等socket的狀態變為可寫。只不過等待的操作由作業系統來做,當前執行緒被掛起了。recv同理也一樣。非阻塞則是不管可寫或者非可寫send都會直接返回,可寫send返回寫入的位元組數,不可寫返回socket_error.這時候要不採用迴圈send的方法,直到send成功,或者用select先去檢查socket是否可寫再進行send寫入操作,同理recv也相同,檢測是否可讀,再recv讀入資料。
這中間其實有個問題,就是無論是用阻塞或者非阻塞,都只有當socket的狀態為可寫或者可讀的時候,所有的操作才會成功,借助於select可以幫助我們提前檢測socket的狀態,捨去不必要的等待或者迴圈(也是等待,不過中間可以做點事情)。而且select可以加入多個socket,並且可以設定超時,這個時候如果所有socket都沒有發生訊號改變,可以做點額外的事情。
當然更有優勢的事情是,重疊io和結合iocp(完成埠)來接受更多的連線,因為上面的事件模型,需要用waitformultievent去發現事件的狀態改變,但是wsawaitformultipleevent等待的控制代碼有上限只有64個。所以如果連線數很多,則需要將重疊io和完成埠結合起來。
同步IO和非同步IO
同步io和非同步io 簡單的說 同步在程式設計裡,一般是指某個io操作執行完後,才可以執行後面的操作。非同步則是,將某個操作給系統,主線程去忙別的事情,等核心完成操作後通知主線程非同步操作已經完成。i windows同步i o與非同步i o 執行後的效果如下 winxp sp2 vc6.0 4 心得...
同步IO和非同步IO
同步io和非同步io 有兩種型別的檔案io同步 同步檔案io和非同步檔案io。非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而 非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請...
同步IO和非同步IO
同步io和非同步io 有兩種型別的檔案io 同步 同步檔案io 和非同步檔案io 非同步檔案io 也就是重疊io 在同步檔案io 中,執行緒啟動乙個io 操作然後就立即進入等待狀態,直到io 操作完成後才醒來繼續執行。而非同步檔案io 方式中,執行緒傳送乙個io 請求到核心,然後繼續處理其他的事情,...