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