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; }
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; }
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; }
/************************************************************************ * 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; }
/************************************************************************ * 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; }
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; }