if(err) { return; }
int copy_len = 0; while(byte_transferred > 0) { if(!b_head_parse) { if(byte_transferred + _recv_head_node->_cur_len < MsgNode::HEADER_LEN) { memcpy(_recv_head_node->_msg + _recv_head_node->_cur_len, _data + copy_len, byte_transferred); _recv_head_node->_cur_len += byte_transferred; ::memset(_data, 0, MAX_LENGTH); _socket.async_read_some(boost::asio::buffer(_data, MAX_LENGTH), std::bind(&CSession::HandleRead, this, std::placeholder::_1, std::placeholders::_2, shared_from_this())); return; }
int head_remain = MsgNode::HEADER_LEN - _recv_head_node->_cur_len; memcpy(_recv_head_node->_msg + _recv_head_node->_cur_len, _data + copy_len, head_remain);
copy_len += head_remain; bytes_transferred -= head_remain;
short data_len = 0; memcpy(&data_len, _recv_head_node->_msg, MsgNode::HEADER_LEN);
if(data_len > MAX_LENGTH) { std::cout << "invalid data length is " << data_len << '\n'; _server->ClearSession(_uuid); return; }
_recv_msg_node = make_shared<MsgNode>(data_len); if(bytes_transferred < data_len) { memcpy(_recv_msg_node->_msg + _recv_msg_node->_cur_len, _msg + copy_len, bytes_transferred); _recv_msg_node->_cur_len += bytes_transferred; ::memset(_data, 0, MAX_LENGTH); _socket.async_read_some(boost::asio::buffer(_data, MAX_LENGTH), std::bind(&CSession::HandleRead, this, std::placeholders::_1, std::placeholders::_2, shared_from_this())); b_head_parse = true; return; } }
memcpy(_recv_msg_node->_msg + _recv_msg_node->_cur_len, _data + copy_len, data_len); _recv_msg_node->_cur_len += data_len; copy_len += data_len; bytes_transferred -= data_len; _recv_msg_node->data[_recv_msg_node->_total_len] = '\0';
std::cout << "This Pkg data is " << _recv_msg_node->_msg << '\n';
b_head_parse = false; _recv_head_node->Clear(); }
::memset(_data, 0, MAX_LENGTH); _socket.async_read_some(boost::asio::buffer(_data, MAX_LENTH), std::bind(&CSession::HandleRead, this, std::placeholders::_1, std::placeholders::_2, shared_from_this()));
|