1. WSAEWOULDBLOCK 錯誤說明
在非鎖定套接字上
函數名 |
說明 |
WSAAccept, accept |
應用程序沒有收到連接請求,再次調用,便可檢查連接情況 |
closesocket |
大多數情況下,這個錯誤意味著已隨SO_LINGER選項一道調用了 setsockopt,而且已設定了一個非零的超時值 |
WSAConnect, connect |
應用程序已初始化,再次調用,便可檢查是否完成 |
WSARecv,recv WSARecvFrom, recvfrom |
沒有收到數據,銷后再次檢查
|
WSASend, send WSASendTo, sendto |
外出數據無緩沖區可用,銷后再試
|
2. FD_WRITE 觸發條件
只有在三種條件下,才會發出 FD_WRITE 通知:
. connect, WSAConnect ,一個套接字首次建立了連接;
. accept, WSAAccept, 套接字被接受以后;
. send, WSASend, sendto, WSASendTo操作失敗,返回了 WSAEWOULDBLOCK 錯誤,而且緩沖再次變得可用時。
碰到了問題:
我現在碰到WSAEWOULDBLOCK錯誤消息的時候,場景很有可能是這樣子的:
1.發送緩沖滿了;
2.處于忙狀態。
如何解決
一般來說,第一種場景是不太多發生的,而是第二種情況會很多,有可能是網絡不好也有可能是服務器處理不及很繁忙。MSDN里面顯示,在此時,如果發送緩沖空出來,系統會發送一個FD_WRITE消息給發送者,這時候再把發送失敗的包重新發送即可。如果是緩沖區滿了導致的,那么肯定會觸發一條FDWRITE消息的。不過也有可能是因為忙,那么,我們可以在觸發了WSAEWOULDBLOCK錯誤的時候,把數據放置到隊列里面,給自己發送一條FD_WRITE或許也是可行的辦法。
不過根據上面的資料顯示,觸發條件總共有三種,收到此消息的時候可能不能辨別究竟是哪一個,其實這個很好辦,只要設置一個發送隊列,如果發送隊列不為空,那么發送之,否則就重新進行連接或者重新進行接受。