ncbi_socket.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:22k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_socket.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2003/12/02 20:27:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R6.36
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_SOCKET__HPP
  10. #define CONNECT___NCBI_SOCKET__HPP
  11. /*  $Id: ncbi_socket.hpp,v 1000.3 2003/12/02 20:27:51 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov, Anton Lavrentiev
  37.  *
  38.  * File Description:
  39.  *   C++ wrapper for the C "SOCK" API (UNIX, MS-Win, MacOS, Darwin)
  40.  *   NOTE:  for more details and documentation see "ncbi_socket.h"
  41.  *     CSocket
  42.  *     CListeningSocket
  43.  *     CSocketAPI
  44.  *
  45.  * ---------------------------------------------------------------------------
  46.  */
  47. #include <connect/ncbi_socket.h>
  48. #include <corelib/ncbitype.h>
  49. #include <corelib/ncbimisc.hpp>
  50. #include <string>
  51. #include <vector>
  52. /** @addtogroup Sockets
  53.  *
  54.  * @{
  55.  */
  56. BEGIN_NCBI_SCOPE
  57. enum ECopyTimeout {
  58.     eCopyTimeoutsFromSOCK,
  59.     eCopyTimeoutsToSOCK
  60. };
  61. class NCBI_XCONNECT_EXPORT CPollable
  62. {
  63. public:
  64.     virtual
  65.     EIO_Status GetOSHandle(void* handle_buf, size_t handle_size) const = 0;
  66. protected:
  67.     CPollable(void) { };
  68.     virtual ~CPollable(void) { };
  69. private:
  70.     // disable copy constructor and assignment
  71.     CPollable(const CPollable&);
  72.     CPollable& operator= (const CPollable&);
  73. };
  74. /////////////////////////////////////////////////////////////////////////////
  75. //
  76. //  CSocket::
  77. //
  78. // NOTE:  For documentation see SOCK_***() functions in "ncbi_socket.h".
  79. //        Initially, all timeouts are infinite.
  80. //
  81. class NCBI_XCONNECT_EXPORT CSocket : public CPollable
  82. {
  83. public:
  84.     CSocket(void);
  85.     // Create a client-side socket connected to "host:port".
  86.     // NOTE 1:  the created underlying "SOCK" will be owned by the "CSocket";
  87.     // NOTE 2:  timeout from the argument becomes new eIO_Open timeout.
  88.     CSocket(const string&   host,
  89.             unsigned short  port,      // always in host byte order
  90.             const STimeout* timeout = kInfiniteTimeout,
  91.             ESwitch         log     = eDefault);
  92.     // Call Close(), then self-destruct
  93.     virtual ~CSocket(void);
  94.     // Direction is one of
  95.     //     eIO_Open  - return eIO_Success if CSocket is okay and open,
  96.     //                 eIO_Closed if closed by Close() or not yet open;
  97.     //     eIO_Read  - status of last read operation;
  98.     //     eIO_Write - status of last write operation.
  99.     // Direction eIO_Close and eIO_ReadWrite generate eIO_InvalidArg error.
  100.     EIO_Status GetStatus(EIO_Event direction) const;
  101.     // Connect to "host:port".
  102.     // NOTE 1:  should not be called if already connected;
  103.     // NOTE 2:  timeout from the argument becomes new eIO_Open timeout.
  104.     EIO_Status Connect(const string&   host,
  105.                        unsigned short  port,      // always in host byte order
  106.                        const STimeout* timeout = kDefaultTimeout,
  107.                        ESwitch         log     = eDefault);
  108.     // Reconnect to the same address.
  109.     // NOTE 1:  the socket must not be closed by the time this call is made;
  110.     // NOTE 2:  not for the sockets created by CListeningSocket::Accept();
  111.     // NOTE 3:  timeout from the argument becomes new eIO_Open timeout.
  112.     EIO_Status Reconnect(const STimeout* timeout = kDefaultTimeout);
  113.     EIO_Status Shutdown(EIO_Event how);
  114.     // NOTE:  closes the undelying SOCK only if it is owned by this "CSocket"!
  115.     EIO_Status Close(void);
  116.     // NOTE:  use CSocketAPI::Poll() to wait on several sockets at once
  117.     EIO_Status Wait(EIO_Event event, const STimeout* timeout);
  118.     // NOTE 1:  by default, initially all timeouts are infinite;
  119.     // NOTE 2:  SetTimeout(..., kDefaultTimeout) has no effect;
  120.     // Note 3:  GetTimeout(eIO_ReadWrite) returns the least
  121.     //          of eIO_Read and eIO_Write ones.
  122.     EIO_Status      SetTimeout(EIO_Event event, const STimeout* timeout);
  123.     const STimeout* GetTimeout(EIO_Event event) const;
  124.     EIO_Status Read(void* buf, size_t size, size_t* n_read = 0,
  125.                     EIO_ReadMethod how = eIO_ReadPlain);
  126.     EIO_Status PushBack(const void* buf, size_t size);
  127.     EIO_Status Write(const void* buf, size_t size, size_t* n_written = 0,
  128.                      EIO_WriteMethod how = eIO_WritePersist);
  129.     EIO_Status Abort(void);
  130.     // NOTE 1:  either of "host", "port" can be NULL to opt out from
  131.     //          obtaining the corresponding value;
  132.     // NOTE 2:  both "*host" and "*port" come out in the same
  133.     //          byte order requested by the third argument.
  134.     void GetPeerAddress(unsigned int* host, unsigned short* port,
  135.                         ENH_ByteOrder byte_order) const;
  136.     // Return textual string representing the peer's address
  137.     string GetPeerAddress(void) const;
  138.     // Specify if this "CSocket" is to own the underlying "SOCK".
  139.     // Return previous ownership mode.
  140.     EOwnership SetOwnership(EOwnership if_to_own);
  141.     // Access to the underlying "SOCK" and the system-specific socket handle.
  142.     SOCK               GetSOCK    (void) const;
  143.     virtual EIO_Status GetOSHandle(void* handle_buf, size_t handle_size) const;
  144.     // NOTE:  use CSocketAPI::SetReadOnWrite() to set the default value
  145.     ESwitch SetReadOnWrite(ESwitch read_on_write = eOn);
  146.     // NOTE:  use CSocketAPI::SetDataLogging() to set the default value
  147.     ESwitch SetDataLogging(ESwitch log = eOn);
  148.     // NOTE:  use CSocketAPI::SetInterruptOnSignal() to set the default value
  149.     ESwitch SetInterruptOnSignal(ESwitch interrupt = eOn);
  150.     // NOTE:  use CSocketAPI::SetReuseAddress() to set the default value
  151.     void    SetReuseAddress(ESwitch reuse = eOff);
  152.     bool IsClientSide(void) const;
  153.     bool IsServerSide(void) const;
  154.     bool IsDatagram  (void) const;
  155.     // Close the current underlying "SOCK" (if any, and if owned),
  156.     // and from now on use "sock" as the underlying "SOCK" instead.
  157.     // NOTE:  "if_to_own" applies to the (new) "sock"
  158.     void Reset(SOCK sock, EOwnership if_to_own, ECopyTimeout whence);
  159. protected:
  160.     SOCK       m_Socket;
  161.     EOwnership m_IsOwned;
  162. private:
  163.     // disable copy constructor and assignment
  164.     CSocket(const CSocket&);
  165.     CSocket& operator= (const CSocket&);
  166.     // Timeouts
  167.     STimeout* o_timeout;  // eIO_Open
  168.     STimeout* r_timeout;  // eIO_Read
  169.     STimeout* w_timeout;  // eIO_Write
  170.     STimeout* c_timeout;  // eIO_Close
  171.     STimeout oo_timeout;  // storage for o_timeout
  172.     STimeout rr_timeout;  // storage for r_timeout
  173.     STimeout ww_timeout;  // storage for w_timeout
  174.     STimeout cc_timeout;  // storage for c_timeout
  175. };
  176. /////////////////////////////////////////////////////////////////////////////
  177. //
  178. //  CDatagramSocket::
  179. //
  180. //    Datagram socket
  181. //
  182. // NOTE:  for documentation see DSOCK_***() functions in "ncbi_socket.h"
  183. //
  184. class NCBI_XCONNECT_EXPORT CDatagramSocket : public CSocket
  185. {
  186. public:
  187.     // NOTE:  the created underlying "SOCK" will be owned by the object
  188.     CDatagramSocket(ESwitch do_log = eDefault);
  189.     EIO_Status Bind(unsigned short port);
  190.     // NOTE:  unlike system's connect() this method only specifies the default
  191.     // destination, and does not restrict the source of the incoming messages.
  192.     EIO_Status Connect(const string& host, unsigned short port);
  193.     EIO_Status Wait(const STimeout* timeout = kInfiniteTimeout);
  194.     EIO_Status Send(const void*     data    = 0,
  195.                     size_t          datalen = 0,
  196.                     const string&   host    = string(),
  197.                     unsigned short  port    = 0);
  198.     EIO_Status Recv(void*           buf         = 0,
  199.                     size_t          buflen      = 0,
  200.                     size_t*         msglen      = 0,
  201.                     string*         sender_host = 0,
  202.                     unsigned short* sender_port = 0,
  203.                     size_t          maxmsglen   = 0);
  204.     EIO_Status Clear(EIO_Event direction);
  205.     EIO_Status SetBroadcast(bool do_broadcast = true);
  206. protected:
  207.     // NOTE: these calls are not valid with datagram sockets
  208.     EIO_Status Shutdown(EIO_Event how);
  209.     EIO_Status Reconnect(const STimeout* timeout);
  210.     EIO_Status Abort(void);
  211. private:
  212.     // disable copy constructor and assignment
  213.     CDatagramSocket(const CDatagramSocket&);
  214.     CDatagramSocket& operator= (const CDatagramSocket&);
  215. };
  216. /////////////////////////////////////////////////////////////////////////////
  217. //
  218. //  CListeningSocket::
  219. //
  220. //    Listening socket (to accept connections on the server side)
  221. //
  222. // NOTE:  for documentation see LSOCK_***() functions in "ncbi_socket.h"
  223. //
  224. class NCBI_XCONNECT_EXPORT CListeningSocket : public CPollable
  225. {
  226. public:
  227.     CListeningSocket(void);
  228.     // NOTE:  "port" ought to be in host byte order
  229.     CListeningSocket(unsigned short port, unsigned short backlog = 5);
  230.     // Call Close(), then self-destruct
  231.     virtual ~CListeningSocket(void);
  232.     // Return eIO_Success if CListeningSocket is opened and bound;
  233.     // Return eIO_Closed if not yet bound or Close()'d.
  234.     EIO_Status GetStatus(void) const;
  235.     // NOTE:  "port" ought to be in host byte order
  236.     EIO_Status Listen(unsigned short port, unsigned short backlog = 5);
  237.     // NOTE: the created "CSocket" will own its underlying "SOCK"
  238.     EIO_Status Accept(CSocket*& sock,
  239.                       const STimeout* timeout = kInfiniteTimeout) const;
  240.     EIO_Status Accept(CSocket&  sock,
  241.                       const STimeout* timeout = kInfiniteTimeout) const;
  242.     // NOTE:  closes the undelying LSOCK only if it is owned by this object!
  243.     EIO_Status Close(void);
  244.     // Specify if this "CListeningSocket" is to own the underlying "LSOCK".
  245.     // Return previous ownership mode.
  246.     EOwnership SetOwnership(EOwnership if_to_own);
  247.     // Access to the underlying "LSOCK" and the system-specific socket handle
  248.     LSOCK              GetLSOCK   (void) const;
  249.     virtual EIO_Status GetOSHandle(void* handle_buf, size_t handle_size) const;
  250. private:
  251.     LSOCK      m_Socket;
  252.     EOwnership m_IsOwned;
  253.     // disable copy constructor and assignment
  254.     CListeningSocket(const CListeningSocket&);
  255.     CListeningSocket& operator= (const CListeningSocket&);
  256. };
  257. /////////////////////////////////////////////////////////////////////////////
  258. //
  259. //  CSocketAPI::
  260. //
  261. //    Global settings related to the socket API
  262. //
  263. // NOTE:  for documentation see SOCK_***() functions in "ncbi_socket.h"
  264. //
  265. class NCBI_XCONNECT_EXPORT CSocketAPI
  266. {
  267. public:
  268.     // Generic
  269.     static const STimeout* SetSelectInternalRestartTimeout(const STimeout* t);
  270.     static void         AllowSigPipe(void);
  271.     static EIO_Status   Initialize  (void);
  272.     static EIO_Status   Shutdown    (void);
  273.     // Defaults  (see also per-socket CSocket::SetReadOnWrite, etc.)
  274.     static ESwitch SetReadOnWrite       (ESwitch read_on_write);
  275.     static ESwitch SetDataLogging       (ESwitch log);
  276.     static ESwitch SetInterruptOnSignal (ESwitch interrupt);
  277.     static ESwitch SetReuseAddress      (ESwitch reuse);
  278.     // NOTE:  use CSocket::Wait() to wait for I/O event(s) on a single socket
  279.     struct SPoll {
  280.         CPollable* m_Pollable;
  281.         EIO_Event  m_Event;
  282.         EIO_Event  m_REvent;
  283.         SPoll(CPollable* pollable = 0, EIO_Event event = eIO_Open)
  284.             : m_Pollable(pollable), m_Event(event) { m_REvent = eIO_Open; }
  285.     };
  286.     static EIO_Status Poll(vector<SPoll>&  polls,
  287.                            const STimeout* timeout,
  288.                            size_t*         n_ready = 0);
  289.     // Misc  (mostly BSD-like); "host" ought to be in network byte order
  290.     static string       gethostname  (void);                // empty str on err
  291.     static string       ntoa         (unsigned int  host);
  292.     static string       gethostbyaddr(unsigned int  host);  // empty str on err
  293.     static unsigned int gethostbyname(const string& hostname);  // 0 on error
  294.     static unsigned int   HostToNetLong (unsigned int   value);
  295.     static unsigned int   NetToHostLong (unsigned int   value);
  296.     static unsigned short HostToNetShort(unsigned short value);
  297.     static unsigned short NetToHostShort(unsigned short value);
  298. };
  299. /* @} */
  300. /////////////////////////////////////////////////////////////////////////////
  301. /////////////////////////////////////////////////////////////////////////////
  302. //  IMPLEMENTATION of INLINE functions
  303. /////////////////////////////////////////////////////////////////////////////
  304. /////////////////////////////////////////////////////////////////////////////
  305. //  CSocket::
  306. //
  307. inline EIO_Status CSocket::Shutdown(EIO_Event how)
  308. {
  309.     return m_Socket ? SOCK_Shutdown(m_Socket, how) : eIO_Closed;
  310. }
  311. inline EIO_Status CSocket::Wait(EIO_Event event, const STimeout* timeout)
  312. {
  313.     return m_Socket ? SOCK_Wait(m_Socket, event, timeout) : eIO_Closed; 
  314. }
  315. inline EIO_Status CSocket::PushBack(const void* buf, size_t size)
  316. {
  317.     return m_Socket ? SOCK_PushBack(m_Socket, buf, size) : eIO_Closed;
  318. }
  319. inline EIO_Status CSocket::Abort(void)
  320. {
  321.     return m_Socket ? SOCK_Abort(m_Socket) : eIO_Closed;
  322. }
  323. inline EIO_Status CSocket::GetStatus(EIO_Event direction) const
  324. {
  325.     return m_Socket ? SOCK_Status(m_Socket, direction) : eIO_Closed;
  326. }
  327. inline EOwnership CSocket::SetOwnership(EOwnership if_to_own)
  328. {
  329.     EOwnership prev_ownership = m_IsOwned;
  330.     m_IsOwned                 = if_to_own;
  331.     return prev_ownership;
  332. }
  333. inline SOCK CSocket::GetSOCK(void) const
  334. {
  335.     return m_Socket;
  336. }
  337. inline EIO_Status CSocket::GetOSHandle(void* hnd_buf, size_t hnd_siz) const
  338. {
  339.     return m_Socket? SOCK_GetOSHandle(m_Socket, hnd_buf, hnd_siz) : eIO_Closed;
  340. }
  341.  
  342. inline ESwitch CSocket::SetReadOnWrite(ESwitch read_on_write)
  343. {
  344.     return m_Socket? SOCK_SetReadOnWrite(m_Socket, read_on_write) : eDefault;
  345. }
  346. inline ESwitch CSocket::SetDataLogging(ESwitch log)
  347. {
  348.     return m_Socket? SOCK_SetDataLogging(m_Socket, log) : eDefault;
  349. }
  350. inline ESwitch CSocket::SetInterruptOnSignal(ESwitch interrupt)
  351. {
  352.     return m_Socket? SOCK_SetInterruptOnSignal(m_Socket, interrupt) : eDefault;
  353. }
  354. inline void CSocket::SetReuseAddress(ESwitch reuse)
  355. {
  356.     if ( m_Socket )
  357.         SOCK_SetReuseAddress(m_Socket, reuse);
  358. }
  359. inline bool CSocket::IsClientSide(void) const
  360. {
  361.     return m_Socket && SOCK_IsClientSide(m_Socket) ? true : false;
  362. }
  363. inline bool CSocket::IsServerSide(void) const
  364. {
  365.     return m_Socket && SOCK_IsServerSide(m_Socket) ? true : false;
  366. }
  367. inline bool CSocket::IsDatagram(void) const
  368. {
  369.     return m_Socket && SOCK_IsDatagram(m_Socket) ? true : false;
  370. }
  371. /////////////////////////////////////////////////////////////////////////////
  372. //  CDatagramSocket::
  373. //
  374. inline EIO_Status CDatagramSocket::Wait(const STimeout* timeout)
  375. {
  376.     return m_Socket ? DSOCK_WaitMsg(m_Socket, timeout) : eIO_Closed;
  377. }
  378. inline EIO_Status CDatagramSocket::Clear(EIO_Event direction)
  379. {
  380.     return m_Socket ? DSOCK_WipeMsg(m_Socket, direction) : eIO_Closed;
  381. }
  382. inline EIO_Status CDatagramSocket::SetBroadcast(bool do_broadcast)
  383. {
  384.     return m_Socket ? DSOCK_SetBroadcast(m_Socket, do_broadcast) : eIO_Closed;
  385. }
  386. /////////////////////////////////////////////////////////////////////////////
  387. //  CListeningSocket::
  388. //
  389. inline EIO_Status CListeningSocket::GetStatus(void) const
  390. {
  391.     return m_Socket ? eIO_Success : eIO_Closed;
  392. }
  393. inline EOwnership CListeningSocket::SetOwnership(EOwnership if_to_own)
  394. {
  395.     EOwnership prev_ownership = m_IsOwned;
  396.     m_IsOwned                 = if_to_own;
  397.     return prev_ownership;
  398. }
  399. inline LSOCK CListeningSocket::GetLSOCK(void) const
  400. {
  401.     return m_Socket;
  402. }
  403. inline EIO_Status CListeningSocket::GetOSHandle(void*  handle_buf,
  404.                                                 size_t handle_size) const
  405. {
  406.     return m_Socket
  407.         ? LSOCK_GetOSHandle(m_Socket, handle_buf, handle_size) : eIO_Closed;
  408. }
  409. /////////////////////////////////////////////////////////////////////////////
  410. //  CSocketAPI::
  411. //
  412. inline void CSocketAPI::AllowSigPipe(void)
  413. {
  414.     SOCK_AllowSigPipeAPI();
  415. }
  416. inline const STimeout* CSocketAPI::SetSelectInternalRestartTimeout
  417. (const STimeout* tmo)
  418. {
  419.     return SOCK_SetSelectInternalRestartTimeout(tmo);
  420. }
  421. inline EIO_Status CSocketAPI::Initialize(void)
  422. {
  423.     return SOCK_InitializeAPI();
  424. }
  425. inline EIO_Status CSocketAPI::Shutdown(void)
  426. {
  427.     return SOCK_ShutdownAPI();
  428. }
  429. inline ESwitch CSocketAPI::SetReadOnWrite(ESwitch read_on_write)
  430. {
  431.     return SOCK_SetReadOnWriteAPI(read_on_write);
  432. }
  433. inline ESwitch CSocketAPI::SetDataLogging(ESwitch log)
  434. {
  435.     return SOCK_SetDataLoggingAPI(log);
  436. }
  437. inline ESwitch CSocketAPI::SetInterruptOnSignal(ESwitch interrupt)
  438. {
  439.     return SOCK_SetInterruptOnSignalAPI(interrupt);
  440. }
  441. inline ESwitch CSocketAPI::SetReuseAddress(ESwitch reuse)
  442. {
  443.     return SOCK_SetReuseAddressAPI(reuse);
  444. }
  445. inline unsigned int CSocketAPI::HostToNetLong(unsigned int value)
  446. {
  447.     return SOCK_HostToNetLong(value);
  448. }
  449. inline unsigned int CSocketAPI::NetToHostLong(unsigned int value)
  450. {
  451.     return SOCK_NetToHostLong(value);
  452. }
  453. inline unsigned short CSocketAPI::HostToNetShort(unsigned short value)
  454. {
  455.     return SOCK_HostToNetShort(value);
  456. }
  457. inline unsigned short CSocketAPI::NetToHostShort(unsigned short value)
  458. {
  459.     return SOCK_NetToHostShort(value);
  460. }
  461. /////////////////////////////////////////////////////////////////////////////
  462. END_NCBI_SCOPE
  463. /*
  464.  * ---------------------------------------------------------------------------
  465.  * $Log: ncbi_socket.hpp,v $
  466.  * Revision 1000.3  2003/12/02 20:27:51  gouriano
  467.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R6.36
  468.  *
  469.  * Revision 6.36  2003/11/25 15:07:40  lavr
  470.  * CSocket::GetStatus() to pass eIO_Open to SOCK_Status()
  471.  *
  472.  * Revision 6.35  2003/11/24 19:22:24  lavr
  473.  * SetSelectInternalRestartTimeout() to accept ptr to STimeout
  474.  *
  475.  * Revision 6.34  2003/11/18 20:18:49  lavr
  476.  * +SetSelectInternalRestartTimeout()
  477.  *
  478.  * Revision 6.33  2003/11/12 17:43:53  lavr
  479.  * Few (non-functional) rearrangements
  480.  *
  481.  * Revision 6.32  2003/10/24 16:51:11  lavr
  482.  * GetTimeout(eIO_ReadWrite): return the lesser of eIO_Read and eIO_Write
  483.  *
  484.  * Revision 6.31  2003/10/23 12:14:52  lavr
  485.  * Socket feature setters made returning old feature values
  486.  *
  487.  * Revision 6.30  2003/10/09 19:58:26  vakatov
  488.  * Fine-tune the set of included CORELIB headers, mostly to avoid the weird
  489.  * dependence of XNCBI library on ICC 7.1.
  490.  *
  491.  * Revision 6.29  2003/08/25 14:37:07  lavr
  492.  * Introduce CPollable and more generic SCocketAPI::Poll()
  493.  *
  494.  * Revision 6.28  2003/07/15 16:49:16  lavr
  495.  * +CSocket::GetPeerAddress(void)
  496.  *
  497.  * Revision 6.27  2003/05/31 05:12:09  lavr
  498.  * Fix return value type of HostToNetShort and NetToHostShort
  499.  *
  500.  * Revision 6.26  2003/05/21 17:51:50  lavr
  501.  * SOCK_Abort() redeclared protected in CDatagramSocket
  502.  *
  503.  * Revision 6.25  2003/05/20 21:24:55  lavr
  504.  * +CSocket::Abort()
  505.  *
  506.  * Revision 6.24  2003/05/14 03:46:44  lavr
  507.  * Match revised datagram socket API
  508.  *
  509.  * Revision 6.23  2003/04/30 17:03:22  lavr
  510.  * Modified prototypes for CDatagramSocket::Send() and CDatagramSocket::Recv()
  511.  *
  512.  * Revision 6.22  2003/04/11 20:58:12  lavr
  513.  * CDatagramSocket:: API defined completely
  514.  *
  515.  * Revision 6.21  2003/04/09 19:05:55  siyan
  516.  * Added doxygen support
  517.  *
  518.  * Revision 6.20  2003/02/20 17:55:09  lavr
  519.  * Inlining CSocket::Shutdown() and CSocket::Wait()
  520.  *
  521.  * Revision 6.19  2003/02/14 22:03:32  lavr
  522.  * Add internal CSocket timeouts and document them
  523.  *
  524.  * Revision 6.18  2003/01/28 19:29:07  lavr
  525.  * DSOCK: Remove reference to kEmptyStr and thus to xncbi
  526.  *
  527.  * Revision 6.17  2003/01/26 04:28:37  lavr
  528.  * Quick fix CDatagramSocket ctor ambiguity
  529.  *
  530.  * Revision 6.16  2003/01/24 23:01:32  lavr
  531.  * Added class CDatagramSocket
  532.  *
  533.  * Revision 6.15  2003/01/07 22:01:43  lavr
  534.  * ChangeLog message corrected
  535.  *
  536.  * Revision 6.14  2003/01/07 21:58:24  lavr
  537.  * Comment corrected
  538.  *
  539.  * Revision 6.13  2002/12/19 14:51:48  dicuccio
  540.  * Added export specifier for Win32 DLL builds.
  541.  *
  542.  * Revision 6.12  2002/12/04 16:54:08  lavr
  543.  * Add extra parameter "log" to CSocket() constructor and CSocket::Connect()
  544.  *
  545.  * Revision 6.11  2002/11/14 01:11:33  lavr
  546.  * Minor formatting changes
  547.  *
  548.  * Revision 6.10  2002/09/19 18:05:25  lavr
  549.  * Header file guard macro changed
  550.  *
  551.  * Revision 6.9  2002/09/17 20:45:28  lavr
  552.  * A typo corrected
  553.  *
  554.  * Revision 6.8  2002/09/16 22:32:47  vakatov
  555.  * Allow to change ownership for the underlying sockets "on-the-fly";
  556.  * plus some minor (mostly formal) code and comments rearrangements
  557.  *
  558.  * Revision 6.7  2002/08/27 03:19:29  lavr
  559.  * CSocketAPI:: Removed methods: htonl(), htons(), ntohl(), ntohs(). Added
  560.  * as replacements: {Host|Net}To{Net|Host}{Long|Short}() (see ncbi_socket.h)
  561.  *
  562.  * Revision 6.6  2002/08/15 18:45:03  lavr
  563.  * CSocketAPI::Poll() documented in more details in ncbi_socket.h(SOCK_Poll)
  564.  *
  565.  * Revision 6.5  2002/08/14 15:04:37  sadykov
  566.  * Prepend "inline" for GetOSHandle() method impl
  567.  *
  568.  * Revision 6.4  2002/08/13 19:28:29  lavr
  569.  * Move most methods out-of-line; fix inline methods to have "inline"
  570.  *
  571.  * Revision 6.3  2002/08/12 20:58:09  lavr
  572.  * More comments on parameters usage of certain methods
  573.  *
  574.  * Revision 6.2  2002/08/12 20:24:04  lavr
  575.  * Resolve expansion mess with byte order marcos (use calls instead) -- FreeBSD
  576.  *
  577.  * Revision 6.1  2002/08/12 15:11:34  lavr
  578.  * Initial revision
  579.  *
  580.  * ===========================================================================
  581.  */
  582. #endif /* CONNECT___NCBI_SOCKET__HPP */