void xm_from() { unsigned long data_size, rsrc_size; char text[64]; if(receive_sync() == ACK) { receive_part(info, DATABYTES, 1); transname(info + I_NAMEOFF + 1, text, info[I_NAMEOFF]); define_name(text); data_size = get4(info + I_DLENOFF); rsrc_size = get4(info + I_RLENOFF); start_info(info, rsrc_size, data_size); start_data(); receive_part(out_buffer, data_size, 1); start_rsrc(); receive_part(out_buffer, rsrc_size, 0); end_file(); } }
void FMTPSender::DoFileRetransmissionParallel(const char* file_name) { // first: client socket; second: list of NACK_MSG info map<int, list<NACK_MSG> >* missing_packet_map = new map<int, list<NACK_MSG> > (); ReceiveRetransRequestsSerial(missing_packet_map); int num_socks = missing_packet_map->size(); if (num_socks == 0) return; int* sorted_socks = new int[num_socks]; SortSocketsByShortestJobs(sorted_socks, missing_packet_map); retrans_sock_list.clear(); for (int i = 0; i < num_socks; i++) { retrans_sock_list.push_back(sorted_socks[i]); } RetransThreadStartInfo start_info(file_name); start_info.sender_ptr = this; start_info.missing_packet_map = missing_packet_map; //start_info.file_name = file_name; pthread_mutex_init(&sock_list_mutex, NULL); pthread_t* retrans_threads = new pthread_t[num_retrans_threads]; for (int i = 0; i < num_retrans_threads; i++) { pthread_create(&retrans_threads[i], NULL, &FMTPSender::StartRetransmissionThread, &start_info); } for (int i = 0; i < num_retrans_threads; i++) { pthread_join(retrans_threads[i], NULL); } delete missing_packet_map; delete[] retrans_threads; pthread_mutex_destroy(&sock_list_mutex); }