📄 socketft_8cpp-source.html
字号:
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, &fds, NULL, NULL, &timeoutCopy);00243 }00244 CheckAndHandleError_int(<span class="stringliteral">"select"</span>, ready);00245 <span class="keywordflow">return</span> ready > 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->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, &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> &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(&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 && !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, &wsabuf, 1, &m_lastResult, &flags, &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> &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, &m_overlapped, &m_lastResult, <span class="keyword">false</span>, &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> &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(&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, &wsabuf, 1, &written, 0, &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> &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, &m_overlapped, &m_lastResult, <span class="keyword">false</span>, &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> &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> &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 > 0 && 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> &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> &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 + -