示例#1
0
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);
}