Exemple #1
0
void LLBC_IocpPoller::HandleEv_Monitor(LLBC_PollerEvent &ev)
{
    // Wait return value.
    const int waitRet = *reinterpret_cast<int *>(ev.un.monitorEv);

    // Overlapped pointer.
    int off = sizeof(int);
    LLBC_POverlapped ol = *reinterpret_cast<LLBC_POverlapped *>(ev.un.monitorEv + off);
    // Error No.
    off += sizeof(LLBC_POverlapped);
    int errNo = *reinterpret_cast<int *>(ev.un.monitorEv + off);
    // Sub-Error No.
    off += sizeof(int);
    int subErrNo = *reinterpret_cast<int *>(ev.un.monitorEv + off);

    LLBC_Free(ev.un.monitorEv);

    if (HandleConnecting(waitRet, ol, errNo, subErrNo))
        return;

    _Sockets::iterator it  = _sockets.find(ol->sock);
    if (UNLIKELY(it == _sockets.end()))
    {
        if (ol->acceptSock != LLBC_INVALID_SOCKET_HANDLE)
            LLBC_CloseSocket(ol->acceptSock);
        if (ol->data)
            LLBC_Delete(reinterpret_cast<LLBC_MessageBlock *>(ol->data));
        LLBC_Delete(ol);

        return;
    }

    LLBC_Session *session = it->second;
    if (waitRet == LLBC_FAILED)
    {
        session->OnClose(ol, LLBC_New2(LLBC_SessionCloseInfo, errNo, subErrNo));
    }
    else
    {
        if (session->IsListen())
            Accept(session, ol);
        else if (ol->opcode == LLBC_OverlappedOpcode::Send)
            session->OnSend(ol);
        else if (ol->opcode == LLBC_OverlappedOpcode::Receive)
            session->OnRecv(ol);
    }
}
void NetClient::MyRun()
{
    int socket_max_fd = notify_socket_fd_;
	bool socket_set_changed = false;

	std::map<int, void*> tcp_socket_map_tmp;
	std::map<int, void*> udp_socket_map_tmp;

	running_ = true;
	while (running_)
	{
		if(notify_socket_fd_ > socket_max_fd)
		{
			socket_max_fd = notify_socket_fd_;
		}

        fd_set fds_read;
        fd_set fds_write;
        fd_set fds_error;
		FD_ZERO(&fds_read);
		FD_ZERO(&fds_write);
		FD_ZERO(&fds_error);

		FD_SET(notify_socket_fd_, &fds_read);

		socket_map connecting_map_tmp;
		lock_connecting_map_.Lock();
		if (!connecting_map_.empty()) {
			connecting_map_tmp = connecting_map_;
		}
		lock_connecting_map_.UnLock();

		FillFdset(connecting_map_tmp, &fds_read, &fds_write, &fds_error, socket_max_fd, false);
		FillFdset(tcp_socket_map_tmp, &fds_read, &fds_write, &fds_error, socket_max_fd, true);
		FillFdset(udp_socket_map_tmp, &fds_read, NULL,/*&fds_write,*/ &fds_error, socket_max_fd, false);

		int result = select(socket_max_fd+1, &fds_read, &fds_write, &fds_error, 0);
		if (0 >= result)
		{
            //LogWARNING("select error: %s\r\n", strerror(errno));
            //for( size_t i = 0; i < fds_error.fd_count; i++ )
            //{
                //LogWARNING("fd error fd:%u", fds_error.fd_array[i]);
            //}
            lock_tcp_map_.Lock();
            tcp_socket_map_tmp = tcp_socket_map_;
            lock_tcp_map_.UnLock();

            lock_udp_map_.Lock();
            udp_socket_map_tmp = udp_socket_map_;
            lock_udp_map_.UnLock();
			continue;
		}

		if (FD_ISSET(notify_socket_fd_, &fds_read))
		{
			char data;
			uint32_t ip;
			uint16_t port;
            int nErrorCode = 0;
			int nRet = RecvUdpData(notify_socket_fd_, &data, sizeof (char), ip, port);
			if (nRet < 0 && !IsIgnoreSocketError_UDP(nErrorCode))
            {
                //ios re open the notify socket
                LogINFO("Notify socket is closed.socket is:%d, error code is %d, error des:%s", notify_socket_fd_, nErrorCode, strerror(nErrorCode));
                close_socket(notify_socket_fd_);
                int nLocalSocket = CreatUdpSocket();
                if (INVALID_SOCKET != nLocalSocket)
                {
                    notify_socket_port_ = 0;
                    if (0 > Bind(nLocalSocket, ntohl(inet_addr("127.0.0.1")), notify_socket_port_))
                    {
                        close_socket(nLocalSocket);
                    }
                    else
                    {
                        notify_socket_fd_ = nLocalSocket;
                        LogINFO("Notify socket is opened ok!.%d", notify_socket_fd_);
                    }
                }
            }

            if( NULL != timer_event_ && data == '1')
            {
                timer_event_->OnTimerEvent();
            }

			lock_tcp_map_.Lock();
			tcp_socket_map_tmp = tcp_socket_map_;
			lock_tcp_map_.UnLock();

			lock_udp_map_.Lock();
			udp_socket_map_tmp = udp_socket_map_;
			lock_udp_map_.UnLock();
		}

		HandleConnecting(connecting_map_tmp, &fds_read, &fds_write, &fds_error);
		HandleEvent(tcp_socket_map_tmp, &fds_read, &fds_write, &fds_error, HandleTcpSocketEvent);
		HandleEvent(udp_socket_map_tmp, &fds_read, &fds_write, &fds_error, HandleUdpSocketEvent);
	}
}