@@ -26,9 +26,6 @@ void sendPart(int part_index) {
26
26
}
27
27
28
28
void run (cxxopts::ParseResult &options) {
29
- std::mt19937 gen (time (0 )); // TODO: remove (for tests only)
30
- std::uniform_int_distribution<> uid (0 , 100 ); // TODO: remove (for tests only)
31
-
32
29
buffer = new char [2 * mtu];
33
30
34
31
std::ifstream input (fileName, std::ios::binary); //
@@ -45,46 +42,41 @@ void run(cxxopts::ParseResult &options) {
45
42
46
43
47
44
snprintf (buffer, 11 , " NEW_PACKET" ); //
48
- Utils::writeBytesFromInt (buffer + 10 , file_length, 4 ); // Send information
45
+ Utils::writeBytesFromInt (buffer + 10 , file_length, 4 ); //
46
+ Utils::writeBytesFromInt (buffer + 14 , mtu, 4 ); // Send information
49
47
sendto (_socket, buffer, 14 , 0 , (sockaddr*) &broadcast_address, // about new file
50
- sizeof (broadcast_address)); //
51
- std::cout << " Send information about new file with size " << (int ) file_length << std::endl;
48
+ sizeof (broadcast_address)); // + size and mtu
49
+ std::cout << " Send information about new file with size " ; //
50
+ std::cout << (int ) file_length << " mtu " << mtu <<std::endl; //
52
51
53
52
int part_index = 0 ;
54
53
55
54
while (part_index * mtu < file_length) { //
56
- sent_part.insert ({ part_index, 0 }); //
57
- //
58
- if (uid (gen) < 90 ) { // Send all parts every 1 sec
59
- sendPart (part_index); //
60
- } //
61
- //
55
+ sent_part.insert ({ part_index, 0 }); //
56
+ //
57
+ sendPart (part_index); // Send parts
58
+ // every 20ms
62
59
part_index++; //
63
- std::this_thread::sleep_for (1s); //
60
+ std::this_thread::sleep_for (20ms); //
64
61
} //
65
62
66
63
snprintf (buffer, 7 , " FINISH" ); // Send information
67
64
sendto (_socket, buffer, 6 , 0 , (sockaddr*) &broadcast_address, // the end of transaction
68
65
sizeof (broadcast_address)); //
69
66
std::cout << " File transfer complete" << std::endl;
67
+ // Last time, while sender send message about finish
68
+ long lastFinishSendTime = 0 ;
70
69
71
- // Set socket receive timeout to 1 sec
72
- #if defined(_WIN32) || defined(_WIN64)
73
- int tv = 1 * 1000 ; // user timeout in milliseconds [ms]
74
- setsockopt (_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof (tv));
75
- #else
76
- struct timeval tv;
77
- tv.tv_sec = 1 ;
78
- tv.tv_usec = 0 ;
79
- setsockopt (_socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tv, sizeof (tv));
80
- #endif
81
-
82
- while (ttl--) {
70
+ while (ttl) {
83
71
auto result = recvfrom (_socket, (char *)buffer, 100 , 0 , (struct sockaddr *) &broadcast_address, &client_address_length);
84
- std::cout << result << std::endl;
85
- if (result <= 0 ) continue ;
86
72
87
- ttl = ttl_max;
73
+ // Every seconds send information about end of sending file
74
+ if (result <= 0 ) {
75
+ ttl--;
76
+ snprintf (buffer, 7 , " FINISH" );
77
+ sendto (_socket, buffer, 6 , 0 , (struct sockaddr *) &broadcast_address, sizeof (broadcast_address));
78
+ continue ;
79
+ }
88
80
89
81
if (strncmp (buffer, " RESEND" , 6 ) == 0 ) {
90
82
int part = Utils::getIntFromBytes (buffer + 6 , 4 );
@@ -93,22 +85,27 @@ void run(cxxopts::ParseResult &options) {
93
85
auto now_ms = std::chrono::time_point_cast<std::chrono::seconds>(now);
94
86
auto epoch = now_ms.time_since_epoch ();
95
87
auto value = std::chrono::duration_cast<std::chrono::seconds>(epoch);
96
- long duration = value.count ();
88
+ long duration = value.count (); // Unix time in second
89
+
90
+ ttl = ttl_max;
97
91
98
- if (duration - sent_part[part] > 1 ) {
92
+ if (duration - sent_part[part] >= 1 ) {
99
93
sent_part[part] = duration;
100
94
std::cout << " Клиент запросил " << part << " часть" << std::endl;
101
95
sendPart (part);
102
96
}
103
- } else if (strncmp (buffer, " STATUS" , 6 ) == 0 ) {
104
- std::cout << " Клиент запросил статус" << std::endl;
105
97
106
- snprintf (buffer, 6 , " FINISH" );
107
- sendto (_socket, buffer, 6 , 0 , (struct sockaddr *) &broadcast_address, sizeof (broadcast_address));
98
+ // Every seconds send information about end of sending file
99
+ if (duration - lastFinishSendTime >= 1 ) {
100
+ lastFinishSendTime = duration;
101
+ snprintf (buffer, 7 , " FINISH" );
102
+ sendto (_socket, buffer, 6 , 0 , (struct sockaddr *) &broadcast_address, sizeof (broadcast_address));
103
+ }
108
104
}
105
+
109
106
}
110
107
std::cout << " Process no longer be working" << std::endl;
111
108
}
112
109
113
110
114
- } // namespace Sender
111
+ } // namespace Sender
0 commit comments