關於FD_WRITE、FD_READ

來源:互聯網
上載者:User

只有在三種條件下,才會發出FD_WRITE通知:
■ 使用connect或WSAConnect,一個通訊端首次建立了串連。
■ 使用accept或WSAAccept,通訊端被接受以後。
■ 若send、WSASend、sendto或WSASendTo操作失敗,返回了WSAEWOULDBLOCK錯誤,而且緩衝區的空間變得可用

因此,作為一個應用程式,自收到首條FD_WRITE訊息開始,便應認為自己必然能在一
個通訊端上發出資料,直至一個send、WSASend、sendto或WSASendTo返回通訊端錯誤
WSAEWOULDBLOCK。經過了這樣的失敗以後,要再用另一條FD_WRITE通知應用程式再
次發送資料。

 

 

FD_READ事件觸發條件:
1.在資料到達socket後,並且從來沒有觸發過FD_READ(也就是最開始的階段)
2.在資料到達socket後,並且前一個recv()調用後
3.調用recv()後,緩衝區還有未讀完的資料

 

FD_READ過程如下:
1.100 bytes 資料到達,winsock2發出FD_READ
2.程式用recv()唯讀入50 bytes,還剩下50 bytes
3.winsock2繼續發出FD_READ訊息

recv()返回WSAEWOULDBLOCK的情況:
1.有資料到達,FD_READ觸發,該訊息加入程式的訊息佇列
2.在還沒處理該訊息前,程式就把資料recv()了
3.等到處理該FD_READ訊息時,程式調用recv()就會返回WSAEWOULDBLOCK(因為資料在這之前就recv()了)

注意:
1.winsock2發出一個FD_READ後,如果程式沒有用recv(),即使還有資料沒接收FD_READ也不會再觸發另一個FD_READ,要等到recv()調用後FD_READ才會發出。
2.對一個FD_READ多次recv()的情形:如果程式對一個FD_READ多次recv()將會造成觸發多個空的FD_READ,所以程式在第2次recv()前要關掉FD_READ(可以使用WSAAsynSelect關掉FD_READ),然後再多次recv()。
3.recv()返回WSAECONNABORTED,WSAECONNRESET...等訊息,可以不做任何處理,可以等到FD_CLOSE事件觸發時再處理

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.