Skip to content

Commit 405b74a

Browse files
committed
Descriptions have been improved. Added more checks.
1 parent 740f24d commit 405b74a

File tree

5 files changed

+110
-95
lines changed

5 files changed

+110
-95
lines changed

src/Config.hpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44
#include "Utils.hpp"
55

6-
std::string fileName;
7-
int mtu; // Max packet size to send and receive
86

9-
int ttl; // Max time to wait new packets
10-
int ttl_max;
7+
std::string fileName; // File Name to transfer or receive
8+
9+
int mtu; // Max packet size to send and receive
10+
11+
int ttl; // Current wait time for new packages before shutting down
12+
int ttl_max; // Maximum wait time for new packages before shutting down
1113

1214
SOCKET _socket;
1315

@@ -18,8 +20,8 @@ SOCKADDR_IN broadcast_address = { 0 };
1820
addr_len server_address_length = sizeof(server_address);
1921
addr_len client_address_length = sizeof(client_address);
2022

21-
char* file = nullptr; // Pointer to file in RAM
22-
size_t file_length; // File szie in bytes
23-
char* buffer; // Pointer to buffer
23+
size_t file_length; // File size in bytes
24+
char* file = nullptr; // Pointer to file in RAM
25+
char* buffer = nullptr; // Pointer to buffer
2426

2527
#endif //FILEBROADCASTER_CONFIG_H

src/FileBroadcaster.vcxproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
<Optimization>Disabled</Optimization>
8585
<SDLCheck>true</SDLCheck>
8686
<ConformanceMode>true</ConformanceMode>
87-
<PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions); _WINSOCK_DEPRECATED_NO_WARNINGS</PreprocessorDefinitions>
87+
<PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
8888
<AdditionalIncludeDirectories>$(SolutionDir)/lib/cxxopts/include/</AdditionalIncludeDirectories>
8989
</ClCompile>
9090
</ItemDefinitionGroup>
@@ -110,7 +110,7 @@
110110
<IntrinsicFunctions>true</IntrinsicFunctions>
111111
<SDLCheck>true</SDLCheck>
112112
<ConformanceMode>true</ConformanceMode>
113-
<PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions); _WINSOCK_DEPRECATED_NO_WARNINGS</PreprocessorDefinitions>
113+
<PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions);</PreprocessorDefinitions>
114114
<AdditionalIncludeDirectories>$(SolutionDir)/lib/cxxopts/include/</AdditionalIncludeDirectories>
115115
</ClCompile>
116116
<Link>

src/Main.cpp

+42-39
Original file line numberDiff line numberDiff line change
@@ -6,74 +6,77 @@
66

77

88
int main(int argc, char* argv[]) {
9-
// Parse input options from CLI
9+
// Parsing input parameters from the CLI
1010
cxxopts::Options options("File-Broadcaster", "UDB Broadcast file transfer");
1111

1212
options
1313
.positional_help("[optional args]")
1414
.show_positional_help();
1515

1616
options.add_options()
17-
("p,port", "Port", cxxopts::value<int>()->default_value("33333"))
18-
("f,file", "File name", cxxopts::value<std::string>())
17+
("f,file", "File name", cxxopts::value<std::string>()->default_value("file.out"))
1918
("t,type", "Receiver or sender", cxxopts::value<std::string>()->default_value("sender"))
20-
("ttl", "Time to live", cxxopts::value<int>()->default_value("15"))
19+
("broadcast", "Broadcast address", cxxopts::value<std::string>()->default_value("yes"))
20+
("p,port", "Port", cxxopts::value<int>()->default_value("33333"))
2121
("mtu", "MTU packet", cxxopts::value<int>()->default_value("1500"))
22-
("broadcast", "Broadcast address", cxxopts::value<std::string>()->default_value("yes"));
22+
("ttl", "Time to live", cxxopts::value<int>()->default_value("15"));
2323

2424
auto result = options.parse(argc, argv);
2525

2626
#if defined(_WIN32) || defined(_WIN64) //
27-
WORD socketVer; // Initialize use
27+
WORD socketVer; // Initializing the use
2828
WSADATA wsaData; // of the Winsock DLL
29-
socketVer = MAKEWORD(2, 2); // by a process.
29+
socketVer = MAKEWORD(2, 2); // by this process.
3030
WSAStartup(socketVer, &wsaData); //
3131
#endif //
3232

33-
mtu = result["mtu"].as<int>(); //
34-
ttl = ttl_max = result["ttl"].as<int>(); // Init some var
35-
fileName = result["file"].as<std::string>(); //
33+
mtu = result["mtu"].as<int>(); //
34+
ttl = result["ttl"].as<int>(); // Initializing some variable
35+
ttl_max = result["ttl"].as<int>(); //
36+
fileName = result["file"].as<std::string>(); //
3637

3738

38-
_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); //
39-
if (_socket < 0) { // Create socket with
40-
std::cout << "Can't create socket" << std::endl; // datagram-based protocol
41-
exit(1); //
42-
} //
39+
_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); //
40+
if (_socket < 0) { // Create socket with
41+
std::cout << "Error: Can't create socket" << std::endl; // datagram-based protocol
42+
exit(1); //
43+
} else { //
44+
std::cout << "Ok: Socket created" << std::endl; //
45+
} //
4346

4447
client_address.sin_family = AF_INET; //
45-
client_address.sin_port = htons(result["port"].as<int>()); // Create local address
48+
client_address.sin_port = htons(result["port"].as<int>()); // Creating local address
4649
client_address.sin_addr.s_addr = INADDR_ANY; //
4750

4851
memcpy(&server_address, &client_address, sizeof(server_address)); // Server address == Client address
4952

50-
broadcast_address.sin_family = AF_INET; // Create broadcast
53+
broadcast_address.sin_family = AF_INET; // Creating broadcast
5154
broadcast_address.sin_port = htons(result["port"].as<int>()); // address
5255

53-
if (result["broadcast"].as<std::string>() == "yes") { //
54-
#if defined(_WIN32) || defined(_WIN64) // Give access to
55-
char broadcastEnable = '1'; // broadcast address
56-
#else //
57-
int broadcastEnable = 1; //
58-
#endif //
59-
//
60-
if (setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, //
61-
&broadcastEnable, sizeof(broadcastEnable)) == 0) { //
62-
std::cout << "Got access to broadcast" << std::endl; //
63-
} else { //
64-
std::cerr << "Cant't get access to broadcast" << std::endl; //
65-
exit(1); //
66-
} // If option 'broadcast' is yes
67-
broadcast_address.sin_addr.s_addr = INADDR_BROADCAST; // change server address
68-
} else { // to broadcast
69-
broadcast_address.sin_addr.s_addr = // Else change server address
70-
inet_addr(result["broadcast"].as<std::string>().c_str()); // to address in option
71-
} //
56+
if (result["broadcast"].as<std::string>() == "yes") { //
57+
#if defined(_WIN32) || defined(_WIN64) // Getting access to
58+
char broadcastEnable = '1'; // the broadcast address
59+
#else //
60+
int broadcastEnable = 1; //
61+
#endif //
62+
//
63+
if (setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, //
64+
&broadcastEnable, sizeof(broadcastEnable)) != 0) { //
65+
std::cout << "Ok: Got access to broadcast" << std::endl; //
66+
} else { //
67+
std::cerr << "Error: Cant't get access to broadcast" << std::endl; //
68+
exit(1); //
69+
} // If parameter "broadcast" is "yes", then
70+
broadcast_address.sin_addr.s_addr = INADDR_BROADCAST; // change server address
71+
} else { // to broadcast
72+
broadcast_address.sin_addr.s_addr = // Else change server address
73+
inet_addr(result["broadcast"].as<std::string>().c_str()); // to address in parameter
74+
} //
7275

7376
if (bind(_socket, (sockaddr *)&client_address, sizeof(client_address)) == 0) {//
74-
std::cout << "Bind socket" << std::endl; //
77+
std::cout << "Ok: Socket binded" << std::endl; //
7578
} else { // Bind socket to
76-
std::cerr << "Can't bind socket" << std::endl; // client address
79+
std::cerr << "Error: Can't bind socket" << std::endl; // client address
7780
exit(1); //
7881
} //
7982

@@ -93,7 +96,7 @@ int main(int argc, char* argv[]) {
9396
} else if (result["type"].as<std::string>() == "sender") { // Run receiver or sender
9497
Sender::run(result); // application
9598
} else { //
96-
std::cerr << "Type not found" << std::endl; //
99+
std::cerr << "Error: Type not found" << std::endl; //
97100
}
98101

99102
return 0;

src/Receiver.cpp

+19-15
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@ namespace Receiver {
1010
std::set<int> parts;
1111

1212
/**
13-
* Get empty part's
13+
* Get empty parts
1414
*/
1515
std::vector<int> getEmptyParts() {
1616
std::vector<int> result;
1717
// For each parts
1818
for (int i = 0; i < int((float)file_length / (float)mtu + 0.5); i++) {
19-
if (!parts.count(i)) result.push_back(i);
19+
if (parts.find(i) == parts.end()) result.push_back(i);
2020
}
2121
return result;
2222
}
2323

2424
/**
25-
* Start while receive packet 'FINISH'
26-
* Get empty part's and requests it's from the server
25+
* Runs when "FINISH" packet is received
26+
* Gets empty parts and requests them from the server
2727
*/
2828
void checkParts() {
29-
char* buffer = new char[100];
29+
char buffer[100];
3030

3131
std::vector<int> emptyParts = getEmptyParts();
3232

@@ -37,20 +37,25 @@ void checkParts() {
3737
sendto(_socket, buffer, 10, 0, (sockaddr*) &broadcast_address,//
3838
sizeof(broadcast_address)); //
3939

40-
std::cout << "Requested " << index << " part" << std::endl;
40+
std::cout << "Request part of file with index " << index << std::endl;
4141
}
4242
emptyParts = getEmptyParts();
4343
}
4444

4545
std::ofstream output(fileName, std::ofstream::binary); //
4646
output.write(file, file_length); // Save file
47+
48+
std::cout << "File successfully received" << std::endl;
49+
50+
delete[] file;
51+
exit(0);
4752
}
4853

4954

5055
void run(cxxopts::ParseResult &options) {
5156
bool finish = false; // Sender finish transfering
5257

53-
char* buffer;
58+
char* buffer = new char[2 * mtu];
5459

5560
while (auto length = recvfrom(_socket, buffer, 2 * mtu, 0, (sockaddr*) &server_address, &server_address_length)) {
5661
// Sender is no longer available
@@ -64,25 +69,24 @@ void run(cxxopts::ParseResult &options) {
6469
ttl = ttl_max; // Update ttl
6570

6671
if (strncmp(buffer, "NEW_PACKET", 10) == 0) {
67-
file_length = Utils::getIntFromBytes(buffer + 10, 4);
68-
mtu = Utils::getIntFromBytes(buffer + 14, 4);
72+
file_length = Utils::getIntFromBytes(buffer + 10, 4); // Read section "file length"
6973

70-
buffer = new char[2 * mtu];
7174
file = new char[file_length];
75+
memset(file, 0, file_length);
7276

7377
std::cout << "Receive information about new file size: " << file_length << std::endl;
74-
std::cout << "Part count: " << int((float)file_length / (float)mtu + 0.5) << std::endl;
78+
std::cout << "Number of parts: " << int((float)file_length / (float)mtu + 0.5) << std::endl;
7579
} else if (strncmp(buffer, "TRANSFER", 8) == 0) {
76-
int part = Utils::getIntFromBytes(buffer + 8, 4); // Part index
77-
int size = Utils::getIntFromBytes(buffer + 12, 4); // Part size
80+
int part = Utils::getIntFromBytes(buffer + 8, 4); // Read section "index"
81+
int size = Utils::getIntFromBytes(buffer + 12, 4); // Read section "size"
7882
parts.insert(part);
7983
std::cout << "Receive " << part << " part with size " << size << std::endl;
8084

8185
memcpy(file + part * options["mtu"].as<int>(), buffer + 16, size);
8286
} else if (strncmp(buffer, "FINISH", 6) == 0) {
83-
// If we don't receive a finish message
87+
// If receiver didn't receive a finish message
8488
if (!finish) {
85-
std::cout << "Server finish transfering" << std::endl;
89+
std::cout << "Server finished transferring" << std::endl;
8690
finish = true;
8791
}
8892
}

0 commit comments

Comments
 (0)