Esempio n. 1
0
int CSockPair::creatListener(Q_SOCK &Listener) const
{
    CNETAddr objListen_addr;
    int iRtn = Q_RTN_OK;

    iRtn = objListen_addr.setAddr("127.0.0.1", 0);
    if (Q_RTN_OK != iRtn)
    {
        Q_Printf("set socket addr error. error code %d.", iRtn);

        return iRtn;
    }

    Listener = socket(AF_INET, SOCK_STREAM, 0);
    if (Q_INVALID_SOCK == Listener)
    {
        iRtn = Q_SockError();
        Q_Printf("create socket error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        return Q_RTN_FAILE;
    }

    if (Q_RTN_FAILE == bind(Listener, objListen_addr.getAddr(), (int)objListen_addr.getAddrSize()))
    {
        iRtn = Q_SockError();
        Q_Printf("bind port error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Listener);

        return Q_RTN_FAILE;
    }

    if (Q_RTN_FAILE == listen(Listener, 1))
    {
        iRtn = Q_SockError();
        Q_Printf("listen error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Listener);

        return Q_RTN_FAILE;
    }

    return Q_RTN_OK;
}
Esempio n. 2
0
int CServerLinker::Link(void)
{
    closeSock();

    int iRtn = Q_RTN_OK;
    CNETAddr objAddr;
    int iKeepAlive = 1;

    iRtn = objAddr.setAddr(m_strDesIp.c_str(), m_usDesPort);
    if (Q_RTN_OK != iRtn)
    {
        return iRtn;
    }

    m_Sock = socket(AF_INET, SOCK_STREAM, 0);
    if (Q_INVALID_SOCK == m_Sock)
    {
        iRtn = Q_SockError();
        Q_Printf("create socket error. error code %d, message %s", 
            iRtn, Q_SockError2Str(iRtn));

        return iRtn;
    }

    iRtn = connect(m_Sock, objAddr.getAddr(), objAddr.getAddrSize());
    if (Q_RTN_OK != iRtn)
    {
        iRtn = Q_SockError();
        Q_Printf("connect %s on port %d error. error code %d, message %s", 
            objAddr.getIp().c_str(), objAddr.getPort(), iRtn, Q_SockError2Str(iRtn));

        return iRtn;
    }

    (void)setsockopt(m_Sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, sizeof(iKeepAlive));

    return Q_RTN_OK;
}
Esempio n. 3
0
int CSockInit::Init(void) const
{
#ifdef Q_OS_WIN
    WORD wVersionReq;
    WSAData wsData;

    wVersionReq = MAKEWORD(2, 2);

    int iRtn = WSAStartup(wVersionReq, &wsData);
    if (Q_RTN_OK != iRtn)
    {
        iRtn = Q_SockError();
        Q_Printf("WSAStartup error. error code %d, message %s", iRtn, Q_SockError2Str(iRtn));

        return iRtn;
    }
#endif

    return Q_RTN_OK;
}
Esempio n. 4
0
/************************************************************************
* Function name:Q_SockWrite
* Description  :向socket中写入发送的内容
* IN           :fd --socket句柄 pBuf --要发送的数据 iLens --数据长度
* OUT          :NONE
* Return       :Q_RTN_OK --成功 其他 --失败
* Make By      :lqf/[email protected]
* Date Time    :2014/04/30
* Modification 
* ......record :first program
************************************************************************/
int Q_SockWrite(const Q_SOCK &fd, const char *pBuf, const size_t &iLens)
{
    int iSendSize = Q_INIT_NUMBER;
    size_t iSendTotalSize = Q_INIT_NUMBER;

    do 
    {
        iSendSize = send(fd, pBuf + iSendTotalSize, (int)(iLens - iSendTotalSize), 0);
        if (iSendSize <= 0)
        {
            int iRtn = Q_SockError();
            Q_Printf("send error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

            return Q_RTN_FAILE;
        }

        iSendTotalSize += (size_t)iSendSize;

    } while (iLens > iSendTotalSize);

    return Q_RTN_OK;
}
Esempio n. 5
0
/************************************************************************
* Function name:Q_SockRead
* Description  :从socket中读取内容
* IN           :fd --socket句柄 iLens --读取长度
* OUT          :pBuf --读取数据存放地
* Return       :Q_RTN_OK --成功 其他 --失败
* Make By      :lqf/[email protected]
* Date Time    :2014/04/30
* Modification 
* ......record :first program
************************************************************************/
int Q_SockRead(const Q_SOCK &fd, char *pBuf, const size_t &iLens)
{
    int iRecvSize = Q_INIT_NUMBER;
    size_t iRecvTotalSize = Q_INIT_NUMBER;

    do 
    {
        iRecvSize = recv(fd, pBuf + iRecvTotalSize, (int)(iLens - iRecvTotalSize), 0);
        if (iRecvSize <= 0)
        {
            int iRtn = Q_SockError();
            Q_Printf("recv error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

            return Q_RTN_FAILE;
        }

        iRecvTotalSize += (size_t)iRecvSize;

    } while (iRecvTotalSize < iLens);

    return Q_RTN_OK;
}
Esempio n. 6
0
int CSockPair::creatSockPair(Q_SOCK aeSock[2]) const
{
    Q_SOCK Listener = Q_INVALID_SOCK;
    Q_SOCK Connector = Q_INVALID_SOCK;
    Q_SOCK Acceptor = Q_INVALID_SOCK;
    ev_socklen_t iSize = Q_INIT_NUMBER;
    struct sockaddr_in connect_addr;
    struct sockaddr_in listen_addr;    
    int iKeepAlive = 1;
    int iRtn = Q_RTN_OK;

    if (Q_RTN_OK != creatListener(Listener))
    {
        return Q_RTN_FAILE;
    } 

    Connector = socket(AF_INET, SOCK_STREAM, 0);
    if (Q_INVALID_SOCK == Connector)
    {
        iRtn = Q_SockError();
        Q_Printf("create socket error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));
        evutil_closesocket(Listener);

        return Q_RTN_FAILE;
    }

    iSize = sizeof(connect_addr);
    if (Q_RTN_FAILE == getsockname(Listener, (struct sockaddr *) &connect_addr, &iSize))
    {
        iRtn = Q_SockError();
        Q_Printf("getsockname error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Listener);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

    if (iSize != sizeof (connect_addr))
    {
        Q_Printf("%s", "addr size not equ.");

        evutil_closesocket(Listener);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

    if (Q_RTN_FAILE == connect(Connector, (struct sockaddr *) &connect_addr, sizeof(connect_addr)))
    {
        iRtn = Q_SockError();
        Q_Printf("connect error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Listener);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

    iSize = sizeof(listen_addr);
    Acceptor = accept(Listener, (struct sockaddr *) &listen_addr, &iSize);
    if (Q_INVALID_SOCK == Acceptor)
    {
        iRtn = Q_SockError();
        Q_Printf("accept error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Listener);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

    evutil_closesocket(Listener);

	if (Q_RTN_FAILE == getsockname(Connector, (struct sockaddr *) &connect_addr, &iSize))
    {
        iRtn = Q_SockError();
        Q_Printf("getsockname error. error code %d, message %s ", iRtn, Q_SockError2Str(iRtn));

        evutil_closesocket(Acceptor);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

	if (iSize != sizeof (connect_addr)
		|| listen_addr.sin_family != connect_addr.sin_family
		|| listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
		|| listen_addr.sin_port != connect_addr.sin_port)
    {
        Q_Printf("%s", "addr not equ.");

        evutil_closesocket(Acceptor);
        evutil_closesocket(Connector);

        return Q_RTN_FAILE;
    }

    (void)setsockopt(Connector, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, (int)sizeof(iKeepAlive));
    (void)setsockopt(Acceptor, SOL_SOCKET, SO_KEEPALIVE, (char *)&iKeepAlive, (int)sizeof(iKeepAlive));
    (void)evutil_make_socket_nonblocking(Acceptor);
    (void)evutil_make_socket_nonblocking(Connector);

	aeSock[0] = Acceptor;
	aeSock[1] = Connector;

    return Q_RTN_OK;
}