BOOL CNetPTCPConnection::OnEpollEvent(UINT EventID)
{
	if(m_Socket.IsConnected())
	{
		if(EventID&(EPOLLERR|EPOLLHUP))
		{
			PrintNetLog(0xffffffff,"CNetPTCPConnection::Epoll发生错误%d!",errno);
			Disconnect();
			return TRUE;
		}
		if(EventID&EPOLLIN)
		{
			DoRecv();
		}
		if(EventID&EPOLLOUT)
		{
			DoSend();
		}
	}
	else
	{
		PrintNetLog(0xffffffff,"(%d)Connection未连接,Epoll事件被忽略!",GetID());
	}


	return FALSE;
}
예제 #2
0
void 
EasyIocp::DoAcceptWithData(CompListenKey *listenKey, int index, EasyIocpBuffer *iocpBuffer, sockaddr_in *serverAddr, sockaddr_in *clientAddr)
{
	//acceptSock是用来和客户端进行收发数据的socket
	SOCKET acceptSock = listenKey->GetOneAcceptSock(index);
	if(acceptSock == INVALID_SOCKET) {
		print("EasyIocp::DoAcceptWithData: acceptSock is INVALID_SOCKET.");
		return;
	}

	CompTransmitKey *transKey = easyClients_.NewClient(acceptSock, serverAddr, clientAddr);
	if(!transKey) {
		print("EasyIocp::DoAcceptWithData: invalid transKey.");
		return;
	}

	//关联套接字与完成端口
	if(!CreateIoCompletionPort((HANDLE)acceptSock, hCompPort_, (ULONG_PTR)transKey, 0)) {
		ErrorSysMessage("EasyIocp::DoAcceptWithData: associate socket failed.");
		easyClients_.RemoveClient(acceptSock);
		return;
	}

	transKey->SetOperType(operRecv);
	EasyIocpBuffer *transBuffer = transKey->GetBuffer();
	transBuffer->operator=(*iocpBuffer);

	DoRecv(transKey, iocpBuffer->GetTransBytes());
}
예제 #3
0
bool Connection::OnConnected() {
#ifdef _DEBUG
	_establish = true;
#endif
	if (DoRecv()) {
		_session->OnConnected(Kernel::Instance());
		_recving = true;
		return true;
	}
	return false;
}
예제 #4
0
int
ssl_SecureRecv(sslSocket *ss, unsigned char *buf, int len, int flags)
{
    int rv = 0;

    if (ss->shutdownHow & ssl_SHUTDOWN_RCV) {
        PORT_SetError(PR_SOCKET_SHUTDOWN_ERROR);
        return PR_FAILURE;
    }
    if (flags & ~PR_MSG_PEEK) {
        PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
        return PR_FAILURE;
    }

    if (!ssl_SocketIsBlocking(ss) && !ss->opt.fdx) {
        ssl_GetXmitBufLock(ss);
        if (ss->pendingBuf.len != 0) {
            rv = ssl_SendSavedWriteData(ss);
            if ((rv < 0) && (PORT_GetError() != PR_WOULD_BLOCK_ERROR)) {
                ssl_ReleaseXmitBufLock(ss);
                return SECFailure;
            }
        }
        ssl_ReleaseXmitBufLock(ss);
    }

    rv = 0;
    if (!PR_CLIST_IS_EMPTY(&ss->ssl3.hs.bufferedEarlyData)) {
        PORT_Assert(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3);
        return tls13_Read0RttData(ss, buf, len);
    }

    /* If any of these is non-zero, the initial handshake is not done. */
    if (!ss->firstHsDone) {
        ssl_Get1stHandshakeLock(ss);
        if (ss->handshake) {
            rv = ssl_Do1stHandshake(ss);
        }
        ssl_Release1stHandshakeLock(ss);
    }
    if (rv < 0) {
        return rv;
    }

    if (len == 0)
        return 0;

    rv = DoRecv(ss, (unsigned char *)buf, len, flags);
    SSL_TRC(2, ("%d: SSL[%d]: recving %d bytes securely (errno=%d)",
                SSL_GETPID(), ss->fd, rv, PORT_GetError()));
    return rv;
}
예제 #5
0
int
ssl_SecureRecv(sslSocket *ss, unsigned char *buf, int len, int flags)
{
    sslSecurityInfo *sec;
    int              rv   = 0;

    sec = &ss->sec;

    if (ss->shutdownHow & ssl_SHUTDOWN_RCV) {
	PORT_SetError(PR_SOCKET_SHUTDOWN_ERROR);
    	return PR_FAILURE;
    }
    if (flags & ~PR_MSG_PEEK) {
	PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
    	return PR_FAILURE;
    }

    if (!ssl_SocketIsBlocking(ss) && !ss->opt.fdx) {
	ssl_GetXmitBufLock(ss);
	if (ss->pendingBuf.len != 0) {
	    rv = ssl_SendSavedWriteData(ss);
	    if ((rv < 0) && (PORT_GetError() != PR_WOULD_BLOCK_ERROR)) {
		ssl_ReleaseXmitBufLock(ss);
		return SECFailure;
	    }
	    /* XXX short write? */
	}
	ssl_ReleaseXmitBufLock(ss);
    }
    
    rv = 0;
    /* If any of these is non-zero, the initial handshake is not done. */
    if (!ss->firstHsDone) {
	ssl_Get1stHandshakeLock(ss);
	if (ss->handshake || ss->nextHandshake || ss->securityHandshake) {
	    rv = ssl_Do1stHandshake(ss);
	}
	ssl_Release1stHandshakeLock(ss);
    }
    if (rv < 0) {
	return rv;
    }

    if (len == 0) return 0;

    rv = DoRecv(ss, (unsigned char*) buf, len, flags);
    SSL_TRC(2, ("%d: SSL[%d]: recving %d bytes securely (errno=%d)",
		SSL_GETPID(), ss->fd, rv, PORT_GetError()));
    return rv;
}
예제 #6
0
void CClient::Initialize()
{
	
	if (g_startType == 0)
	{
		DoRecv();
		m_bEstablished = true;
		m_process.AddTotalOpen(1);
	}
	else
	{
		m_sockptr->DoConnect(g_remoteIP, g_remotePort, std::bind(& CClient::OnConnected, shared_from_this(), std::placeholders::_1));
	}	
}
예제 #7
0
void CSSLClientAsync::OnRecv()
{
    if (GetSSLConnectStatus() == TRUE)
    {
        char szBuf[TCP_RECV_SIZE] = {0};
        int32_t nRet = SSL_read(GetSSL(), szBuf, TCP_RECV_SIZE);
        if (nRet > 0)
        {
            int32_t nBufSize = nRet;
            char szIP[32] = {0};
            int32_t nPort = 0;
            S_GetPeerName(GetSocket(), szIP, &nPort);
            DoRecv(GetSocketID(), szBuf, nBufSize, szIP, nPort);
        }
        else if (nRet == 0)
        {
            int32_t nErrorCode = SSL_get_error(GetSSL(), nRet);
            if (SSL_ERROR_ZERO_RETURN == nErrorCode)
            {
                //对方关闭socket
                SOCKET_IO_WARN("recv ssl data error, peer closed.");
                DoException(GetSocketID(), SOCKET_IO_SSL_RECV_FAILED);
            }
            else
            {
                SOCKET_IO_ERROR("recv ssl data error.");
                DoException(GetSocketID(), SOCKET_IO_SSL_RECV_FAILED);
            }
        }
        else
        {
            int32_t nErrorCode = SSL_get_error(GetSSL(), nRet);
            if (SSL_ERROR_WANT_READ == nErrorCode || SSL_ERROR_WANT_WRITE == nErrorCode)
            {
                //用select/epoll/iocp的方式应该很少会有这个情况出现
                SOCKET_IO_DEBUG("recv ssl data error, buffer is blocking.");
            }
            else
            {
                SOCKET_IO_ERROR("recv ssl data error, errno: %d.", nErrorCode);
                DoException(GetSocketID(), SOCKET_IO_SSL_RECV_FAILED);
            }
        }
    }
    else
    {
        SSLConnect();
    }
}
int CTcpNetHandler::HandleEvent(int iConn, int iType) {
	switch (iType) {
	case TCP_SERVER_ACCEPT:
		DoConn(iConn);
		break;
	case TCP_SERVER_READ:
		DoRecv(iConn);
		break;
	case TCP_SERVER_SEND:
		DoSend(iConn);
		break;
	case TCP_SERVER_CLOSE:
		DoClose(iConn);
		break;
	}
	return 0;
}
예제 #9
0
    boost_ec UdpPointImpl::goStart(endpoint local_endpoint)
    {
        if (init_) return MakeNetworkErrorCode(eNetworkErrorCode::ec_estab);

        try {
            socket_.reset(new udp::socket(GetUdpIoService(), udp::endpoint(local_endpoint)));
        } catch (boost::system::system_error& e) {
            return e.code();
        }

        boost_ec ignore_ec;
        local_addr_ = endpoint(socket_->local_endpoint(ignore_ec), local_endpoint.ext());
        init_ = true;
        auto this_ptr = this->shared_from_this();
        go_dispatch(egod_robin) [this_ptr] {
            this_ptr->DoRecv();
        };
        return boost_ec();
    }
예제 #10
0
void CClient::OnRecv(zsummer::network::ErrorCode ec, int nRecvedLen)
{
	if (ec)
	{
		LOGD("remote socket closed");
		OnClose();
		return;
	}

	m_recving._len += nRecvedLen;

	int needRecv = zsummer::protocol4z::CheckBuffIntegrity(m_recving._orgdata, m_recving._len, _MSG_BUF_LEN);
	if ( needRecv == -1)
	{
		LOGD("killed socket: CheckBuffIntegrity error ");
		m_sockptr->DoClose();
		OnClose();
		return;
	}
	if (needRecv > 0)
	{
		m_sockptr->DoRecv(m_recving._orgdata+m_recving._len, needRecv, std::bind(&CClient::OnRecv, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
		return ;
	}

	//! 解包完成 进行消息处理
	zsummer::protocol4z::ReadStream rs(m_recving._orgdata, m_recving._len);
	try
	{
		MessageEntry(rs);
	}
	catch (std::runtime_error e)
	{
		LOGD("MessageEntry catch one exception: "<< e.what() );
		m_sockptr->DoClose();
		OnClose();
		return ;
	}
	m_process.AddTotalRecvLen(m_recving._len);
	m_process.AddTotalRecvCount(1);
	//! 继续收包
	DoRecv();
}
예제 #11
0
void CClient::OnConnected(zsummer::network::ErrorCode ec)
{
	if (ec)
	{
		LOGD("OnConnected failed. ec=" << ec);
		return;
	}
	LOGD("OnConnected success");
	DoRecv();
	m_bEstablished = true;
	m_process.AddTotalOpen(1);
	if (g_intervalMs > 0)
	{
		m_process.GetZSummer().CreateTimer(g_intervalMs, std::bind(&CClient::SendOnce, shared_from_this()));
	}
	else
	{
		SendOnce();
	}
}
예제 #12
0
void CTcpSocket::OnRecv( const system::error_code& ec, size_t nByteTransferred )
{
	if (ec)
	{
		LOGError(ec.message().c_str());

		DoClose();
		return ;
	}

	m_wHaveRecvLength += nByteTransferred;

	// 黏包解析
	USHORT wReadLength = 0;	//解析长度修改都是完整消息包

	while (true)
	{
		const char *pPacketHead = m_szRecvBuffer + wReadLength;
		USHORT wRemainLength = m_wHaveRecvLength - wReadLength;

		USHORT wReadPacketLength = ReadPacket(pPacketHead, wRemainLength);
		if (wReadPacketLength > 0)
		{
			wReadLength += wReadPacketLength;
		}
		else
		{
			if ((wRemainLength > 0) 
				&& (wRemainLength != m_wHaveRecvLength))
			{
				memcpy(m_szRecvBuffer, m_szRecvBuffer+wReadLength, wRemainLength);
			}
			
			m_wHaveRecvLength = wRemainLength;
			break;
		}
	}

	DoRecv();
}