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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_socket.h,v $
  4.  * PRODUCTION Revision 1000.4  2004/04/12 17:06:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.49
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_SOCKET__H
  10. #define CONNECT___NCBI_SOCKET__H
  11. /*  $Id: ncbi_socket.h,v 1000.4 2004/04/12 17:06:00 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
  37.  *
  38.  * File Description:
  39.  *   Plain portable TCP/IP socket API for:  UNIX, MS-Win, MacOS
  40.  *   Platform-specific library requirements:
  41.  *     [UNIX ]   -DNCBI_OS_UNIX     -lresolv -lsocket -lnsl
  42.  *     [MSWIN]   -DNCBI_OS_MSWIN    wsock32.lib
  43.  *     [MacOS]   -DNCBI_OS_MAC      NCSASOCK -- BSD-style socket emulation lib
  44.  *
  45.  *********************************
  46.  * Generic:
  47.  *
  48.  *  SOCK, LSOCK
  49.  *
  50.  *  SOCK_AllowSigPipeAPI
  51.  *
  52.  *  SOCK_InitializeAPI
  53.  *  SOCK_ShutdownAPI
  54.  *
  55.  * Listening socket (handle LSOCK):
  56.  *
  57.  *  LSOCK_Create
  58.  *  LSOCK_Accept
  59.  *  LSOCK_Close
  60.  *  
  61.  * I/O Socket (handle SOCK):
  62.  *
  63.  *  SOCK_Create[Ex]      (see also LSOCK_Accept)
  64.  *  SOCK_CreateOnTop[Ex]
  65.  *  SOCK_Reconnect
  66.  *  SOCK_Shutdown
  67.  *  SOCK_Close
  68.  *  SOCK_Wait
  69.  *  SOCK_Poll
  70.  *  SOCK_SetTimeout
  71.  *  SOCK_GetReadTimeout
  72.  *  SOCK_GetWriteTimeout
  73.  *  SOCK_Read (including "peek" and "persistent read")
  74.  *  SOCK_PushBack
  75.  *  SOCK_Status
  76.  *  SOCK_Write
  77.  *  SOCK_Abort
  78.  *  SOCK_GetPeerAddress
  79.  *  SOCK_GetPeerAddressString
  80.  *
  81.  *  SOCK_SetReadOnWriteAPI
  82.  *  SOCK_SetReadOnWrite
  83.  *  SOCK_SetInterruptOnSignalAPI
  84.  *  SOCK_SetInterruptOnSignal
  85.  *  SOCK_SetReuseAddressAPI
  86.  *  SOCK_SetReuseAddress
  87.  *
  88.  * Datagram Socket:
  89.  *
  90.  *  DSOCK_Create[Ex]
  91.  *  DSOCK_Bind
  92.  *  DSOCK_Connect
  93.  *  DSOCK_WaitMsg
  94.  *  DSOCK_SendMsg
  95.  *  DSOCK_RecvMsg
  96.  *  DSOCK_WipeMsg
  97.  *  DSOCK_SetBroadcast
  98.  *
  99.  * Socket classification:
  100.  *
  101.  *  SOCK_IsDatagram
  102.  *  SOCK_IsClientSide
  103.  *  SOCK_IsServerSide
  104.  *
  105.  * Data logging:
  106.  *
  107.  *  SOCK_SetDataLoggingAPI
  108.  *  SOCK_SetDataLogging
  109.  *
  110.  * Auxiliary:
  111.  *
  112.  *  SOCK_gethostname
  113.  *  SOCK_ntoa
  114.  *  SOCK_HostToNetShort
  115.  *  SOCK_HostToNetLong
  116.  *  SOCK_NetToHostShort
  117.  *  SOCK_NetToHostLong
  118.  *  SOCK_gethostbyname
  119.  *  SOCK_gethostbyaddr
  120.  *
  121.  */
  122. #if defined(NCBISOCK__H)
  123. #  error "<ncbisock.h> and <ncbi_socket.h> must never be #include'd together"
  124. #endif
  125. #include <connect/ncbi_core.h>
  126. /** @addtogroup Sockets
  127.  *
  128.  * @{
  129.  */
  130. #ifdef __cplusplus
  131. extern "C" {
  132. #endif
  133. /******************************************************************************
  134.  *  TYPEDEFS & MACROS
  135.  */
  136. /* Network and host byte order enumeration type
  137.  */
  138. typedef enum {
  139.     eNH_HostByteOrder,
  140.     eNH_NetworkByteOrder
  141. } ENH_ByteOrder;
  142. /* Forward declarations of the hidden socket internal structure, and
  143.  * their upper-level handles to use by the LSOCK_*() and SOCK_*() API
  144.  */
  145. struct LSOCK_tag;                /* listening socket:  internal storage */
  146. typedef struct LSOCK_tag* LSOCK; /* listening socket:  handle           */
  147. struct SOCK_tag;                 /* socket:  internal storage           */
  148. typedef struct SOCK_tag*  SOCK;  /* socket:  handle                     */
  149. /******************************************************************************
  150.  *  Multi-Thread safety
  151.  *
  152.  * If you are using this API in a multi-thread application, and there is
  153.  * more than one thread using this API, it is safe to call SOCK_InitializeAPI()
  154.  * explicitly in the beginning of your main thread, before you run any other
  155.  * threads, and to call SOCK_ShutdownAPI() after all threads are exited.
  156.  *
  157.  * As soon as the API is initialized it becomes relatively MT-safe, however
  158.  * you still must not operate with the same LSOCK or SOCK objects from
  159.  * different threads simultaneously.
  160.  *
  161.  * A MUCH BETTER WAY of dealing with this issue is to provide your own MT
  162.  * locking callback (see CORE_SetLOCK in "ncbi_core.h"). This will also
  163.  * guarantee the proper MT protection should some other SOCK functions
  164.  * start to access any static data in the future.
  165.  */
  166. /******************************************************************************
  167.  *   Error & Data Logging
  168.  *
  169.  * NOTE:  Use CORE_SetLOG() from "ncbi_core.h" to setup the log handler.
  170.  */
  171. /* By default ("log" == eDefault, which is eOff), the data is not logged.
  172.  * To start logging the data, call this func with "log" == eOn.
  173.  * To stop  logging the data, call this func with "log" == eOff.
  174.  * Return prior setting.
  175.  */
  176. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetDataLoggingAPI
  177. (ESwitch log
  178.  );
  179. /* Control the data logging for socket "sock" individually.
  180.  * To reset to the global default behavior (as set by SOCK_SetDataLoggingAPI),
  181.  * call this function with "log" == eDefault.
  182.  * Return prior setting.
  183.  */
  184. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetDataLogging
  185. (SOCK    sock,
  186.  ESwitch log
  187.  );
  188. /******************************************************************************
  189.  *   I/O restart on signals
  190.  */
  191. /* By default ("on_off" == eDefault,eOff), I/O is restartable if interrupted.
  192.  * Return prior setting.
  193.  */
  194. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetInterruptOnSignalAPI
  195. (ESwitch on_off
  196.  );
  197. /* Control sockets individually. eDefault causes the use of global API flag.
  198.  * Return prior setting.
  199.  */
  200. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetInterruptOnSignal
  201. (SOCK    sock,
  202.  ESwitch on_off
  203.  );
  204. /******************************************************************************
  205.  *   Address reuse: EXPERIMENTAL and may be removed in the upcoming releases!
  206.  */
  207. /* By default ("on_off" == eDefault,eOff), address is not marked for reuse
  208.  * in SOCK, but is always reused for LSOCK.
  209.  * Return prior setting.
  210.  */
  211. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetReuseAddressAPI
  212. (ESwitch on_off
  213.  );
  214. /* Control sockets individually (Note: only boolean value is available here.)
  215.  * No return value is available.
  216.  */
  217. extern NCBI_XCONNECT_EXPORT void SOCK_SetReuseAddress
  218. (SOCK        sock,
  219.  int/*bool*/ on_off);
  220. /******************************************************************************
  221.  *  API Initialization and Shutdown/Cleanup
  222.  */
  223. /*
  224.  */
  225. extern NCBI_XCONNECT_EXPORT const STimeout*SOCK_SetSelectInternalRestartTimeout
  226. (const STimeout* timeout);
  227. /* By default (on UNIX platforms) the SOCK API functions automagically call
  228.  * "signal(SIGPIPE, SIG_IGN)" on initialization.  To prohibit this feature,
  229.  * you must call SOCK_AllowSigPipeAPI() before you call any other
  230.  * function from the SOCK API.
  231.  */
  232. extern NCBI_XCONNECT_EXPORT void SOCK_AllowSigPipeAPI(void);
  233. /* Initialize all internal/system data & resources to be used by the SOCK API.
  234.  * NOTE:
  235.  *  You can safely call it more than once; just, all calls after the first
  236.  *  one will have no result. 
  237.  * NOTE:
  238.  *  Usually, SOCK API does not require an explicit initialization -- as it is
  239.  *  guaranteed to initialize itself automagically, in one of API functions,
  240.  *  when necessary. Yet, see the "Multi Thread safety" remark above.
  241.  * NOTE:
  242.  *  This call, when used for the very first time in the application, enqueues
  243.  *  SOCK_ShutdownAPI() to be called upon application exit on plaftorms that
  244.  *  provide this functionality. In any case, the application can opt for
  245.  *  explicit SOCK_ShutdownAPI() call when it is done with all sockets.
  246.  */
  247. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_InitializeAPI(void);
  248. /* Cleanup; destroy all internal/system data & resources used by the SOCK API.
  249.  * ATTENTION:  no function from the SOCK API should be called after this call!
  250.  * NOTE: you can safely call it more than once; just, all calls after the first
  251.  *       one will have no result. 
  252.  */
  253. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_ShutdownAPI(void);
  254. /******************************************************************************
  255.  *  LISTENING SOCKET
  256.  */
  257. /* [SERVER-side]  Create and initialize the server-side(listening) socket
  258.  * (socket() + bind() + listen())
  259.  * NOTE: on some systems, "backlog" can be silently limited down to 128 (or 5).
  260.  */
  261. extern NCBI_XCONNECT_EXPORT EIO_Status LSOCK_CreateEx
  262. (unsigned short port,    /* [in]  the port to listen at                  */
  263.  unsigned short backlog, /* [in]  maximal # of pending connections       */
  264.  LSOCK*         lsock,   /* [out] handle of the created listening socket */
  265.  ESwitch        log      /* [in]  whether to log activity (inherited)    */
  266.  );
  267. extern NCBI_XCONNECT_EXPORT EIO_Status LSOCK_Create
  268. (unsigned short port,    /* [in]  the port to listen at                  */
  269.  unsigned short backlog, /* [in]  maximal # of pending connections       */
  270.  LSOCK*         lsock    /* [out] handle of the created listening socket */
  271.  );
  272. /* [SERVER-side]  Accept connection from a client.
  273.  * NOTE: the "*timeout" is for this accept() only.  To set I/O timeout,
  274.  *       use SOCK_SetTimeout();  all I/O timeouts are infinite by default.
  275.  */
  276. extern NCBI_XCONNECT_EXPORT EIO_Status LSOCK_Accept
  277. (LSOCK           lsock,    /* [in]  handle of a listening socket */
  278.  const STimeout* timeout,  /* [in]  timeout (infinite if NULL)   */
  279.  SOCK*           sock      /* [out] handle of the created socket */
  280.  );
  281. /* [SERVER-side]  Close the listening socket, destroy relevant internal data.
  282.  */
  283. extern NCBI_XCONNECT_EXPORT EIO_Status LSOCK_Close(LSOCK lsock);
  284. /* Get an OS-dependent native socket handle to use by platform-specific API.
  285.  * FYI:  on MS-Windows it will be "SOCKET", on other platforms -- "int".
  286.  */
  287. extern NCBI_XCONNECT_EXPORT EIO_Status LSOCK_GetOSHandle
  288. (LSOCK  lsock,
  289.  void*  handle_buf,  /* pointer to a memory area to put the OS handle at */
  290.  size_t handle_size  /* the exact(!) size of the expected OS handle */
  291.  );
  292. /******************************************************************************
  293.  *  SOCKET
  294.  */
  295. /* [CLIENT-side]  Connect client to another(server-side, listening) socket
  296.  * (socket() + connect() [+ select()])
  297.  */
  298. /* SOCK_CreateEx(host, port, timeout, sock, 0, 0, eDefault) */
  299. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Create
  300. (const char*     host,    /* [in]  host to connect to                        */
  301.  unsigned short  port,    /* [in]  port to connect to                        */
  302.  const STimeout* timeout, /* [in]  the connect timeout (infinite if NULL)    */
  303.  SOCK*           sock     /* [out] handle of the created socket              */
  304.  );
  305. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_CreateEx
  306. (const char*     host,     /* [in]  host to connect to                       */
  307.  unsigned short  port,     /* [in]  port to connect to                       */
  308.  const STimeout* timeout,  /* [in]  the connect timeout (infinite if NULL)   */
  309.  SOCK*           sock,     /* [out] handle of the created socket             */
  310.  const void*     init_data,/* [in]  initial output data segment (may be NULL)*/
  311.  size_t          init_size,/* [in]  size of initial data segment (may be 0)  */
  312.  ESwitch         log       /* [in]  whether to do logging on this socket     */
  313.  );
  314. /* [SERVER-side]  Create a socket on top of OS-dependent "handle"
  315.  * (file descriptor on Unix). Returned socket is not reopenable to its
  316.  * default peer (SOCK_Reconnect may not specify zeros for the connection
  317.  * point).  All timeouts are set to its default [infinite] values.
  318.  * SOCK_Close() will close the "handle" only if the "close_on_close"
  319.  * parameter is passed non-zero (eSCOT_CloseOnClose).
  320.  * Return eIO_Success on success; otherwise: eIO_Closed if the "handle" does
  321.  * not refer to an open socket [but e.g. to a normal file or a pipe];
  322.  * other error codes in case of other errors.
  323.  */
  324. typedef enum {
  325.     eSCOT_KeepOnClose,    /* Do not close "handle" on SOCK_Close() */
  326.     eSCOT_CloseOnClose    /* Do close "handle" on SOCK_Close() */
  327. } ESCOT_OnClose;
  328. /* SOCK_CreateOnTopEx(handle, handle_size, sock,
  329.                       0, 0, eDefault, eSCOT_CloseOnClose) */
  330. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_CreateOnTop
  331. (const void*   handle,      /* [in]  OS-dependent "handle" to be converted */
  332.  size_t        handle_size, /* [in]  "handle" size                         */
  333.  SOCK*         sock         /* [out] SOCK built on top of OS "handle"      */
  334.  );
  335. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_CreateOnTopEx
  336. (const void*   handle,      /* [in]  OS-dependent "handle" to be converted */
  337.  size_t        handle_size, /* [in]  "handle" size                         */
  338.  SOCK*         sock,        /* [out] SOCK built on top of OS "handle"      */
  339.  const void*   init_data,   /* [in]  initial output data segment (ok NULL) */
  340.  size_t        init_size,   /* [in]  size of initial data segment (ok 0)   */
  341.  ESwitch       log,         /* [in]  data logging for the resulting SOCK   */
  342.  ESCOT_OnClose on_close     /* [in]  if to keep "handle" in SOCK_Close()   */
  343.  );
  344. /* [CLIENT-side]  Close the socket referred to by "sock" and then connect
  345.  * it to another "host:port";  fail if it takes more than "timeout"
  346.  * (close() + connect() [+ select()])
  347.  *
  348.  * HINT:  if "host" is NULL then connect to the same host address as before;
  349.  *        if "port" is zero then connect to the same port # as before.
  350.  *
  351.  * NOTE1: "new" socket inherits the old I/O timeouts.
  352.  * NOTE2: the call is applicable to stream [not datagram] sockets only.
  353.  * NOTE3: "timeout"==NULL is infinite; "timeout"=={0,0} causes no wait for
  354.  *        connection to be established and to return immediately.
  355.  */
  356. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Reconnect
  357. (SOCK            sock,    /* [in] handle of the socket to reconnect      */
  358.  const char*     host,    /* [in] host to connect to  (can be NULL)      */
  359.  unsigned short  port,    /* [in] port to connect to  (can be 0)         */
  360.  const STimeout* timeout  /* [in] the connect timeout (infinite if NULL) */
  361.  );
  362. /* Shutdown the connection in only one direction (specified by "direction").
  363.  * Later attempts to I/O (or to wait) in the shutdown direction will
  364.  * do nothing, and immediately return with "eIO_Closed" status.
  365.  * Pending data output can cause data transfer to the remote end (subject
  366.  * for eIO_Close timeout as previously set by SOCK_SetTimeout()).
  367.  * Cannot be applied to datagram sockets (eIO_InvalidArg results).
  368.  */
  369. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Shutdown
  370. (SOCK      sock, /* [in] handle of the socket to shutdown            */
  371.  EIO_Event how   /* [in] one of:  eIO_Read, eIO_Write, eIO_ReadWrite */
  372.  );
  373. /* Close the connection, destroy relevant internal data.
  374.  * The "sock" handle goes invalid after this function call, regardless
  375.  * of whether the call was successful or not.
  376.  * NOTE1:  if eIO_Close timeout was specified (or NULL) then it blocks until
  377.  *         either all unsent data are sent, error flagged, or the timeout
  378.  *         expires.
  379.  * NOTE2:  if there is output pending, that output will be flushed.
  380.  */
  381. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Close(SOCK sock);
  382. /* Close the connection, and conditionally destroy relevant internal data.
  383.  * NOTE1:  if eIO_Close timeout was specified (or NULL) then it blocks until
  384.  *         either all unsent data are sent, error flagged, or the timeout
  385.  *         expires.
  386.  * NOTE2:  if there is output pending, that output will be flushed.
  387.  * NOTE3:  SOCK_CloseEx(sock, 1) is equivalent to SOCK_Close(sock);
  388.  */
  389. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_CloseEx
  390. (SOCK        sock,    /* [in] handle of the socket to close           */
  391.  int/*bool*/ destroy  /* [in] =1 to destroy handle; =0 to keep handle */
  392.  );
  393. /* Block on the socket until either read/write (dep. on the "event" arg) is
  394.  * available or timeout expires (if "timeout" is NULL then assume it infinite).
  395.  * For a datagram socket, eIO_Closed is returned if the internally latched
  396.  * message was entirely read out, and eIO_Read was requested as the "event".
  397.  * Both eIO_Write and eIO_ReadWrite events always immediately succeed for
  398.  * the datagram socket.
  399.  */
  400. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Wait
  401. (SOCK            sock,
  402.  EIO_Event       event,  /* [in] one of:  eIO_Read, eIO_Write, eIO_ReadWrite */
  403.  const STimeout* timeout
  404.  );
  405. /* Block until at least one of the sockets enlisted in "polls" array
  406.  * (of size "n") becomes available for requested operation (event),
  407.  * or until timeout expires (wait indefinitely if timeout is passed NULL).
  408.  * Return eIO_Success if at least one socket was found ready; eIO_Timeout
  409.  * if timeout expired; eIO_Unknown if underlying system call(s) failed.
  410.  * NOTE1: For a socket found not ready for an operation, eIO_Open is returned
  411.  *        in its "revent"; for a failing socket, eIO_Close is returned;
  412.  * NOTE2: This call may return eIO_InvalidArg if
  413.  *        - parameters to the call are inconsistent;
  414.  *        - a non-NULL socket polled with a bad "event" (eIO_Open, eIO_Close).
  415.  *        With this return code, the calling program cannot rely on "revent"
  416.  *        fields the "polls" array as they might not be properly updated.
  417.  * NOTE3: If either both "n" and "polls" are NULL, or all sockets in "polls"
  418.  *        are NULL, then the returned result is either
  419.  *        eIO_Timeout (after the specified amount of time was spent idle), or
  420.  *        eIO_Interrupted (if signal came while the waiting was in progress).
  421.  * NOTE4: For datagram sockets, the readiness for reading is determined by
  422.  *        message data latched since last message receive call (DSOCK_RecvMsg).
  423.  * NOTE5: This call allows intermixture of stream and datagram sockets.
  424.  * NOTE6: This call can cause some socket I/O in those sockets marked for
  425.  *        read-on-write and those with pending connection or output data.
  426.  */
  427. typedef struct {
  428.     SOCK      sock;   /* [in]           SOCK to poll (NULL if not to poll)   */
  429.     EIO_Event event;  /* [in]  one of:  eIO_Read, eIO_Write, eIO_ReadWrite   */
  430.     EIO_Event revent; /* [out] one of:  eIO_Open/Read/Write/ReadWrite/Close  */
  431. } SSOCK_Poll;
  432. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Poll
  433. (size_t          n,         /* [in]      # of SSOCK_Poll elems in "polls"    */
  434.  SSOCK_Poll      polls[],   /* [in|out]  array of query/result structures    */
  435.  const STimeout* timeout,   /* [in]      max time to wait (infinite if NULL) */
  436.  size_t*         n_ready    /* [out]     # of ready sockets  (may be NULL)   */
  437.  );
  438. /* GENERIC POLLABLE INTERFACE, please see above for explanations
  439.  */
  440. struct SPOLLABLE_tag;
  441. typedef struct SPOLLABLE_tag* POLLABLE;
  442. typedef struct {
  443.     POLLABLE  poll;
  444.     EIO_Event event;
  445.     EIO_Event revent;
  446. } SPOLLABLE_Poll;
  447. extern NCBI_XCONNECT_EXPORT EIO_Status POLLABLE_Poll
  448. (size_t          n,
  449.  SPOLLABLE_Poll  polls[],
  450.  const STimeout* timeout,
  451.  size_t*         n_ready
  452.  );
  453. /* Return 0 if conversion cannot be made; otherwise converted handle */
  454. extern NCBI_XCONNECT_EXPORT POLLABLE POLLABLE_FromSOCK (SOCK);
  455. extern NCBI_XCONNECT_EXPORT POLLABLE POLLABLE_FromLSOCK(LSOCK);
  456. extern NCBI_XCONNECT_EXPORT SOCK     POLLABLE_ToSOCK   (POLLABLE);
  457. extern NCBI_XCONNECT_EXPORT LSOCK    POLLABLE_ToLSOCK  (POLLABLE);
  458. /* Specify timeout for the connection i/o (see SOCK_[Read|Write|Close] funcs).
  459.  * If "timeout" is NULL then set the timeout to be infinite;
  460.  * NOTE: the default timeout is infinite (wait "ad infinitum" on I/O).
  461.  */
  462. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_SetTimeout
  463. (SOCK            sock,
  464.  EIO_Event       event,   /* [in]  one of:  eIO_[Read/Write/ReadWrite/Close] */
  465.  const STimeout* timeout  /* [in]  new timeout value to set                  */
  466.  );
  467. /* Get the connection's i/o timeout (or NULL, if the timeout is infinite).
  468.  * NOTE1:  the returned timeout is guaranteed to be pointing to a valid
  469.  *         (and correct) structure in memory at least until the SOCK is closed
  470.  *         or SOCK_SetTimeout is called for this "sock".
  471.  * NOTE2:  eIO_ReadWrite timeout is the least of eIO_Read and eIO_Write ones.
  472.  */
  473. extern NCBI_XCONNECT_EXPORT const STimeout* SOCK_GetTimeout
  474. (SOCK      sock,
  475.  EIO_Event event  /* [in]  one of:  eIO_[Read/Write/Close] */
  476.  );
  477. /* Read/peek up to "size" bytes from "sock" to the mem.buffer pointed by "buf".
  478.  * In "*n_read", return the number of successfully read bytes.
  479.  * Read method "how" can be either of the following:
  480.  * eIO_ReadPlain   -- read as many as "size" bytes and return (eIO_Success);
  481.  *                    if no data are readily available then wait at most
  482.  *                    read timeout and return (eIO_Timeout) if no data still
  483.  *                    could be got; eIO_Success if some data were obtained.
  484.  * eIO_ReadPeek    -- same as "eIO_ReadPlain" but do not extract the data from
  485.  *                    the socket (so that the next read operation will see the
  486.  *                    data again), with one important exception noted below.
  487.  * eIO_ReadPersist -- read exactly "size" bytes and return eIO_Success; if less
  488.  *                    data received then return an error condition (including
  489.  *                    eIO_Timeout).
  490.  *
  491.  * If there is no data available to read (also, if eIO_ReadPersist and cannot
  492.  * read exactly "size" bytes) and the timeout(see SOCK_SetTimeout) is expired
  493.  * then return eIO_Timeout.
  494.  *
  495.  * Both eIO_ReadPlain and eIO_ReadPeek return eIO_Success iff some data have
  496.  * been read (perhaps within the time allowance specified by eIO_Read timeout).
  497.  * Both mothods return any other code when no data at all were available.
  498.  * eIO_ReadPersist differs from the other two methods as it can return an
  499.  * error condition even if some data were actually obtained from the socket.
  500.  * Hence, as a rule of thumb, an application should always check the number
  501.  * of read bytes BEFORE checking the return status, which merely advises
  502.  * whether it is okay to read again.
  503.  *
  504.  * As a special case, "buf" may passed as NULL:
  505.  *   eIO_ReadPeek      -- read up to "size" bytes and store them
  506.  *                        in internal buffer;
  507.  *   eIO_Read[Persist] -- discard up to "size" bytes from internal buffer
  508.  *                        and socket (check "*n_read" to know how many).
  509.  *
  510.  * NOTE1: "Read" and "peek" methods differ:  if "read" is performed and not
  511.  *        enough but some data available immediately from the internal buffer,
  512.  *        then the call completes with eIO_Success status.  For "peek", if
  513.  *        not all requested data were available, the real I/O occurs to pick up
  514.  *        additional data (if any) from the system. Keep this difference in
  515.  *        mind when programming loops that heavily use "peek"s without "read"s.
  516.  * NOTE2: If on input "size" == 0, then "*n_read" is set to 0, and the
  517.  *        return value can be either of eIO_Success, eIO_Closed or
  518.  *        eIO_Unknown depending on connection status of the socket.
  519.  */
  520. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Read
  521. (SOCK           sock,
  522.  void*          buf,    /* [out] data buffer to read to          */
  523.  size_t         size,   /* [in]  max # of bytes to read to "buf" */
  524.  size_t*        n_read, /* [out] # of bytes read  (can be NULL)  */
  525.  EIO_ReadMethod how     /* [in]  how to read the data            */
  526.  );
  527. /* Push the specified data back to the socket input queue (in the socket's
  528.  * internal read buffer). These can be any data, not necessarily the data
  529.  * previously read from the socket.
  530.  */
  531. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_PushBack
  532. (SOCK        sock,
  533.  const void* buf,  /* [in] data to push back to the socket's local buffer */
  534.  size_t      size  /* [in] # of bytes (starting at "buf") to push back    */
  535.  );
  536. /* Return (for the specified "direction" [eIO_Open to check for closed sock]):
  537.  *   eIO_Closed     -- if the connection was shutdown by SOCK_Shutdown(), or
  538.  *                     (for "eIO_Read" only) if EOF was detected
  539.  *                     if "direction"==eIO_Open, this code means socket closed
  540.  *   eIO_Unknown    -- if an error was detected during the last I/O
  541.  *   eIO_InvalidArg -- if "direction" is not one of:  Open, Read, Write
  542.  *   eIO_Timeout    -- if the socket is not yet actually connected
  543.  *   eIO_Success    -- otherwise (incl. eIO_Timeout on last I/O)
  544.  *
  545.  * NOTE:  The SOCK_Read() and SOCK_Wait(eIO_Read) will not return any error
  546.  *        as long as there is any unread (buffered) data left.
  547.  *        Thus, when you are "peeking" data instead of actually reading it,
  548.  *        then this is the only "non-destructive" way to check whether EOF
  549.  *        or an error has actually occurred on read.
  550.  */
  551. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Status
  552. (SOCK      sock,
  553.  EIO_Event direction  /* [in] one of:  eIO_Open, eIO_Read, eIO_Write */
  554.  );
  555. /* Write "size" bytes from buffer "buf" to "sock".
  556.  * In "*n_written", return the number of bytes actually written.
  557.  * eIO_WritePlain   --  write as many bytes as possible at once and return
  558.  *                      immediately; if no bytes can be written then wait
  559.  *                      at most WRITE timeout, try again and return.
  560.  * eIO_WritePersist --  write all data (doing an internal retry loop
  561.  *                      if necessary); if any single write attempt times out
  562.  *                      or fails then stop writing and return (error code).
  563.  * Return status: eIO_Success -- some bytes were written successfully  [Plain]
  564.  *                            -- all bytes were written successfully [Persist]
  565.  *                other code denotes an error, but some bytes might have
  566.  *                been sent nevertheless (always check *n_written to know).
  567.  *
  568.  * NOTE1: With eIO_WritePlain the call returns eIO_Success iff some data
  569.  *        were actually written to the socket. If no data could be written
  570.  *        (and perhaps timeout expired) this call always returns an error.
  571.  * NOTE2: eIO_WritePlain and eIO_WritePersist differs that the latter can
  572.  *        flag an error condition even if some data were actually written
  573.  *        (see "the rule of thumb" in the comments for SOCK_Read() above).
  574.  * NOTE3: if "size"==0, return value can be eIO_Success if no pending data
  575.  *        left in the socket, or eIO_Timeout if there are still data pending.
  576.  *        In either case, "*n_written" is set to 0 on return.
  577.  */
  578. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Write
  579. (SOCK            sock,
  580.  const void*     buf,       /* [in]  data to write to the socket             */
  581.  size_t          size,      /* [in]  # of bytes (starting at "buf") to write */
  582.  size_t*         n_written, /* [out] # of written bytes (can be NULL)        */
  583.  EIO_WriteMethod how        /* [in]  eIO_WritePlain | eIO_WritePersist       */
  584.  );
  585. /* If there is outstanding connection or output data pending, cancel it.
  586.  * Mark the socket as if it has been shut down for both reading and writing.
  587.  * Break actual connection if any was established.
  588.  * Do not attempt to send anything upon SOCK_Close().
  589.  * This call is available for stream sockets only.
  590.  */
  591. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_Abort
  592. (SOCK sock
  593.  );
  594. /* Get host and port of the socket's peer.
  595.  * If "network_byte_order" is true(non-zero) then return the host/port in the
  596.  * network byte order; otherwise return them in the local host byte order.
  597.  */
  598. extern NCBI_XCONNECT_EXPORT void SOCK_GetPeerAddress
  599. (SOCK            sock,
  600.  unsigned int*   host,                /* [out] the peer's host (can be NULL) */
  601.  unsigned short* port,                /* [out] the peer's port (can be NULL) */
  602.  ENH_ByteOrder   byte_order           /* [in]  host/port byte order          */
  603.  );
  604. /* Get textual representation of the socket's peer.
  605.  * For INET domain sockets, the result is of the form "aaa.bbb.ccc.ddd:ppppp";
  606.  * for UNIX domain socket, the result is the name of the socket's file.
  607.  * On success, return its "buf" argument; return 0 on error.
  608.  */
  609. extern NCBI_XCONNECT_EXPORT char* SOCK_GetPeerAddressString
  610. (SOCK   sock,
  611.  char*  buf,        /* [out] pointer to provided buffer to store the text to */
  612.  size_t buflen      /* [in]  usable size of the buffer above                 */
  613.  );
  614. /* Get an OS-dependent native socket handle to use by platform-specific API.
  615.  * FYI:  on MS-Windows it will be "SOCKET", on other platforms -- "int".
  616.  */
  617. extern NCBI_XCONNECT_EXPORT EIO_Status SOCK_GetOSHandle
  618. (SOCK   sock,
  619.  void*  handle_buf,  /* pointer to a memory area to put the OS handle at */
  620.  size_t handle_size  /* the exact(!) size of the expected OS handle      */
  621.  );
  622. /* By default ("on_off" == eDefault,eOff), sockets will not try to read data
  623.  * from inside SOCK_Write(). If you want to automagically upread the data
  624.  * (and cache it in the internal socket buffer) when the write operation
  625.  * is not immediately available, call this func with "on_off" == eOn.
  626.  * Return prior setting.
  627.  */
  628. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetReadOnWriteAPI
  629. (ESwitch on_off
  630.  );
  631. /* Control the reading-while-writing feature for socket "sock" individually.
  632.  * To reset to the global default behavior (as set by
  633.  * SOCK_SetReadOnWriteAPI), call this function with "on_off" == eDefault.
  634.  * Return prior setting.
  635.  */
  636. extern NCBI_XCONNECT_EXPORT ESwitch SOCK_SetReadOnWrite
  637. (SOCK    sock,
  638.  ESwitch on_off
  639.  );
  640. /******************************************************************************
  641.  *  Connectionless (datagram) sockets
  642.  *
  643.  *  How the datagram exchange API works:
  644.  *
  645.  *  Datagram socket is created with special DSOCK_Create[Ex] calls but the
  646.  *  resulting object is a SOCK handle. That is, almost all SOCK routines
  647.  *  may be applied to the handle. There are few exceptions, though.
  648.  *  In datagram sockets I/O differs from how it is done in stream sockets:
  649.  *
  650.  *  SOCK_Write() writes data into an internal message buffer, appending new
  651.  *  data as they come with each SOCK_Write(). When the message is complete,
  652.  *  SOCK_SendMsg() should be called (optionally with additional last,
  653.  *  or the only [if no SOCK_Write() preceded the call] message fragment)
  654.  *  to actually send the message down the wire. If successful, SOCK_SendMsg()
  655.  *  cleans the internal buffer, and the process may repeat. If unsuccessful,
  656.  *  SOCK_SendMsg() can be repeated with restiction that no additional data are
  657.  *  provided in the call. This way, the entire message will be attempted to
  658.  *  be sent again. On the other hand, if after any SOCK_SendMsg() new data
  659.  *  are added [regardless of whether previous data were successfully sent
  660.  *  or not], all previously written [and kept in the internal send buffer]
  661.  *  data get dropped and replaced with the new data.
  662.  *
  663.  *  DSOCK_WaitMsg() can be used to learn whether there is a new message
  664.  *  available for read by DSOCK_RecvMsg() immediately.
  665.  *
  666.  *  SOCK_RecvMsg() receives the message into an internal receive buffer,
  667.  *  and optionally can return the initial datagram fragment via provided
  668.  *  buffer [this initial fragment is then stripped from what remains unread
  669.  *  in the internal buffer]. Optimized version can supply a maximal message
  670.  *  size (if known in advance), or 0 to get a message of any allowed size.
  671.  *  The actual size of the received message can be obtained via a
  672.  *  pointer-type argument 'msgsize'. The message kept in the internal buffer
  673.  *  can be read out in several SOCK_Read() calls, last returning eIO_Closed,
  674.  *  when all data have been taken out. SOCK_Wait() returns eIO_Success while
  675.  *  there are data in the internal message buffer that SOCK_Read() can read.
  676.  *
  677.  *  SOCK_WipeMsg() can be used to clear the internal message buffers in
  678.  *  either eIO_Read or eIO_Write directions, meaning receive and send
  679.  *  buffers correspondingly.
  680.  */
  681. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_Create
  682. (SOCK*           sock                   /* [out] socket created              */
  683.  );
  684. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_CreateEx
  685. (SOCK*           sock,                  /* [out] socket created              */
  686.  ESwitch         log                    /* [in]  whether to log data activity*/
  687.  );
  688. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_Bind
  689. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  690.  unsigned short  port                   /* [in]  port to bind to (!=0)       */
  691.  );
  692. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_Connect
  693. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  694.  const char*     host,                  /* [in]  peer host                   */
  695.  unsigned short  port                   /* [in]  peer port                   */
  696.  );
  697. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_WaitMsg
  698. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  699.  const STimeout* timeout                /* [in]  time to wait for message    */
  700.  );
  701. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_SendMsg
  702. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  703.  const char*     host,                  /* [in]  hostname or dotted IP       */
  704.  unsigned short  port,                  /* [in]  port number, host byte order*/
  705.  const void*     data,                  /* [in]  additional data to send     */
  706.  size_t          datalen                /* [in]  size of addtl data (bytes)  */
  707.  );
  708. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_RecvMsg
  709. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  710.  void*           buf,                   /* [in]  buf to store msg at,m.b.NULL*/
  711.  size_t          buflen,                /* [in]  buf length provided         */
  712.  size_t          maxmsglen,             /* [in]  maximal expected message len*/
  713.  size_t*         msglen,                /* [out] actual msg size, may be NULL*/
  714.  unsigned int*   sender_addr,           /* [out] net byte order, may be NULL */
  715.  unsigned short* sender_port            /* [out] host byte order, may be NULL*/
  716. );
  717. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_WipeMsg
  718. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  719.  EIO_Event       direction              /* [in]  either of eIO_Read|eIO_Write*/
  720.  );
  721. extern NCBI_XCONNECT_EXPORT EIO_Status DSOCK_SetBroadcast
  722. (SOCK            sock,                  /* [in]  SOCK from DSOCK_Create[Ex]()*/
  723.  int/*bool*/     broadcast              /* [in]  set(1)/unset(0) bcast capab.*/
  724.  );
  725. /******************************************************************************
  726.  *  Type information for SOCK sockets
  727.  */
  728. /* Return non-zero value if socket "sock" was created by DSOCK_Create[Ex]().
  729.  * Return zero otherwise.
  730.  */
  731. extern NCBI_XCONNECT_EXPORT int/*bool*/ SOCK_IsDatagram(SOCK sock);
  732. /* Return non-zero value if socket "sock" was created by SOCK_Create[Ex]().
  733.  * Return zero otherwise.
  734.  */
  735. extern NCBI_XCONNECT_EXPORT int/*bool*/ SOCK_IsClientSide(SOCK sock);
  736. /* Return non-zero value if socket "sock" was created by LSOCK_Accept().
  737.  * Return zero otherwise.
  738.  */
  739. extern NCBI_XCONNECT_EXPORT int/*bool*/ SOCK_IsServerSide(SOCK sock);
  740. /******************************************************************************
  741.  *  AUXILIARY network-specific functions (added for the portability reasons)
  742.  */
  743. /* Return zero on success, non-zero on error.  See BSD gethostname().
  744.  * On error "name" returned emptied (name[0] == '').
  745.  */
  746. extern NCBI_XCONNECT_EXPORT int SOCK_gethostname
  747. (char*  name,          /* [out] (guaranteed to be ''-terminated)           */
  748.  size_t namelen        /* [in]  max # of bytes allowed to put to "name"      */
  749.  );
  750. /* Return zero on success, non-zero on error.  Vaguely related to BSD's
  751.  * inet_ntoa(). On error "buf" returned emptied (buf[0] == '').
  752.  */
  753. extern NCBI_XCONNECT_EXPORT int SOCK_ntoa
  754. (unsigned int addr,      /* [in]  must be in the network byte-order          */
  755.  char*        buf,       /* [out] to be filled by smth. like "123.45.67.89"*/
  756.  size_t       buflen     /* [in]  max # of bytes to put to "buf"             */
  757.  );
  758. /* See man for the BSDisms, htonl() and htons().
  759.  */
  760. extern NCBI_XCONNECT_EXPORT unsigned int SOCK_HostToNetLong
  761. (unsigned int value
  762.  );
  763. #define SOCK_NetToHostLong SOCK_HostToNetLong
  764. extern NCBI_XCONNECT_EXPORT unsigned short SOCK_HostToNetShort
  765. (unsigned short value
  766.  );
  767. #define SOCK_NetToHostShort SOCK_HostToNetShort
  768. /* Deprecated */
  769. #define SOCK_htonl SOCK_HostToNetLong
  770. #define SOCK_ntohl SOCK_NetToHostLong
  771. #define SOCK_htons SOCK_HostToNetShort
  772. #define SOCK_ntohs SOCK_NetToHostShort
  773. /* Return INET host address (in network byte order) of the
  774.  * specified host (or local host, if hostname is passed as NULL),
  775.  * which can be either domain name or an IP address in
  776.  * dotted notation (e.g. "123.45.67.89"). Return 0 on error.
  777.  * NOTE: "0.0.0.0" and "255.255.255.255" are considered invalid.
  778.  */
  779. extern NCBI_XCONNECT_EXPORT unsigned int SOCK_gethostbyname
  780. (const char* hostname  /* [in]  return current host address if hostname is 0 */
  781.  );
  782. /* Take INET host address (in network byte order) and fill out the
  783.  * the provided buffer with the name, which the address corresponds to
  784.  * (in case of multiple names the primary name is used). Return value 0
  785.  * means error, while success is denoted by the 'name' argument returned.
  786.  * Note that on error the name returned emptied (name[0] == '').
  787.  */
  788. extern NCBI_XCONNECT_EXPORT char* SOCK_gethostbyaddr
  789. (unsigned int addr,    /* [in]  host address in network byte order           */
  790.  char*        name,    /* [out] buffer to put the name to                    */
  791.  size_t       namelen  /* [in]  size (bytes) of the buffer above             */
  792.  );
  793. #ifdef __cplusplus
  794. } /* extern "C" */
  795. #endif
  796. /* @} */
  797. /*
  798.  * ---------------------------------------------------------------------------
  799.  * $Log: ncbi_socket.h,v $
  800.  * Revision 1000.4  2004/04/12 17:06:00  gouriano
  801.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.49
  802.  *
  803.  * Revision 6.49  2004/03/23 02:26:55  lavr
  804.  * Typo fix
  805.  *
  806.  * Revision 6.48  2003/11/25 15:07:12  lavr
  807.  * SOCK_Status() to accept eIO_Open
  808.  *
  809.  * Revision 6.47  2003/11/24 19:22:24  lavr
  810.  * SetSelectInternalRestartTimeout() to accept ptr to STimeout
  811.  *
  812.  * Revision 6.46  2003/11/18 20:18:49  lavr
  813.  * +SetSelectInternalRestartTimeout()
  814.  *
  815.  * Revision 6.45  2003/11/12 17:43:08  lavr
  816.  * +SOCK_CloseEx()
  817.  *
  818.  * Revision 6.44  2003/10/24 16:51:11  lavr
  819.  * GetTimeout(eIO_ReadWrite): return the lesser of eIO_Read and eIO_Write
  820.  *
  821.  * Revision 6.43  2003/10/23 12:14:33  lavr
  822.  * Socket feature setters made returning old feature values
  823.  *
  824.  * Revision 6.42  2003/09/23 21:04:43  lavr
  825.  * SOCK_Abort():  argument comment removed as irrelevant (cut&paste mishap)
  826.  *
  827.  * Revision 6.41  2003/08/25 14:38:00  lavr
  828.  * Introduce POLLABLE_Poll() and [L]SOCK<->POLLABLE conversion routines
  829.  *
  830.  * Revision 6.40  2003/07/15 16:42:09  lavr
  831.  * +SOCK_GetPeerAddressString()
  832.  *
  833.  * Revision 6.39  2003/06/12 13:21:21  lavr
  834.  * Added eIO_Timeout as a return code for SOCK_Status()
  835.  *
  836.  * Revision 6.38  2003/05/20 21:24:32  lavr
  837.  * SOCK_Write(): note added on writing 0 bytes to a socket
  838.  *
  839.  * Revision 6.37  2003/05/19 16:42:07  lavr
  840.  * +SOCK_SetReuseAddress[API]() - both EXPERIMENTAL!
  841.  *
  842.  * Revision 6.36  2003/05/14 03:46:15  lavr
  843.  * Revised API to include {0,0} connect timeouts, initial data block
  844.  * Revised datagram socket API
  845.  *
  846.  * Revision 6.35  2003/04/30 16:59:05  lavr
  847.  * Added notice about how datagram API is supposed to work
  848.  *
  849.  * Revision 6.34  2003/04/11 20:57:43  lavr
  850.  * DSOCK_Connect() documented
  851.  *
  852.  * Revision 6.33  2003/04/09 19:05:54  siyan
  853.  * Added doxygen support
  854.  *
  855.  * Revision 6.32  2003/04/04 21:00:09  lavr
  856.  * +SOCK_CreateOnTop()
  857.  *
  858.  * Revision 6.31  2003/01/17 01:32:30  lavr
  859.  * +LSOCK_CreateEx()
  860.  *
  861.  * Revision 6.30  2003/01/16 16:30:57  lavr
  862.  * Add prototype for DSOCK_WipeMsg()
  863.  *
  864.  * Revision 6.29  2003/01/15 19:50:45  lavr
  865.  * Datagram socket interface revised
  866.  *
  867.  * Revision 6.28  2003/01/08 01:59:33  lavr
  868.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  869.  *
  870.  * Revision 6.27  2003/01/07 22:01:43  lavr
  871.  * ChangeLog message corrected
  872.  *
  873.  * Revision 6.26  2003/01/07 21:58:24  lavr
  874.  * Draft DSOCK interface added
  875.  *
  876.  * Revision 6.25  2002/12/05 21:44:50  lavr
  877.  * Retire SOCK_Create() as a macro; reinstate as a regular call
  878.  *
  879.  * Revision 6.24  2002/12/04 16:53:12  lavr
  880.  * Introduce SOCK_CreateEx()
  881.  *
  882.  * Revision 6.23  2002/11/01 20:12:06  lavr
  883.  * Specifically state which IP/name manip. routines do emtpy output buffer
  884.  *
  885.  * Revision 6.22  2002/09/19 18:07:06  lavr
  886.  * Consistency check moved up to be the first thing
  887.  *
  888.  * Revision 6.21  2002/08/27 03:15:01  lavr
  889.  * Deprecate SOCK_{nh}to{hn}{ls}, define more elaborate call names
  890.  * SOCK_{Net|Host}To{Host|Net}{Long|Short} instead
  891.  *
  892.  * Revision 6.20  2002/08/15 18:44:18  lavr
  893.  * SOCK_Poll() documented in more details
  894.  *
  895.  * Revision 6.19  2002/08/12 14:59:12  lavr
  896.  * Additional (last) argument for SOCK_Write: write_mode
  897.  *
  898.  * Revision 6.18  2002/08/07 16:31:00  lavr
  899.  * Added enum ENH_ByteOrder; renamed SOCK_GetAddress() ->
  900.  * SOCK_GetPeerAddress() and now accepts ENH_ByteOrder as last arg;
  901.  * added SOCK_SetInterruptOnSignal[API]; write-status (w_status) made current;
  902.  * log moved to end
  903.  *
  904.  * Revision 6.17  2002/04/26 16:40:43  lavr
  905.  * New method: SOCK_Poll()
  906.  *
  907.  * Revision 6.16  2002/04/22 20:52:34  lavr
  908.  * +SOCK_htons(), macros SOCK_ntohl() and SOCK_ntohs()
  909.  *
  910.  * Revision 6.15  2001/12/03 21:33:48  vakatov
  911.  * + SOCK_IsServerSide()
  912.  *
  913.  * Revision 6.14  2001/09/10 16:10:41  vakatov
  914.  * SOCK_gethostbyname() -- special cases "0.0.0.0" and "255.255.255.255"
  915.  *
  916.  * Revision 6.13  2001/05/21 15:11:46  ivanov
  917.  * Added (with Denis Vakatov) automatic read on write data from the socket
  918.  * (stall protection).
  919.  * Added functions SOCK_SetReadOnWriteAPI(), SOCK_SetReadOnWrite()
  920.  * and internal function s_SelectStallsafe().
  921.  *
  922.  * Revision 6.12  2001/04/23 22:22:06  vakatov
  923.  * SOCK_Read() -- special treatment for "buf" == NULL
  924.  *
  925.  * Revision 6.11  2001/03/22 17:44:14  vakatov
  926.  * + SOCK_AllowSigPipeAPI()
  927.  *
  928.  * Revision 6.10  2001/03/06 23:54:10  lavr
  929.  * Renamed: SOCK_gethostaddr -> SOCK_gethostbyname
  930.  * Added:   SOCK_gethostbyaddr
  931.  *
  932.  * Revision 6.9  2001/03/02 20:05:15  lavr
  933.  * Typos fixed
  934.  *
  935.  * Revision 6.8  2000/12/26 21:40:01  lavr
  936.  * SOCK_Read modified to handle properly the case of 0 byte reading
  937.  *
  938.  * Revision 6.7  2000/12/05 23:27:44  lavr
  939.  * Added SOCK_gethostaddr
  940.  *
  941.  * Revision 6.6  2000/11/15 18:51:05  vakatov
  942.  * Add SOCK_Shutdown() and SOCK_Status().  Remove SOCK_Eof().
  943.  *
  944.  * Revision 6.5  2000/06/23 19:34:41  vakatov
  945.  * Added means to log binary data
  946.  *
  947.  * Revision 6.4  2000/05/30 23:31:37  vakatov
  948.  * SOCK_host2inaddr() renamed to SOCK_ntoa(), the home-made out-of-scratch
  949.  * implementation to work properly with GCC on IRIX64 platforms
  950.  *
  951.  * Revision 6.3  2000/03/24 23:12:04  vakatov
  952.  * Starting the development quasi-branch to implement CONN API.
  953.  * All development is performed in the NCBI C++ tree only, while
  954.  * the NCBI C tree still contains "frozen" (see the last revision) code.
  955.  *
  956.  * Revision 6.2  2000/02/23 22:33:38  vakatov
  957.  * Can work both "standalone" and as a part of NCBI C++ or C toolkits
  958.  *
  959.  * Revision 6.1  1999/10/18 15:36:39  vakatov
  960.  * Initial revision (derived from the former "ncbisock.[ch]")
  961.  *
  962.  * ===========================================================================
  963.  */
  964. #endif /* CONNECT___NCBI_SOCKET__H */