?? subject_15574.htm
字號:
<p>
序號:15574 發表者:daibo 發表日期:2002-09-19 13:56:52
<br>主題:send函數問題(急)
<br>內容:TCP協議,調用SEND返回值經常為10035,意思為“無法立即完成一個非阻擋性套接字操作。”請問怎樣造成的,怎樣解決?謝謝!<BR>一定給分!
<br><a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p>
<hr size=1>
<blockquote><p>
回復者:sxho 回復日期:2002-09-19 14:42:36
<br>內容:非阻塞調用。
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回復者:Aikoc 回復日期:2002-09-19 19:18:42
<br>內容:10035 即WSAEWOULDBLOCK The socket is marked as nonblocking and the requested operation would block <BR>主要因為你使用的是non-blocking socket.<BR>當你發送數據時因為socket的buffer不夠,就會返回此errcode<BR>你只有等socket通知你可以重發數據或你自己檢測到socket<BR>可寫時,繼續發送你的數據.<BR><BR>當你發送大文件時<BR><BR>a.)如果是blocking的socket,你要循環檢測每次發送了多少,<BR>并繼續發送直至完成<BR><BR>b.)如果是non-blocking,情況比較不同,你要正確處理WSAEWOULDBLOCK<BR><BR>應為socket的內部Buffer有制,所以如果你發大文件需要分多次發。<BR>舉個WSAEventSelect的例子,<BR>socket會接受你的data直到Buffer不能處理,此時會發出WSAEWOULDBLOCK.<BR>等socket處理后,socket會通知你可再次發送.<BR>所以你可以使用send發送data,遇到SOCKET_ERROR時要判斷一下是不是WSAEWOULDBLOCK,如果是WSAEWOULDBLOCK,等write的Event觸發后繼續發送<BR>一般使用WSAWaitForMultipleEvents來處理各種socket及自己定義的Event<BR><BR>參看MSDN<BR><BR>==================================================================<BR>The send function is used to write outgoing data on a connected socket. For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted. <BR><BR>The successful completion of a send does not indicate that the data was successfully delivered.<BR><BR>If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines. The select, WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.<BR>==================================================================<BR>如果用CAsyncSocket可以<BR>CYourAsyncSocket::OnSend( int nErrorCode )<BR>{<BR>...<BR>// 繼續發送數據<BR>while(...)<BR>{<BR>result=Send(...);<BR>if (result == SOCKET_ERROR)<BR>{<BR> err = GetLastError();<BR> if(err != WSAEWOULDBLOCK)<BR> OnClose(); //發生錯誤<BR> else<BR> break;//錯誤為WSAEWOULDBLOCK時,系統會自動重新SEND()的.<BR>}<BR>}<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:r0 回復日期:2002-09-19 20:00:11
<br>內容:正常<BR>發而立即發送成功的情況少見,這也是異步 i/o 的一個特征
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:daibo 回復日期:2002-09-20 17:34:40
<br>內容:謝謝 Aikoc 的關于SEND函數返回10035的回復。我已經同意并結貼樂。<BR>但我沒有辦法解決老是返回這個錯誤的問題。<BR>因為我的數據是實時生成的,我不能控制這個數據的產生,如果我延遲一段時間再發送,就會造成數據在發送端累積,后面就更容易造成10035的錯誤。<BR>難道TCP關于這種大量數據的傳送阻塞問題沒有辦法嗎?<BR>希望能得到您的指導和幫助。
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:Aikoc 回復日期:2002-09-20 19:13:05
<br>內容:我已經回信,8-)
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -