Skip to content

Commit 31b70bc

Browse files
committed
Improve based on feedback
1 parent 46078ba commit 31b70bc

File tree

5 files changed

+49
-82
lines changed

5 files changed

+49
-82
lines changed

compiled_starters/cpp/src/main.cpp

+14-15
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,56 @@
33
#include <iostream>
44
#include <netdb.h>
55
#include <string>
6-
#include <system_error>
76
#include <unistd.h>
87
#include <arpa/inet.h>
98
#include <sys/socket.h>
109
#include <sys/types.h>
1110

1211
int main(int argc, char* argv[]) {
13-
// Flush after every std::cout / std::cerr
12+
// Disable output buffering
1413
std::cout << std::unitbuf;
1514
std::cerr << std::unitbuf;
1615

17-
// You can use print statements as follows for debugging, they'll be visible when running tests.
18-
std::cerr << "Logs from your program will appear here!\n";
19-
20-
// Create socket
2116
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
2217
if (server_fd < 0) {
23-
throw std::system_error(errno, std::generic_category(), "Failed to create server socket");
18+
std::cerr << "Failed to create server socket: " << std::endl;
19+
return 1;
2420
}
2521

26-
// Set socket options
22+
// Since the tester restarts your program quite often, setting SO_REUSEADDR
23+
// ensures that we don't run into 'Address already in use' errors
2724
int reuse = 1;
2825
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
2926
close(server_fd);
30-
throw std::system_error(errno, std::generic_category(), "setsockopt failed");
27+
std::cerr << "setsockopt failed: " << std::endl;
28+
return 1;
3129
}
3230

33-
// Configure server address
3431
struct sockaddr_in server_addr{};
3532
server_addr.sin_family = AF_INET;
3633
server_addr.sin_addr.s_addr = INADDR_ANY;
3734
server_addr.sin_port = htons(9092);
3835

39-
// Bind socket
4036
if (bind(server_fd, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr)) != 0) {
4137
close(server_fd);
42-
throw std::system_error(errno, std::generic_category(), "Failed to bind to port 9092");
38+
std::cerr << "Failed to bind to port 9092" << std::endl;
39+
return 1;
4340
}
4441

45-
// Listen for connections
4642
int connection_backlog = 5;
4743
if (listen(server_fd, connection_backlog) != 0) {
4844
close(server_fd);
49-
throw std::system_error(errno, std::generic_category(), "listen failed");
45+
std::cerr << "listen failed" << std::endl;
46+
return 1;
5047
}
5148

5249
std::cout << "Waiting for a client to connect...\n";
5350

54-
// Accept client connection
5551
struct sockaddr_in client_addr{};
5652
socklen_t client_addr_len = sizeof(client_addr);
53+
54+
// You can use print statements as follows for debugging, they'll be visible when running tests.
55+
std::cerr << "Logs from your program will appear here!\n";
5756

5857
// Uncomment this block to pass the first stage
5958
//

course-definition.yml

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ completion_percentage: 15
1616

1717
languages:
1818
- slug: "cpp"
19-
release_status: "alpha"
2019
- slug: "gleam"
2120
- slug: "go"
2221
- slug: "java"

solutions/cpp/01-vi6/code/src/main.cpp

+12-13
Original file line numberDiff line numberDiff line change
@@ -3,55 +3,54 @@
33
#include <iostream>
44
#include <netdb.h>
55
#include <string>
6-
#include <system_error>
76
#include <unistd.h>
87
#include <arpa/inet.h>
98
#include <sys/socket.h>
109
#include <sys/types.h>
1110

1211
int main(int argc, char* argv[]) {
13-
// Flush after every std::cout / std::cerr
12+
// Disable output buffering
1413
std::cout << std::unitbuf;
1514
std::cerr << std::unitbuf;
1615

17-
// Create socket
1816
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
1917
if (server_fd < 0) {
20-
throw std::system_error(errno, std::generic_category(), "Failed to create server socket");
18+
std::cerr << "Failed to create server socket: " << std::endl;
19+
return 1;
2120
}
2221

23-
// Set socket options
22+
// Since the tester restarts your program quite often, setting SO_REUSEADDR
23+
// ensures that we don't run into 'Address already in use' errors
2424
int reuse = 1;
2525
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
2626
close(server_fd);
27-
throw std::system_error(errno, std::generic_category(), "setsockopt failed");
27+
std::cerr << "setsockopt failed: " << std::endl;
28+
return 1;
2829
}
2930

30-
// Configure server address
3131
struct sockaddr_in server_addr{};
3232
server_addr.sin_family = AF_INET;
3333
server_addr.sin_addr.s_addr = INADDR_ANY;
3434
server_addr.sin_port = htons(9092);
3535

36-
// Bind socket
3736
if (bind(server_fd, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr)) != 0) {
3837
close(server_fd);
39-
throw std::system_error(errno, std::generic_category(), "Failed to bind to port 9092");
38+
std::cerr << "Failed to bind to port 9092" << std::endl;
39+
return 1;
4040
}
4141

42-
// Listen for connections
4342
int connection_backlog = 5;
4443
if (listen(server_fd, connection_backlog) != 0) {
4544
close(server_fd);
46-
throw std::system_error(errno, std::generic_category(), "listen failed");
45+
std::cerr << "listen failed" << std::endl;
46+
return 1;
4747
}
4848

4949
std::cout << "Waiting for a client to connect...\n";
5050

51-
// Accept client connection
5251
struct sockaddr_in client_addr{};
5352
socklen_t client_addr_len = sizeof(client_addr);
54-
53+
5554
int client_fd = accept(server_fd, reinterpret_cast<struct sockaddr*>(&client_addr), &client_addr_len);
5655
std::cout << "Client connected\n";
5756
close(client_fd);

solutions/cpp/01-vi6/diff/src/main.cpp.diff

+9-38
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,32 @@
1-
@@ -1,66 +1,61 @@
2-
#include <cstdlib>
3-
#include <cstring>
4-
#include <iostream>
5-
#include <netdb.h>
6-
#include <string>
7-
#include <system_error>
8-
#include <unistd.h>
9-
#include <arpa/inet.h>
10-
#include <sys/socket.h>
11-
#include <sys/types.h>
12-
13-
int main(int argc, char* argv[]) {
14-
// Flush after every std::cout / std::cerr
15-
std::cout << std::unitbuf;
16-
std::cerr << std::unitbuf;
17-
18-
- // You can use print statements as follows for debugging, they'll be visible when running tests.
19-
- std::cerr << "Logs from your program will appear here!\n";
20-
-
21-
// Create socket
22-
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
23-
if (server_fd < 0) {
24-
throw std::system_error(errno, std::generic_category(), "Failed to create server socket");
25-
}
26-
27-
// Set socket options
28-
int reuse = 1;
29-
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
30-
close(server_fd);
31-
throw std::system_error(errno, std::generic_category(), "setsockopt failed");
1+
@@ -29,37 +29,32 @@
322
}
333

34-
// Configure server address
354
struct sockaddr_in server_addr{};
365
server_addr.sin_family = AF_INET;
376
server_addr.sin_addr.s_addr = INADDR_ANY;
387
server_addr.sin_port = htons(9092);
398

40-
// Bind socket
419
if (bind(server_fd, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr)) != 0) {
4210
close(server_fd);
43-
throw std::system_error(errno, std::generic_category(), "Failed to bind to port 9092");
11+
std::cerr << "Failed to bind to port 9092" << std::endl;
12+
return 1;
4413
}
4514

46-
// Listen for connections
4715
int connection_backlog = 5;
4816
if (listen(server_fd, connection_backlog) != 0) {
4917
close(server_fd);
50-
throw std::system_error(errno, std::generic_category(), "listen failed");
18+
std::cerr << "listen failed" << std::endl;
19+
return 1;
5120
}
5221

5322
std::cout << "Waiting for a client to connect...\n";
5423

55-
// Accept client connection
5624
struct sockaddr_in client_addr{};
5725
socklen_t client_addr_len = sizeof(client_addr);
58-
26+
27+
- // You can use print statements as follows for debugging, they'll be visible when running tests.
28+
- std::cerr << "Logs from your program will appear here!\n";
29+
-
5930
- // Uncomment this block to pass the first stage
6031
- //
6132
- // int client_fd = accept(server_fd, reinterpret_cast<struct sockaddr*>(&client_addr), &client_addr_len);

starter_templates/cpp/code/src/main.cpp

+14-15
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,56 @@
33
#include <iostream>
44
#include <netdb.h>
55
#include <string>
6-
#include <system_error>
76
#include <unistd.h>
87
#include <arpa/inet.h>
98
#include <sys/socket.h>
109
#include <sys/types.h>
1110

1211
int main(int argc, char* argv[]) {
13-
// Flush after every std::cout / std::cerr
12+
// Disable output buffering
1413
std::cout << std::unitbuf;
1514
std::cerr << std::unitbuf;
1615

17-
// You can use print statements as follows for debugging, they'll be visible when running tests.
18-
std::cerr << "Logs from your program will appear here!\n";
19-
20-
// Create socket
2116
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
2217
if (server_fd < 0) {
23-
throw std::system_error(errno, std::generic_category(), "Failed to create server socket");
18+
std::cerr << "Failed to create server socket: " << std::endl;
19+
return 1;
2420
}
2521

26-
// Set socket options
22+
// Since the tester restarts your program quite often, setting SO_REUSEADDR
23+
// ensures that we don't run into 'Address already in use' errors
2724
int reuse = 1;
2825
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
2926
close(server_fd);
30-
throw std::system_error(errno, std::generic_category(), "setsockopt failed");
27+
std::cerr << "setsockopt failed: " << std::endl;
28+
return 1;
3129
}
3230

33-
// Configure server address
3431
struct sockaddr_in server_addr{};
3532
server_addr.sin_family = AF_INET;
3633
server_addr.sin_addr.s_addr = INADDR_ANY;
3734
server_addr.sin_port = htons(9092);
3835

39-
// Bind socket
4036
if (bind(server_fd, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr)) != 0) {
4137
close(server_fd);
42-
throw std::system_error(errno, std::generic_category(), "Failed to bind to port 9092");
38+
std::cerr << "Failed to bind to port 9092" << std::endl;
39+
return 1;
4340
}
4441

45-
// Listen for connections
4642
int connection_backlog = 5;
4743
if (listen(server_fd, connection_backlog) != 0) {
4844
close(server_fd);
49-
throw std::system_error(errno, std::generic_category(), "listen failed");
45+
std::cerr << "listen failed" << std::endl;
46+
return 1;
5047
}
5148

5249
std::cout << "Waiting for a client to connect...\n";
5350

54-
// Accept client connection
5551
struct sockaddr_in client_addr{};
5652
socklen_t client_addr_len = sizeof(client_addr);
53+
54+
// You can use print statements as follows for debugging, they'll be visible when running tests.
55+
std::cerr << "Logs from your program will appear here!\n";
5756

5857
// Uncomment this block to pass the first stage
5958
//

0 commit comments

Comments
 (0)