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

📄 socketft_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
00239         <span class="keywordflow">else</span>00240         {00241                 timeval timeoutCopy = *timeout; <span class="comment">// select() modified timeout on Linux</span>00242                 ready = select(m_s+1, &amp;fds, NULL, NULL, &amp;timeoutCopy);00243         }00244         CheckAndHandleError_int(<span class="stringliteral">"select"</span>, ready);00245         <span class="keywordflow">return</span> ready &gt; 0;00246 }00247 <a name="l00248"></a><a class="code" href="class_socket.html#_socket_sourcee0">00248</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_socket.html#_socket_sourcee0">Socket::PortNameToNumber</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> <span class="keywordtype">char</span> *protocol)00249 {00250         <span class="keywordtype">int</span> port = atoi(name);00251         <span class="keywordflow">if</span> (IntToString(port) == name)00252                 <span class="keywordflow">return</span> port;00253 00254         servent *se = getservbyname(name, protocol);00255         <span class="keywordflow">if</span> (!se)00256                 <span class="keywordflow">throw</span> <a class="code" href="class_socket_1_1_err.html">Err</a>(INVALID_SOCKET, <span class="stringliteral">"getservbyname"</span>, SOCKET_EINVAL);00257         <span class="keywordflow">return</span> ntohs(se-&gt;s_port);00258 }00259 <a name="l00260"></a><a class="code" href="class_socket.html#_socket_sourcee1">00260</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#_socket_sourcee1">Socket::StartSockets</a>()00261 {00262 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span>00263 <span class="preprocessor"></span>        WSADATA wsd;00264         <span class="keywordtype">int</span> result = WSAStartup(0x0002, &amp;wsd);00265         <span class="keywordflow">if</span> (result != 0)00266                 <span class="keywordflow">throw</span> <a class="code" href="class_socket_1_1_err.html">Err</a>(INVALID_SOCKET, <span class="stringliteral">"WSAStartup"</span>, result);00267 <span class="preprocessor">#endif</span>00268 <span class="preprocessor"></span>}00269 <a name="l00270"></a><a class="code" href="class_socket.html#_socket_sourcee2">00270</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#_socket_sourcee2">Socket::ShutdownSockets</a>()00271 {00272 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span>00273 <span class="preprocessor"></span>        <span class="keywordtype">int</span> result = WSACleanup();00274         <span class="keywordflow">if</span> (result != 0)00275                 <span class="keywordflow">throw</span> <a class="code" href="class_socket_1_1_err.html">Err</a>(INVALID_SOCKET, <span class="stringliteral">"WSACleanup"</span>, result);00276 <span class="preprocessor">#endif</span>00277 <span class="preprocessor"></span>}00278 <a name="l00279"></a><a class="code" href="class_socket.html#_socket_sourcee3">00279</a> <span class="keywordtype">int</span> <a class="code" href="class_socket.html#_socket_sourcee3">Socket::GetLastError</a>()00280 {00281 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span>00282 <span class="preprocessor"></span>        <span class="keywordflow">return</span> WSAGetLastError();00283 <span class="preprocessor">#else</span>00284 <span class="preprocessor"></span>        <span class="keywordflow">return</span> errno;00285 <span class="preprocessor">#endif</span>00286 <span class="preprocessor"></span>}00287 <a name="l00288"></a><a class="code" href="class_socket.html#_socket_sourcee4">00288</a> <span class="keywordtype">void</span> <a class="code" href="class_socket.html#_socket_sourcee4">Socket::SetLastError</a>(<span class="keywordtype">int</span> errorCode)00289 {00290 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span>00291 <span class="preprocessor"></span>        WSASetLastError(errorCode);00292 <span class="preprocessor">#else</span>00293 <span class="preprocessor"></span>        errno = errorCode;00294 <span class="preprocessor">#endif</span>00295 <span class="preprocessor"></span>}00296 00297 <span class="keywordtype">void</span> Socket::HandleError(<span class="keyword">const</span> <span class="keywordtype">char</span> *operation)<span class="keyword"> const</span>00298 <span class="keyword"></span>{00299         <span class="keywordtype">int</span> err = <a class="code" href="class_socket.html#_socket_sourcee3">GetLastError</a>();00300         <span class="keywordflow">throw</span> Err(m_s, operation, err);00301 }00302 00303 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span>00304 <span class="preprocessor"></span>00305 SocketReceiver::SocketReceiver(<a class="code" href="class_socket.html">Socket</a> &amp;s)00306         : m_s(s), m_resultPending(false), m_eofReceived(false)00307 {00308         m_event.AttachHandle(CreateEvent(NULL, <span class="keyword">true</span>, <span class="keyword">false</span>, NULL), <span class="keyword">true</span>);00309         m_s.CheckAndHandleError(<span class="stringliteral">"CreateEvent"</span>, m_event.HandleValid());00310         memset(&amp;m_overlapped, 0, <span class="keyword">sizeof</span>(m_overlapped));00311         m_overlapped.hEvent = m_event;00312 }00313 00314 <span class="keywordtype">void</span> SocketReceiver::Receive(byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00315 {00316         assert(!m_resultPending &amp;&amp; !m_eofReceived);00317 00318         DWORD flags = 0;00319         WSABUF wsabuf = {bufLen, (<span class="keywordtype">char</span> *)buf};00320         <span class="keywordflow">if</span> (WSARecv(m_s, &amp;wsabuf, 1, &amp;m_lastResult, &amp;flags, &amp;m_overlapped, NULL) == 0)00321         {00322                 <span class="keywordflow">if</span> (m_lastResult == 0)00323                         m_eofReceived = <span class="keyword">true</span>;00324         }00325         <span class="keywordflow">else</span>00326         {00327                 <span class="keywordflow">switch</span> (WSAGetLastError())00328                 {00329                 <span class="keywordflow">default</span>:00330                         m_s.CheckAndHandleError_int(<span class="stringliteral">"WSARecv"</span>, SOCKET_ERROR);00331                 <span class="keywordflow">case</span> WSAEDISCON:00332                         m_lastResult = 0;00333                         m_eofReceived = <span class="keyword">true</span>;00334                         <span class="keywordflow">break</span>;00335                 <span class="keywordflow">case</span> WSA_IO_PENDING:00336                         m_resultPending = <span class="keyword">true</span>;00337                 }00338         }00339 }00340 00341 <span class="keywordtype">void</span> SocketReceiver::GetWaitObjects(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &amp;container)00342 {00343         <span class="keywordflow">if</span> (m_resultPending)00344                 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera4">AddHandle</a>(m_event);00345         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m_eofReceived)00346                 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera2">SetNoWait</a>();00347 }00348 00349 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SocketReceiver::GetReceiveResult()00350 {00351         <span class="keywordflow">if</span> (m_resultPending)00352         {00353                 DWORD flags = 0;00354                 <span class="keywordflow">if</span> (WSAGetOverlappedResult(m_s, &amp;m_overlapped, &amp;m_lastResult, <span class="keyword">false</span>, &amp;flags))00355                 {00356                         <span class="keywordflow">if</span> (m_lastResult == 0)00357                                 m_eofReceived = <span class="keyword">true</span>;00358                 }00359                 <span class="keywordflow">else</span>00360                 {00361                         <span class="keywordflow">switch</span> (WSAGetLastError())00362                         {00363                         <span class="keywordflow">default</span>:00364                                 m_s.CheckAndHandleError(<span class="stringliteral">"WSAGetOverlappedResult"</span>, FALSE);00365                         <span class="keywordflow">case</span> WSAEDISCON:00366                                 m_lastResult = 0;00367                                 m_eofReceived = <span class="keyword">true</span>;00368                         }00369                 }00370                 m_resultPending = <span class="keyword">false</span>;00371         }00372         <span class="keywordflow">return</span> m_lastResult;00373 }00374 00375 <span class="comment">// *************************************************************</span>00376 00377 SocketSender::SocketSender(<a class="code" href="class_socket.html">Socket</a> &amp;s)00378         : m_s(s), m_resultPending(false), m_lastResult(0)00379 {00380         m_event.AttachHandle(CreateEvent(NULL, <span class="keyword">true</span>, <span class="keyword">false</span>, NULL), <span class="keyword">true</span>);00381         m_s.CheckAndHandleError(<span class="stringliteral">"CreateEvent"</span>, m_event.HandleValid());00382         memset(&amp;m_overlapped, 0, <span class="keyword">sizeof</span>(m_overlapped));00383         m_overlapped.hEvent = m_event;00384 }00385 00386 <span class="keywordtype">void</span> SocketSender::Send(<span class="keyword">const</span> byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00387 {00388         DWORD written = 0;00389         WSABUF wsabuf = {bufLen, (<span class="keywordtype">char</span> *)buf};00390         <span class="keywordflow">if</span> (WSASend(m_s, &amp;wsabuf, 1, &amp;written, 0, &amp;m_overlapped, NULL) == 0)00391         {00392                 m_resultPending = <span class="keyword">false</span>;00393                 m_lastResult = written;00394         }00395         <span class="keywordflow">else</span>00396         {00397                 <span class="keywordflow">if</span> (WSAGetLastError() != WSA_IO_PENDING)00398                         m_s.CheckAndHandleError_int(<span class="stringliteral">"WSASend"</span>, SOCKET_ERROR);00399 00400                 m_resultPending = <span class="keyword">true</span>;00401         }00402 }00403 00404 <span class="keywordtype">void</span> SocketSender::GetWaitObjects(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &amp;container)00405 {00406         <span class="keywordflow">if</span> (m_resultPending)00407                 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera4">AddHandle</a>(m_event);00408         <span class="keywordflow">else</span>00409                 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera2">SetNoWait</a>();00410 }00411 00412 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SocketSender::GetSendResult()00413 {00414         <span class="keywordflow">if</span> (m_resultPending)00415         {00416                 DWORD flags = 0;00417                 BOOL result = WSAGetOverlappedResult(m_s, &amp;m_overlapped, &amp;m_lastResult, <span class="keyword">false</span>, &amp;flags);00418                 m_s.CheckAndHandleError(<span class="stringliteral">"WSAGetOverlappedResult"</span>, result);00419                 m_resultPending = <span class="keyword">false</span>;00420         }00421         <span class="keywordflow">return</span> m_lastResult;00422 }00423 00424 <span class="preprocessor">#endif</span>00425 <span class="preprocessor"></span>00426 <span class="preprocessor">#ifdef USE_BERKELEY_STYLE_SOCKETS</span>00427 <span class="preprocessor"></span>00428 SocketReceiver::SocketReceiver(<a class="code" href="class_socket.html">Socket</a> &amp;s)00429         : m_s(s), m_lastResult(0), m_eofReceived(false)00430 {00431 }00432 00433 <span class="keywordtype">void</span> SocketReceiver::GetWaitObjects(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &amp;container)00434 {00435         <span class="keywordflow">if</span> (!m_eofReceived)00436                 container.AddReadFd(m_s);00437 }00438 00439 <span class="keywordtype">void</span> SocketReceiver::Receive(byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00440 {00441         m_lastResult = m_s.Receive(buf, bufLen);00442         <span class="keywordflow">if</span> (bufLen &gt; 0 &amp;&amp; m_lastResult == 0)00443                 m_eofReceived = <span class="keyword">true</span>;00444 }00445 00446 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SocketReceiver::GetReceiveResult()00447 {00448         <span class="keywordflow">return</span> m_lastResult;00449 }00450 00451 SocketSender::SocketSender(<a class="code" href="class_socket.html">Socket</a> &amp;s)00452         : m_s(s), m_lastResult(0)00453 {00454 }00455 00456 <span class="keywordtype">void</span> SocketSender::Send(<span class="keyword">const</span> byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00457 {00458         m_lastResult = m_s.Send(buf, bufLen);00459 }00460 00461 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SocketSender::GetSendResult()00462 {00463         <span class="keywordflow">return</span> m_lastResult;00464 }00465 00466 <span class="keywordtype">void</span> SocketSender::GetWaitObjects(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &amp;container)00467 {00468         container.AddWriteFd(m_s);00469 }00470 00471 <span class="preprocessor">#endif</span>00472 <span class="preprocessor"></span>00473 NAMESPACE_END00474 00475 <span class="preprocessor">#endif  // #ifdef SOCKETS_AVAILABLE</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:26 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>

⌨️ 快捷键说明

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