unsigned char * dce_rpc_bind( unsigned long cid, unsigned char *uuid, unsigned short ver, unsigned long *pkt_len) { unsigned char vuid[] = "8a885d04-1ceb-11c9-9fe8-08002b104860"; unsigned char *pkt, *euuid, *tmp; unsigned long cnt; unsigned short ret; PDCE_RPC_BIND rpc_bind; PDCE_RPC rpc; pkt = (unsigned char *)calloc(2048, 1); euuid = (unsigned char *)calloc(strlen(uuid)/2+2, 1); tmp = pkt; pkt += sizeof(DCE_RPC); rpc_bind = (PDCE_RPC_BIND)pkt; rpc_bind->max_xmit = 0x16D0; rpc_bind->max_recv = 0x16D0; rpc_bind->asc_group = 0; rpc_bind->num_con_items = 1; rpc_bind->con_id = 0; rpc_bind->num_trn_items = 1; pkt += sizeof(DCE_RPC_BIND); cnt = encode_uuid(uuid, pkt); pkt += cnt; memcpy(pkt, &ver, sizeof(short)); pkt += sizeof(short); *pkt++ = 0; *pkt++ = 0; cnt = encode_uuid(vuid, pkt); pkt += cnt; *pkt++ = 2; *pkt++ = 0; ret = pkt - tmp; rpc = (PDCE_RPC)tmp; rpc->ver = 5; rpc->ver_minor = 0; rpc->pkt_type = _DCE_RPC_BIND; rpc->pkt_flags = 3; rpc->data_repres = 16; rpc->frag_len = ret + 2; rpc->auth_len = 0; rpc->caller_id = cid; *pkt_len = ret + 2; free(euuid); return tmp; }
bool recv(zmq::socket_t & socket) { clear(); while(1) { zmq::message_t message(0); try { if (!socket.recv(&message, 0)) { return false; } } catch (zmq::error_t error) { //std::cout << "E: " << error.what() << std::endl; return false; } char *data = reinterpret_cast<char*>(message.data()); if (message.size() == 17 && data[0] == 0) { push_back(encode_uuid(msg_to_string(message))); } else { push_back(msg_to_string(message)); } boost::int64_t more; size_t more_size = sizeof(more); socket.getsockopt(ZMQ_RCVMORE, &more, &more_size); if (!more) { break; } } return true; }