/// 接收线程推进 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; } }
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; }
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; }
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; }
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; } } } }
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); }); }