⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketft_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00400"></a>00400 }<a name="l00401"></a>00401 <a name="l00402"></a>00402 <a name="l00403"></a><a class="code" href="class_socket_sender.html#57da8adfa5930965b8d84197d8e5328c">00403</a> <a class="code" href="class_socket_sender.html#57da8adfa5930965b8d84197d8e5328c">SocketSender::~SocketSender</a>()<a name="l00404"></a>00404 {<a name="l00405"></a>00405 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00406"></a>00406 <span class="preprocessor"></span>        CancelIo((HANDLE) m_s.<a class="code" href="class_socket.html#fd9c1f7ef23c16a2c4290e1a0fccb142">GetSocket</a>());<a name="l00407"></a>00407 <span class="preprocessor">#endif</span><a name="l00408"></a>00408 <span class="preprocessor"></span>}<a name="l00409"></a>00409 <a name="l00410"></a><a class="code" href="class_socket_sender.html#40cbddeb410feeee718d0edc36cdb98e">00410</a> <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#40cbddeb410feeee718d0edc36cdb98e">SocketSender::Send</a>(<span class="keyword">const</span> byte* buf, <span class="keywordtype">size_t</span> bufLen)<a name="l00411"></a>00411 {<a name="l00412"></a>00412         assert(!m_resultPending);<a name="l00413"></a>00413         DWORD written = 0;<a name="l00414"></a>00414         <span class="comment">// don't queue too much at once, or we might use up non-paged memory</span><a name="l00415"></a>00415         WSABUF wsabuf = {UnsignedMin((u_long)128*1024, bufLen), (<span class="keywordtype">char</span> *)buf};<a name="l00416"></a>00416         <span class="keywordflow">if</span> (WSASend(m_s, &amp;wsabuf, 1, &amp;written, 0, &amp;m_overlapped, NULL) == 0)<a name="l00417"></a>00417         {<a name="l00418"></a>00418                 m_resultPending = <span class="keyword">false</span>;<a name="l00419"></a>00419                 m_lastResult = written;<a name="l00420"></a>00420         }<a name="l00421"></a>00421         <span class="keywordflow">else</span><a name="l00422"></a>00422         {<a name="l00423"></a>00423                 <span class="keywordflow">if</span> (WSAGetLastError() != WSA_IO_PENDING)<a name="l00424"></a>00424                         m_s.CheckAndHandleError_int(<span class="stringliteral">"WSASend"</span>, SOCKET_ERROR);<a name="l00425"></a>00425 <a name="l00426"></a>00426                 m_resultPending = <span class="keyword">true</span>;<a name="l00427"></a>00427         }<a name="l00428"></a>00428 }<a name="l00429"></a>00429 <a name="l00430"></a><a class="code" href="class_socket_sender.html#762d52e4d2a4b2692cf546d6428e7466">00430</a> <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#762d52e4d2a4b2692cf546d6428e7466">SocketSender::SendEof</a>()<a name="l00431"></a>00431 {<a name="l00432"></a>00432         assert(!m_resultPending);<a name="l00433"></a>00433         m_s.<a class="code" href="class_socket.html#44fa23c55391354e5ce763810048f534">ShutDown</a>(SD_SEND);<a name="l00434"></a>00434         m_s.<a class="code" href="class_socket.html#c29e3d5e0acd2d8d6c7fd59a7cc4bd40">CheckAndHandleError</a>(<span class="stringliteral">"ResetEvent"</span>, ResetEvent(m_event));<a name="l00435"></a>00435         m_s.<a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"WSAEventSelect"</span>, WSAEventSelect(m_s, m_event, FD_CLOSE));<a name="l00436"></a>00436         m_resultPending = <span class="keyword">true</span>;<a name="l00437"></a>00437 }<a name="l00438"></a>00438 <a name="l00439"></a><a class="code" href="class_socket_sender.html#03172911e1283f93f662d664613ae12e">00439</a> <span class="keywordtype">bool</span> <a class="code" href="class_socket_sender.html#03172911e1283f93f662d664613ae12e">SocketSender::EofSent</a>()<a name="l00440"></a>00440 {<a name="l00441"></a>00441         <span class="keywordflow">if</span> (m_resultPending)<a name="l00442"></a>00442         {<a name="l00443"></a>00443                 WSANETWORKEVENTS events;<a name="l00444"></a>00444                 m_s.<a class="code" href="class_socket.html#ebf290bcbd37f0711fcb56373b4f8f88">CheckAndHandleError_int</a>(<span class="stringliteral">"WSAEnumNetworkEvents"</span>, WSAEnumNetworkEvents(m_s, m_event, &amp;events));<a name="l00445"></a>00445                 <span class="keywordflow">if</span> ((events.lNetworkEvents &amp; FD_CLOSE) != FD_CLOSE)<a name="l00446"></a>00446                         <span class="keywordflow">throw</span> <a class="code" href="class_socket_1_1_err.html" title="exception thrown by Socket class">Socket::Err</a>(m_s, <span class="stringliteral">"WSAEnumNetworkEvents (FD_CLOSE not present)"</span>, E_FAIL);<a name="l00447"></a>00447                 <span class="keywordflow">if</span> (events.iErrorCode[FD_CLOSE_BIT] != 0)<a name="l00448"></a>00448                         <span class="keywordflow">throw</span> <a class="code" href="class_socket_1_1_err.html" title="exception thrown by Socket class">Socket::Err</a>(m_s, <span class="stringliteral">"FD_CLOSE (via WSAEnumNetworkEvents)"</span>, events.iErrorCode[FD_CLOSE_BIT]);<a name="l00449"></a>00449                 m_resultPending = <span class="keyword">false</span>;<a name="l00450"></a>00450         }<a name="l00451"></a>00451         <span class="keywordflow">return</span> m_lastResult != 0;<a name="l00452"></a>00452 }<a name="l00453"></a>00453 <a name="l00454"></a><a class="code" href="class_socket_sender.html#9f5d2a6bb5665c5b93d857485c8348e4">00454</a> <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#9f5d2a6bb5665c5b93d857485c8348e4" title="put wait objects into container">SocketSender::GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> &amp;container, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack)<a name="l00455"></a>00455 {<a name="l00456"></a>00456         <span class="keywordflow">if</span> (m_resultPending)<a name="l00457"></a>00457                 container.<a class="code" href="class_wait_object_container.html#9ce9ba96948923609861455027da7830">AddHandle</a>(m_event, <a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"SocketSender::GetWaitObjects() - result pending"</span>, &amp;callStack));<a name="l00458"></a>00458         <span class="keywordflow">else</span><a name="l00459"></a>00459                 container.<a class="code" href="class_wait_object_container.html#ce9c529ebb1956ee2cb9121bdf30402d">SetNoWait</a>(<a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"SocketSender::GetWaitObjects() - result ready"</span>, &amp;callStack));<a name="l00460"></a>00460 }<a name="l00461"></a>00461 <a name="l00462"></a><a class="code" href="class_socket_sender.html#57b0e31fa669336e1ad07070a339a4d7">00462</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket_sender.html#57b0e31fa669336e1ad07070a339a4d7">SocketSender::GetSendResult</a>()<a name="l00463"></a>00463 {<a name="l00464"></a>00464         <span class="keywordflow">if</span> (m_resultPending)<a name="l00465"></a>00465         {<a name="l00466"></a>00466                 DWORD flags = 0;<a name="l00467"></a>00467                 BOOL result = WSAGetOverlappedResult(m_s, &amp;m_overlapped, &amp;m_lastResult, <span class="keyword">false</span>, &amp;flags);<a name="l00468"></a>00468                 m_s.<a class="code" href="class_socket.html#c29e3d5e0acd2d8d6c7fd59a7cc4bd40">CheckAndHandleError</a>(<span class="stringliteral">"WSAGetOverlappedResult"</span>, result);<a name="l00469"></a>00469                 m_resultPending = <span class="keyword">false</span>;<a name="l00470"></a>00470         }<a name="l00471"></a>00471         <span class="keywordflow">return</span> m_lastResult;<a name="l00472"></a>00472 }<a name="l00473"></a>00473 <a name="l00474"></a>00474 <span class="preprocessor">#endif</span><a name="l00475"></a>00475 <span class="preprocessor"></span><a name="l00476"></a>00476 <span class="preprocessor">#ifdef USE_BERKELEY_STYLE_SOCKETS</span><a name="l00477"></a>00477 <span class="preprocessor"></span><a name="l00478"></a>00478 <a class="code" href="class_socket_receiver.html#05f59443fbdb49fe8696aa2fae78c9b2">SocketReceiver::SocketReceiver</a>(<a class="code" href="class_socket.html" title="wrapper for Windows or Berkeley Sockets">Socket</a> &amp;s)<a name="l00479"></a>00479         : m_s(s), m_lastResult(0), m_eofReceived(false)<a name="l00480"></a>00480 {<a name="l00481"></a>00481 }<a name="l00482"></a>00482 <a name="l00483"></a>00483 <span class="keywordtype">void</span> <a class="code" href="class_socket_receiver.html#a851a6020843d4311036a6f4299f9a6b" title="put wait objects into container">SocketReceiver::GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> &amp;container, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack)<a name="l00484"></a>00484 {<a name="l00485"></a>00485         <span class="keywordflow">if</span> (!m_eofReceived)<a name="l00486"></a>00486                 container.AddReadFd(m_s, <a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"SocketReceiver::GetWaitObjects()"</span>, &amp;callStack));<a name="l00487"></a>00487 }<a name="l00488"></a>00488 <a name="l00489"></a>00489 <span class="keywordtype">bool</span> <a class="code" href="class_socket_receiver.html#31e0ccf504d9c16760051f10d749c034" title="receive data from network source, returns whether result is immediately available...">SocketReceiver::Receive</a>(byte* buf, <span class="keywordtype">size_t</span> bufLen)<a name="l00490"></a>00490 {<a name="l00491"></a>00491         m_lastResult = m_s.Receive(buf, bufLen);<a name="l00492"></a>00492         <span class="keywordflow">if</span> (bufLen &gt; 0 &amp;&amp; m_lastResult == 0)<a name="l00493"></a>00493                 m_eofReceived = <span class="keyword">true</span>;<a name="l00494"></a>00494         <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00495"></a>00495 }<a name="l00496"></a>00496 <a name="l00497"></a>00497 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket_receiver.html#428a62118c6e2ca975a3d4560668b3b2">SocketReceiver::GetReceiveResult</a>()<a name="l00498"></a>00498 {<a name="l00499"></a>00499         <span class="keywordflow">return</span> m_lastResult;<a name="l00500"></a>00500 }<a name="l00501"></a>00501 <a name="l00502"></a>00502 <a class="code" href="class_socket_sender.html#c85881f31c51b8d7efe88c06c6954421">SocketSender::SocketSender</a>(<a class="code" href="class_socket.html" title="wrapper for Windows or Berkeley Sockets">Socket</a> &amp;s)<a name="l00503"></a>00503         : m_s(s), m_lastResult(0)<a name="l00504"></a>00504 {<a name="l00505"></a>00505 }<a name="l00506"></a>00506 <a name="l00507"></a>00507 <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#40cbddeb410feeee718d0edc36cdb98e">SocketSender::Send</a>(<span class="keyword">const</span> byte* buf, <span class="keywordtype">size_t</span> bufLen)<a name="l00508"></a>00508 {<a name="l00509"></a>00509         m_lastResult = m_s.Send(buf, bufLen);<a name="l00510"></a>00510 }<a name="l00511"></a>00511 <a name="l00512"></a>00512 <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#762d52e4d2a4b2692cf546d6428e7466">SocketSender::SendEof</a>()<a name="l00513"></a>00513 {<a name="l00514"></a>00514         m_s.ShutDown(SD_SEND);<a name="l00515"></a>00515 }<a name="l00516"></a>00516 <a name="l00517"></a>00517 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket_sender.html#57b0e31fa669336e1ad07070a339a4d7">SocketSender::GetSendResult</a>()<a name="l00518"></a>00518 {<a name="l00519"></a>00519         <span class="keywordflow">return</span> m_lastResult;<a name="l00520"></a>00520 }<a name="l00521"></a>00521 <a name="l00522"></a>00522 <span class="keywordtype">void</span> <a class="code" href="class_socket_sender.html#9f5d2a6bb5665c5b93d857485c8348e4" title="put wait objects into container">SocketSender::GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> &amp;container, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack)<a name="l00523"></a>00523 {<a name="l00524"></a>00524         container.AddWriteFd(m_s, <a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"SocketSender::GetWaitObjects()"</span>, &amp;callStack));<a name="l00525"></a>00525 }<a name="l00526"></a>00526 <a name="l00527"></a>00527 <span class="preprocessor">#endif</span><a name="l00528"></a>00528 <span class="preprocessor"></span><a name="l00529"></a>00529 NAMESPACE_END<a name="l00530"></a>00530 <a name="l00531"></a>00531 <span class="preprocessor">#endif  // #ifdef SOCKETS_AVAILABLE</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:24 2007 for Crypto++ by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -