void handle_msg(out_msg_ctype& msg) { recv_bytes += msg.size(); if (check_msg && (msg.size() < sizeof(size_t) || 0 != memcmp(&recv_index, msg.data(), sizeof(size_t)))) printf("check msg error: " size_t_format ".\n", recv_index); ++recv_index; }
void file_socket::handle_msg(out_msg_ctype& msg) { if (msg.size() <= ORDER_LEN) { printf("wrong order length: " size_t_format ".\n", msg.size()); return; } switch (*msg.data()) { case 0: if (TRANS_IDLE == state) { trans_end(); char buffer[ORDER_LEN + DATA_LEN]; *buffer = 0; //head file = fopen(boost::next(msg.data(), ORDER_LEN), "rb"); if (NULL != file) { fseeko64(file, 0, SEEK_END); __off64_t length = ftello64(file); memcpy(boost::next(buffer, ORDER_LEN), &length, DATA_LEN); state = TRANS_PREPARE; } else { memset(boost::next(buffer, ORDER_LEN), -1, DATA_LEN); printf("can't not open file %s!\n", boost::next(msg.data(), ORDER_LEN)); } send_msg(buffer, sizeof(buffer), true); } break; case 1: if (TRANS_PREPARE == state && NULL != file && ORDER_LEN + OFFSET_LEN + DATA_LEN == msg.size()) { __off64_t offset; memcpy(&offset, boost::next(msg.data(), ORDER_LEN), OFFSET_LEN); __off64_t length; memcpy(&length, boost::next(msg.data(), ORDER_LEN + OFFSET_LEN), DATA_LEN); if (offset >= 0 && length > 0 && offset + length <= ftello64(file)) { state = TRANS_BUSY; fseeko64(file, offset, SEEK_SET); direct_send_msg(replaceable_buffer(boost::make_shared<file_buffer>(file, length)), true); } } break; case 2: printf("client says: %s\n", boost::next(msg.data(), ORDER_LEN)); break; default: break; } }