19 typedef std::chrono::high_resolution_clock
hr_clock;
20 typedef std::chrono::high_resolution_clock::time_point
hr_time;
24 if(input_ < 0.0){ input_ *= -1; }
26 for(
int i = 0; i <= 100; i++){
27 if(input_/std::pow(10.0, (
double)i) < 1.0){
33 for(
int i = -100; i <= 1; i++){
34 if(input_/std::pow(10.0, (
double)i) < 1.0){
47 int spillID, buffSize;
49 std::streampos file_size;
50 std::streampos new_size;
55 std::chrono::duration<double> time_span;
60 std::cout <<
" Size of integer on this machine: " <<
sizeof(int) <<
" bytes\n";
61 std::cout <<
" Size of streampos on this machine: " <<
sizeof(std::streampos) <<
" bytes\n";
63 size_t min_pack_size = 2 + 2*
sizeof(int);
64 std::cout <<
" Minimum packet size: " << min_pack_size <<
" bytes\n\n";
66 bool first_packet =
true;
67 if(poll_server.
Init(5555)){
69 int recv_bytes = poll_server.
RecvMessage(buffer, 1024);
71 if(strcmp(buffer,
"$CLOSE_FILE") == 0){
72 std::cout <<
" Received CLOSE_FILE flag...\n\n";
76 else if(strcmp(buffer,
"$OPEN_FILE") == 0){
77 std::cout <<
" Received OPEN_FILE flag...\n\n";
81 else if(strcmp(buffer,
"$KILL_SOCKET") == 0){
82 std::cout <<
" Received KILL_SOCKET flag...\n\n";
88 size_of_int = (size_t)buffer[0];
89 size_of_spos = (size_t)buffer[1];
91 if(size_of_int !=
sizeof(
int) || size_of_spos !=
sizeof(std::streampos)){
92 std::cout <<
" Warning! basic type size on remote machine does not match local size\n";
93 std::cout <<
" Size of integer on remote machine: " << size_of_int <<
" bytes\n";
94 std::cout <<
" Size of streampos on remote machine: " << size_of_spos <<
" bytes\n\n";
99 clock2 = hr_clock::now();
100 time_span = std::chrono::duration_cast<std::chrono::duration<double> >(clock2 - clock1);
101 if(time_span.count() < 2.0){
continue; }
106 memcpy((
char *)&total_size, &buffer[2], size_of_int);
108 if(total_size <= min_pack_size){
115 std::cout <<
" Null packet...\n\n";
128 size_t fname_size = total_size - (2 + 4*size_of_int) - size_of_spos;
129 char *fname =
new char[fname_size+1];
131 unsigned int index = 2 + size_of_int;
132 memcpy(fname, (
char *)&buffer[index], fname_size); index += fname_size;
133 memcpy((
char *)&new_size, (
char *)&buffer[index], size_of_spos); index += size_of_spos;
134 memcpy((
char *)&spillID, (
char *)&buffer[index], size_of_int); index += size_of_int;
135 memcpy((
char *)&buffSize, (
char *)&buffer[index], size_of_int); index += size_of_int;
136 memcpy((
char *)&end_packet_flag, (
char *)&buffer[index], size_of_int);
137 fname[fname_size] =
'\0';
141 std::cout <<
" recv: " << recv_bytes <<
" bytes\n";
142 std::cout <<
" Packet length: " << total_size <<
" bytes\n";
143 std::cout <<
" Poll2 filename: " << fname <<
"\n";
145 int magnitude =
order(new_size);
146 if(magnitude < 3){ std::cout <<
" Total file size: " << new_size <<
" B\n"; }
147 else if(magnitude >= 3 && magnitude < 6){ std::cout <<
" Total file size: " << new_size/1E3 <<
" kB\n"; }
148 else if(magnitude >= 6 && magnitude < 9){ std::cout <<
" Total file size: " << new_size/1E6 <<
" MB\n"; }
149 else{ std::cout <<
" Total file size: " << new_size/1E9 <<
" GB\n"; }
151 std::cout <<
" Spill number ID: " << spillID <<
"\n";
152 std::cout <<
" Buffer size: " << buffSize <<
" words\n";
153 std::cout <<
" End packet: " << end_packet_flag <<
"\n";
156 dT = time_span.count();
157 double rate = ((double)(new_size - file_size))/dT;
159 magnitude =
order(dT);
160 if(magnitude > -3){ std::cout <<
" Time diff: " << dT <<
" s\n"; }
161 else if(magnitude <= -3 && magnitude > -6){ std::cout <<
" Time diff: " << dT/1E-3 <<
" ms\n"; }
162 else if(magnitude <= -6 && magnitude > -9){ std::cout <<
" Time diff: " << dT/1E-6 <<
" us\n"; }
163 else{ std::cout <<
" Time diff: " << dT/1E-9 <<
" ns\n"; }
165 magnitude =
order(rate);
166 if(magnitude < 3){ std::cout <<
" Data rate: " << rate <<
" B/s\n"; }
167 else if(magnitude >= 3 && magnitude < 6){ std::cout <<
" Data rate: " << rate/1E3 <<
" kB/s\n"; }
168 else if(magnitude >= 6 && magnitude < 9){ std::cout <<
" Data rate: " << rate/1E6 <<
" MB/s\n"; }
169 else{ std::cout <<
" Data rate: " << rate/1E9 <<
" GB/s\n"; }
171 else{ first_packet =
false; }
172 std::cout << std::endl;
174 file_size = new_size;
177 clock1 = std::chrono::high_resolution_clock::now();
void Close()
Close the socket.
int order(double input_)
Find the order of magnitude of an input double.
Provides network connectivity for poll2.
int RecvMessage(char *message_, size_t length_)
std::chrono::high_resolution_clock hr_clock
bool Init(int port_, int sec_=10, int usec_=0)
Initialize the serv object and open a specified port. Returns false if the socket fails to open or th...
std::chrono::high_resolution_clock::time_point hr_time