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

📄 ncbi_socket_cxx.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////  CDatagramSocket:://CDatagramSocket::CDatagramSocket(ESwitch log){    if (DSOCK_CreateEx(&m_Socket, log) != eIO_Success)        m_Socket = 0;}EIO_Status CDatagramSocket::Bind(unsigned short  port){    return m_Socket ? DSOCK_Bind(m_Socket, port) : eIO_Closed;}EIO_Status CDatagramSocket::Connect(const string&  host,                                    unsigned short port){    return m_Socket ? DSOCK_Connect(m_Socket, host.c_str(), port) : eIO_Closed;}EIO_Status CDatagramSocket::Send(const void*     data,                                 size_t          datalen,                                 const string&   host,                                 unsigned short  port){    return m_Socket        ? DSOCK_SendMsg(m_Socket, host.c_str(), port, data, datalen)        : eIO_Closed;}EIO_Status CDatagramSocket::Recv(void*           buf,                                 size_t          buflen,                                 size_t*         msglen,                                 string*         sender_host,                                 unsigned short* sender_port,                                 size_t          maxmsglen){    if ( !m_Socket )        return eIO_Closed;    unsigned int addr;    EIO_Status status = DSOCK_RecvMsg(m_Socket, buf, buflen, maxmsglen,                                      msglen, &addr, sender_port);    if ( sender_host )        *sender_host = CSocketAPI::ntoa(addr);    return status;}///////////////////////////////////////////////////////////////////////////////  CListeningSocket:://CListeningSocket::CListeningSocket(void)    : m_Socket(0),      m_IsOwned(eTakeOwnership){    return;}CListeningSocket::CListeningSocket(unsigned short port, unsigned short backlog)    : m_Socket(0),      m_IsOwned(eTakeOwnership){    if (LSOCK_Create(port, backlog, &m_Socket) != eIO_Success)        m_Socket = 0;}CListeningSocket::~CListeningSocket(void){    Close();}EIO_Status CListeningSocket::Listen(unsigned short port,                                    unsigned short backlog){    if ( m_Socket )        return eIO_Unknown;    EIO_Status status = LSOCK_Create(port, backlog, &m_Socket);    if (status != eIO_Success)        m_Socket = 0;    return status;}EIO_Status CListeningSocket::Accept(CSocket*&       sock,                                    const STimeout* timeout) const{    if ( !m_Socket )        return eIO_Closed;    SOCK x_sock;    EIO_Status status = LSOCK_Accept(m_Socket, timeout, &x_sock);    if (status != eIO_Success) {        sock = 0;    } else if ( !(sock = new CSocket) ) {        SOCK_CloseEx(x_sock, 1);        status = eIO_Unknown;    } else        sock->Reset(x_sock, eTakeOwnership, eCopyTimeoutsToSOCK);    return status;}EIO_Status CListeningSocket::Accept(CSocket&        sock,                                    const STimeout* timeout) const{    if ( !m_Socket )        return eIO_Closed;    SOCK x_sock;    EIO_Status status = LSOCK_Accept(m_Socket, timeout, &x_sock);    if (status == eIO_Success)        sock.Reset(x_sock, eTakeOwnership, eCopyTimeoutsToSOCK);    return status;}EIO_Status CListeningSocket::Close(void){    if ( !m_Socket )        return eIO_Success;    EIO_Status status = m_IsOwned != eNoOwnership        ? LSOCK_Close(m_Socket) : eIO_Success;    m_Socket = 0;    return status;}///////////////////////////////////////////////////////////////////////////////  CSocketAPI:://string CSocketAPI::gethostname(void){    char hostname[256];    if (SOCK_gethostname(hostname, sizeof(hostname)) != 0)        *hostname = 0;    return string(hostname);}string CSocketAPI::ntoa(unsigned int host){    char ipaddr[64];    if (SOCK_ntoa(host, ipaddr, sizeof(ipaddr)) != 0)        *ipaddr = 0;    return string(ipaddr);}string CSocketAPI::gethostbyaddr(unsigned int host){    char hostname[256];    if ( !SOCK_gethostbyaddr(host, hostname, sizeof(hostname)) )        *hostname = 0;    return string(hostname);}    unsigned int CSocketAPI::gethostbyname(const string& hostname){    const char* host = hostname.c_str();    return SOCK_gethostbyname(*host ? host : 0);}EIO_Status CSocketAPI::Poll(vector<SPoll>&  polls,                            const STimeout* timeout,                            size_t*         n_ready){    size_t          x_n     = polls.size();    SPOLLABLE_Poll* x_polls = 0;    if (x_n  &&  !(x_polls = new SPOLLABLE_Poll[x_n]))        return eIO_Unknown;    for (size_t i = 0;  i < x_n;  i++) {        CPollable* p     = polls[i].m_Pollable;        EIO_Event  event = polls[i].m_Event;        if (p  &&  event) {            CSocket* s = dynamic_cast<CSocket*> (p);            if (!s) {                CListeningSocket* ls = dynamic_cast<CListeningSocket*> (p);                x_polls[i].poll = POLLABLE_FromLSOCK(ls ? ls->GetLSOCK() : 0);            } else {                x_polls[i].poll =                    POLLABLE_FromSOCK(s->GetStatus(eIO_Open) == eIO_Success ?                                      s->GetSOCK() : 0);            }            x_polls[i].event = event;        } else            x_polls[i].poll  = 0;    }    size_t x_ready;    EIO_Status status = POLLABLE_Poll(x_n, x_polls, timeout, &x_ready);    if (status == eIO_Success) {        for (size_t i = 0;  i < x_n;  i++)            polls[i].m_REvent = x_polls[i].revent;    }    if ( n_ready )        *n_ready = x_ready;    delete[] x_polls;    return status;}END_NCBI_SCOPE/* * --------------------------------------------------------------------------- * $Log: ncbi_socket_cxx.cpp,v $ * Revision 1000.3  2004/06/01 18:45:29  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.24 * * Revision 6.24  2004/05/17 20:58:13  gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 6.23  2003/11/25 15:09:47  lavr * Allow CSocket::Connect() after closing with CSocket::Close() * * Revision 6.22  2003/11/12 17:47:58  lavr * Few fixes of return status; take advantage of SOCK_CloseEx() * * Revision 6.21  2003/10/24 16:51:36  lavr * GetTimeout(eIO_ReadWrite): return the lesser of eIO_Read and eIO_Write * * Revision 6.20  2003/08/25 14:42:42  lavr * Employ new k..Timeout constants;  reimplement more generic form of Poll() * * Revision 6.19  2003/07/15 19:04:04  lavr * Yet another fix for MS-Win compilation * * Revision 6.18  2003/07/15 18:16:44  lavr * Fix MS-Win compilation * * Revision 6.17  2003/07/15 18:09:51  lavr * Use <limits.h> instead of <stdlib.h> to fetch PATH_MAX * * Revision 6.16  2003/07/15 16:50:57  lavr * Implementation of CSocket::GetPeerAddress(void) added * * Revision 6.15  2003/05/14 03:50:54  lavr * Match changes in ncbi_socket.hpp * * Revision 6.14  2003/04/30 17:03:33  lavr * Modified prototypes for CDatagramSocket::Send() and CDatagramSocket::Recv() * * Revision 6.13  2003/04/11 20:59:30  lavr * CDatagramSocket:: API defined completely * * Revision 6.12  2003/02/20 17:55:39  lavr * Inlining CSocket::Shutdown() and CSocket::Wait() * * Revision 6.11  2003/02/14 22:03:43  lavr * Add internal CSocket timeouts and document them * * Revision 6.10  2003/01/24 23:01:19  lavr * Added class CDatagramSocket * * Revision 6.9  2002/12/04 16:56:02  lavr * Employ SOCK_CreateEx() * * Revision 6.8  2002/11/14 01:11:49  lavr * Minor formatting changes * * Revision 6.7  2002/11/01 20:13:15  lavr * Expand hostname buffers to hold up to 256 chars * * Revision 6.6  2002/09/17 20:43:49  lavr * Style conforming tiny little change * * Revision 6.5  2002/09/16 22:32:49  vakatov * Allow to change ownership for the underlying sockets "on-the-fly"; * plus some minor (mostly formal) code and comments rearrangements * * Revision 6.4  2002/08/15 18:48:01  lavr * Change all internal variables to have "x_" prefix in CSocketAPI::Poll() * * Revision 6.3  2002/08/14 15:16:25  lavr * Do not use kEmptyStr for not to depend on xncbi(corelib) library * * Revision 6.2  2002/08/13 19:29:02  lavr * Move most methods out-of-line to this file * * Revision 6.1  2002/08/12 15:15:36  lavr * Initial revision * * =========================================================================== */

⌨️ 快捷键说明

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