Beispiel #1
0
    /// 接收线程推进
    void tcp_session::run()
    {
        if (m_notify_connected)
        {
            connect_invoke();
            m_notify_connected = false;
        }

        post_recv(false);
        post_send(false);

        std::size_t bytes;
        while ((bytes = m_recvbuf.gcount()) > 0)
        {
            on_recv(m_recvbuf.gptr(), bytes);
            m_recvbuf.gbump(bytes);
        }

        try_shutdown();

        if (m_both_closed.is_locked() && m_error)
        {
            on_disconnect(m_error);
            m_error.clear();
            m_valid = false;
        }
    }
Beispiel #2
0
int  loop_run(int timeout)
{
    int error;
    DWORD bytes = 0;
    PER_HANDLE_DATA* handle_data = NULL;
    WSAOVERLAPPED* overlap = NULL;

    error = GetQueuedCompletionStatus(default_loop.completion_port, &bytes,
        (ULONG_PTR*)&handle_data, &overlap, timeout);
    if (error == 0)
    {
        error = GetLastError();
        if (error == WAIT_TIMEOUT)
        {
            return 1;
        }
        fprintf(stderr, "%d: %s", error, LAST_ERROR_MSG);
        if (overlap != NULL)
        {
            handle_data->opertype = OperClose;
        }
        else
        {
            if (error == ERROR_INVALID_HANDLE)
            {
                return 0;
            }
            return 1;
        }
    }

    switch(handle_data->opertype)
    {
    case OperConnect:
        on_connected(handle_data);
        break;

    case OperRecv:
        on_recv(handle_data);
        break;

    case OperSend:
        after_sent(handle_data);
        break;

    case OperClose:
        on_close(handle_data);
        break;

    default:
        assert(0);
    }
    return 1;
}
Beispiel #3
0
int app::run(){
	
	while(m_brun){
		
		void* data = NULL;
		if(m_ring_buf.pop(data) == -1){
			continue;
		}
		
		app_hd * msg = (app_hd*)data;
		if(msg->type == tcp_type){
			switch(msg->event){
				case ev_sys_recv:
					on_recv(msg->u.tcp.n, msg->content, msg->length);
					break;
					
				case ev_sys_close:
					on_close(msg->u.tcp.n, *((int*)msg->content));
					delete msg->u.tcp.n;
					break;
					
				case ev_sys_accept:
					on_accept(msg->u.tcp.n);
					break;
					
				case ev_sys_connect_ok:
					on_connect(msg->u.tcp.n);
					break;
					
				case ev_sys_connect_fail:
					on_connect(msg->u.tcp.n);
					delete msg->u.tcp.n;
				break;
				
			}
		}
		else if(msg->type == timer_type){
			on_timer(msg->event, msg->u.timer.interval, msg->u.timer.ptr);
		}
		else if(msg->type == app_type){
			on_app(msg->event, msg->content, msg->length);
		}
		else{
			error_log("msg from unknown app_name(%s)\n", m_name);
		}
		free(msg);
	}
	return 0;
}
Beispiel #4
0
int app::dispatch(const app_hd * msg){
	
	if(msg->type == tcp_type){
		switch(msg->event){
			case ev_sys_recv:
				on_recv(msg->u.tcp.n, msg->content, msg->length);
				break;
				
			case ev_sys_close:
				on_close(msg->u.tcp.n, *((int*)msg->content));
				delete msg->u.tcp.n;
				break;
				
			case ev_sys_accept:
				on_accept(msg->u.tcp.n);
				break;
				
			case ev_sys_connect_ok:
				on_connect(msg->u.tcp.n);
				break;
				
			case ev_sys_connect_fail:
				on_connect(msg->u.tcp.n);
				delete msg->u.tcp.n;
			break;
			
			case ev_sys_write:
				handle_write(msg->u.tcp.n);
			break;
		}
	}
	else if(msg->type == timer_type){
		on_timer(msg->event, msg->u.timer.interval, msg->u.timer.ptr);
	}
	else if(msg->type == app_type){
		on_app(msg->event, msg->content, msg->length);
	}
	else{
		error_log("msg from unknown app_name(%s)\n", m_name);
	}
	return 0;	
}
Beispiel #5
0
    void
    device::body()
    {
        if (_M_poller.poll(-1))
        {
            edges::iterator edges_it;
            std::string pollitem_name = _M_poller.get_triggered();

            // Loop over all edges
            for (edges_it = _M_edges.begin();
                    edges_it != _M_edges.end(); ++edges_it)
            {
                // Get the first part of a pollitem_name; edge ID
                std::string edge_id(pollitem_name.c_str(), edges_it->first.size());

                // Move early to the next edge if this one doesn't match
                if (edge_id != edges_it->first)
                    continue;

                edgepoint::iterator point_it;

                // Loop over all edge points
                for (point_it = edges_it->second.begin();
                        point_it != edges_it->second.end(); ++point_it)
                {
                    // Move to the next edge point if this one doesn't match
                    if (pollitem_name != (edges_it->first + point_it->first))
                        continue;

                    // Pass edge's ID and point's ID to on_recv()
                    on_recv(edges_it->first, point_it->first);
                    return;
                }
            }
        }
    }
Beispiel #6
0
void udp_port::start_recv()
{
	m_socket.async_receive_from(boost::asio::buffer(m_buffer, max_size), m_endpoint, 
		[this](const error_code& err, size_t size) { on_recv(err, size); });
}