void Client::on_payload(uint8_t* p, uint16_t payloadSize, bool encrypted, system::error_code err, size_t bytesTransferred) { unused_parameter(bytesTransferred); PacketAllocator::auto_free f(packetPool, p); if(err) return disconnect("Failure in recv(Payload)."); if(payloadSize < PayloadHeader::SIZE) Transmitter::disconnect(format("Invalid payload size of %2% bytes detected.") % payloadSize); // If this gets triggered, boost is f*****g up and we need to read the docs some more. assert(bytesTransferred == payloadSize); PayloadHeader payload = extract_payload(p, encrypted, cryptoKey.c_array()); uint16_t paramLength = payloadSize - Client::PayloadHeader::SIZE; // LOL. uint8_t* params = p + Client::PayloadHeader::SIZE; if(encrypted) decrypt_params(params, paramLength, cryptoKey.c_array()); registry.dispatch(payload.commandID, params, paramLength); // This begins the recieving loop again! recieve_packet_header(); }
//(author:cylin)=============================================================== void sc_h264d_top::call_nb_transport_bw() { if(dbg_info) std::cout<<sc_core::sc_time_stamp()<<"\tH264.call_nb_bw.next_phase: \t"<<next_phase<<std::endl; switch(next_phase) { case tlm::END_REQ: { delay = SC_ZERO_TIME; cur_phase = next_phase; return_sync_enum = target_socket->nb_transport_bw(*payload_ptr, cur_phase, delay); if(return_sync_enum != tlm::TLM_ACCEPTED){ std::cout<<sc_core::sc_time_stamp()<<"\tH264.call_nb_bw.return error: \t"<<return_sync_enum <<std::endl; sc_stop(); } //next transfer next_phase = tlm::BEGIN_RESP; if(payload_ptr->get_command() == tlm::TLM_WRITE_COMMAND){ event_call_nb_bw.notify(write_response_delay+delay); } else{ event_call_nb_bw.notify(read_response_delay+delay); } break; } case tlm::BEGIN_RESP: { //extract payload extract_payload(); //payload_ptr->set_response_status(tlm::TLM_OK_RESPONSE); //--------------- delay = SC_ZERO_TIME; cur_phase = next_phase; return_sync_enum = target_socket->nb_transport_bw(*payload_ptr, cur_phase, delay); if(return_sync_enum != tlm::TLM_ACCEPTED){ std::cout<<sc_core::sc_time_stamp()<<"\tH264.call_nb_bw.return error: \t"<<return_sync_enum <<std::endl; sc_stop(); } break; } default: break; }//end switch }
//============================================================================= // b_transport //(author:cylin)=============================================================== void sc_h264d_top::b_transport ( tlm::tlm_generic_payload &payload // ref to Generic Payload , sc_core::sc_time &time // delay time ) { //Extract Payload payload_ptr = &payload; //extract_payload(); if(payload_ptr->get_command() == tlm::TLM_WRITE_COMMAND) time = time + accept_delay + write_response_delay; else time = time + accept_delay + read_response_delay; wait(time); time = SC_ZERO_TIME; extract_payload(); return; }
// // will establish a connection, send the // packet and block till a response is obtained. // socket will be closed after the response // is obtained.. // // the buffer is used for the sent as well // as the received data. // void send_packet_and_wait_for_response(char* buffer, int send_len, char* server_host_address, int server_port_number) { int sockfd, n; struct sockaddr_in serv_addr; struct hostent *server; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { fprintf(stderr,"Error: could not open client socket\n"); return; } server = gethostbyname(server_host_address); if (server == NULL) { fprintf(stderr, "Error: server host %s not found..\n",server_host_address); close(sockfd); sockfd = -1; } else { bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr,(char *) &serv_addr.sin_addr.s_addr,server->h_length); serv_addr.sin_port = htons(server_port_number); #ifdef DEBUG fprintf(stderr, "Info: connecting to server %s on port %d .......... \n", server_host_address, server_port_number); #endif n =-1; while(n == -1) { #ifdef USE_GNUPTH n=pth_connect(sockfd,(struct sockaddr*) &serv_addr,sizeof(serv_addr)); #else n=connect(sockfd,(struct sockaddr*) &serv_addr,sizeof(serv_addr)); #endif } #ifdef DEBUG fprintf(stderr, "Info: successfully connected to server %s on port %d .......... \n", server_host_address, server_port_number); #endif while(1) { if(can_write_to_socket(sockfd)) break; __SLEEP__(1000); } #ifdef USE_GNUPTH pth_send(sockfd,buffer,send_len,0); #else send(sockfd,buffer,send_len,0); #endif #ifdef DEBUG char payload[4096]; int pl = extract_payload(buffer,payload,send_len); fprintf(stderr, "Info: sent message %s to server (payload of %d bytes)\n", buffer, pl); if(pl > 0) print_payload(stderr,payload,8,pl); #endif while( (n = receive_string(sockfd,buffer, MAX_BUF_SIZE)) <= 0) { __SLEEP__(1000); } #ifdef DEBUG fprintf(stderr, "Info: received message %s from server\n", buffer); print_payload(stderr,buffer,8,n); #endif close(sockfd); } }