int32_t CConnection::send(CCorePacket& packet, bool no_delay) { int32_t ret = -1; GAIN_BINSTREAM(strm); *strm << packet; if(sbuffer_.remaining_length() < strm->data_size() + sizeof(uint32_t)) { if(sbuffer_.length() < MAX_BUFFER_SIZE)//扩大TCP发送缓冲区,防止缓冲区太小造成发送包异常 { sbuffer_.realloc_buffer(strm->data_size() + sizeof(uint32_t)); CORE_WARNING("sbuffer realloc buffer, size = " << sbuffer_.length()); } else //发送报文丢弃 { CORE_ERROR("sbuffer is full, sbuffer.size = " << sbuffer_.length()); RETURN_BINSTREAM(strm); return -1; } } THROTTLER()->add_tcp_packet(strm->data_size(), true); send_flag_ = true; if(sbuffer_.put(*strm)) { if(no_delay) { sbuffer_.send(sock_stream_); } if(sbuffer_.data_length() > 0) { REACTOR_INSTANCE()->register_handler(this, MASK_WRITE); } else { REACTOR_INSTANCE()->remove_handler(this, MASK_WRITE); } ret = 0; } RETURN_BINSTREAM(strm); return ret; }
int32_t CoreUDPHandler::send(const CCorePacket& packet, const Inet_Addr& remote_addr) { GAIN_BINSTREAM(bin_strm); uint8_t packet_type = UDP_CORE_PACKET; *bin_strm << packet_type << packet; int32_t ret = send(*bin_strm, remote_addr); RETURN_BINSTREAM(bin_strm); return ret; }
int32_t CoreUDPHandler::send(const string& data, const Inet_Addr& remote_addr) { THROTTLER()->add_udp_packet(data.size(), true); GAIN_BINSTREAM(bin_strm); *bin_strm = data; int rc = send(*bin_strm, remote_addr); RETURN_BINSTREAM(bin_strm); return rc; }
void Connection_Manager::send_dispatch_by_id(CCorePacket& packet, uint32_t sid) { CConnection* conn = get_connection(sid); if(conn == NULL) { GAIN_BINSTREAM(strm); string data; *strm << packet; strm->bin_to_string(data); connecting_by_id(data, sid); RETURN_BINSTREAM(strm); } else { conn->send(packet); } }
int32_t CCoreDCClient::on_php_response(CBasePacket* packet, uint32_t sid) { PHPExcResponse* res = (PHPExcResponse *)packet; //判断解压 if(res->zip == 1) { GAIN_BINSTREAM(strm); strm->resize(res->src_size); uint32_t uncomp_size = 0; if(LZO()->uncompress((uint8_t *)res->result.data(), res->result.size(), strm->get_wptr(), uncomp_size) == 0 && uncomp_size > 0) { strm->set_used_size(uncomp_size); strm->bin_to_string(res->result); } RETURN_BINSTREAM(strm); } DCTimerSet::iterator it = timer_ids_.find(res->exc_id); if(it != timer_ids_.end()) { CoreDCParam* param = cancel_dc_request(res->exc_id); if(param != NULL) { //回执一个结果!!! if(param->event_ != NULL && !param->release_flag_) param->event_->dc_response(param, res->result, res->exc_id); else delete param; } } return 0; }