Skip to content

Commit 4183815

Browse files
committed
fix: several fixes
1 parent 17a455f commit 4183815

File tree

3 files changed

+96
-16
lines changed

3 files changed

+96
-16
lines changed

include/win_socket.hpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#pragma comment(lib, "Mswsock.lib")
1717
#pragma comment(lib, "AdvApi32.lib")
1818
#include "socket.hpp"
19+
#include "utils.hpp"
20+
#include "base_exceptions.hpp"
21+
#include "console_logger.hpp"
1922

2023
namespace tpt
2124
{
@@ -28,16 +31,20 @@ namespace tpt
2831
unsigned int port;
2932
unsigned int max_connections;
3033
std::string ip_address;
34+
std::vector<std::string> ip_blacklist;
35+
ConsoleLogger logger;
3136

3237
public:
3338
WinSocket();
34-
WinSocket(unsigned int port);
35-
WinSocket(std::string ip_address, unsigned int port);
36-
WinSocket(std::string ip_address, unsigned int port, unsigned int max_connections);
39+
WinSocket(ConsoleLogger logger);
40+
WinSocket(ConsoleLogger logger, unsigned int port);
41+
WinSocket(ConsoleLogger logger, std::string ip_address, unsigned int port);
42+
WinSocket(ConsoleLogger logger, std::string ip_address, unsigned int port, unsigned int max_connections);
3743
~WinSocket();
44+
std::string getClientIp();
3845
virtual void bindSocket() override;
3946
virtual void listenToConnections() override;
40-
virtual void acceptConnection(SOCKET&client_socket, void *client_address) override;
47+
virtual void acceptConnection(SOCKET &client_socket, void *client_address) override;
4148
virtual ssize_t receiveData(SOCKET client_socket, char *buffer, unsigned int buffer_size) override;
4249
virtual void sendData(SOCKET client_socket, const void *buffer, unsigned int buffer_size, int flags) override;
4350
virtual void closeSocket() override;

src/unix_socket.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ UnixSocket::UnixSocket()
1818
std::cout << "Error code: " + errno << std::endl;
1919
exit(EXIT_FAILURE);
2020
}
21-
std::cout << "Socket created!" << std::endl;
21+
LOG_INFO(logger, "Socket created!");
2222

2323
this->server_address.sin_family = AF_INET;
2424
this->server_address.sin_port = htons(this->port);
@@ -42,7 +42,7 @@ UnixSocket::UnixSocket(ConsoleLogger logger)
4242
std::cout << "Error code: " + errno << std::endl;
4343
exit(EXIT_FAILURE);
4444
}
45-
std::cout << "Socket created!" << std::endl;
45+
LOG_INFO(logger, "Socket created!");
4646

4747
this->server_address.sin_family = AF_INET;
4848
this->server_address.sin_port = htons(this->port);
@@ -66,7 +66,7 @@ UnixSocket::UnixSocket(ConsoleLogger logger, unsigned int port)
6666
std::cout << "Error code: " + errno << std::endl;
6767
exit(EXIT_FAILURE);
6868
}
69-
std::cout << "Socket created!" << std::endl;
69+
LOG_INFO(logger, "Socket created!");
7070

7171
this->server_address.sin_family = AF_INET;
7272
this->server_address.sin_port = htons(this->port);

src/win_socket.cpp

+82-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ WinSocket::WinSocket()
88
this->ip_address = "127.0.0.1";
99
this->port = 8000;
1010
this->max_connections = 10;
11+
this->logger = ConsoleLogger();
1112

1213
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
1314
{
@@ -28,13 +29,46 @@ WinSocket::WinSocket()
2829
this->server_address.sin_family = AF_INET;
2930
this->server_address.sin_port = htons(this->port);
3031
this->server_address.sin_addr.s_addr = inet_addr(this->ip_address.c_str());
32+
33+
Utils::fillIPBlacklist(this->ip_blacklist);
34+
}
35+
36+
WinSocket::WinSocket(ConsoleLogger logger)
37+
{
38+
this->ip_address = "127.0.0.1";
39+
this->port = 8000;
40+
this->max_connections = 10;
41+
this->logger = logger;
42+
43+
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
44+
{
45+
std::printf("Failed. Error Code : %d", WSAGetLastError());
46+
WSACleanup();
47+
exit(EXIT_FAILURE);
48+
}
49+
50+
std::cout << "Creating socket ..." << std::endl;
51+
this->server_socket = socket(AF_INET, SOCK_STREAM, 0);
52+
if (this->server_socket == INVALID_SOCKET)
53+
{
54+
std::printf("Could not create socket: %d\n", WSAGetLastError());
55+
WSACleanup();
56+
exit(EXIT_FAILURE);
57+
}
58+
59+
this->server_address.sin_family = AF_INET;
60+
this->server_address.sin_port = htons(this->port);
61+
this->server_address.sin_addr.s_addr = inet_addr(this->ip_address.c_str());
62+
63+
Utils::fillIPBlacklist(this->ip_blacklist);
3164
}
3265

33-
WinSocket::WinSocket(unsigned int port)
66+
WinSocket::WinSocket(ConsoleLogger logger, unsigned int port)
3467
{
3568
this->ip_address = "127.0.0.1";
3669
this->port = port;
3770
this->max_connections = 10;
71+
this->logger = logger;
3872

3973
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
4074
{
@@ -55,13 +89,16 @@ WinSocket::WinSocket(unsigned int port)
5589
this->server_address.sin_family = AF_INET;
5690
this->server_address.sin_port = htons(this->port);
5791
this->server_address.sin_addr.s_addr = inet_addr(this->ip_address.c_str());
92+
93+
Utils::fillIPBlacklist(this->ip_blacklist);
5894
}
5995

60-
WinSocket::WinSocket(std::string ip_address, unsigned int port)
96+
WinSocket::WinSocket(ConsoleLogger logger, std::string ip_address, unsigned int port)
6197
{
6298
this->ip_address = ip_address;
6399
this->port = port;
64100
this->max_connections = 10;
101+
this->logger = logger;
65102

66103
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
67104
{
@@ -82,13 +119,16 @@ WinSocket::WinSocket(std::string ip_address, unsigned int port)
82119
this->server_address.sin_family = AF_INET;
83120
this->server_address.sin_port = htons(this->port);
84121
this->server_address.sin_addr.s_addr = inet_addr(this->ip_address.c_str());
122+
123+
Utils::fillIPBlacklist(this->ip_blacklist);
85124
}
86125

87-
WinSocket::WinSocket(std::string ip_address, unsigned int port, unsigned int max_connections)
126+
WinSocket::WinSocket(ConsoleLogger logger, std::string ip_address, unsigned int port, unsigned int max_connections)
88127
{
89128
this->ip_address = ip_address;
90129
this->port = port;
91130
this->max_connections = 10;
131+
this->logger = logger;
92132

93133
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
94134
{
@@ -109,6 +149,8 @@ WinSocket::WinSocket(std::string ip_address, unsigned int port, unsigned int max
109149
this->server_address.sin_family = AF_INET;
110150
this->server_address.sin_port = htons(this->port);
111151
this->server_address.sin_addr.s_addr = inet_addr(this->ip_address.c_str());
152+
153+
Utils::fillIPBlacklist(this->ip_blacklist);
112154
}
113155

114156
void WinSocket::bindSocket()
@@ -138,29 +180,60 @@ void WinSocket::listenToConnections()
138180
void WinSocket::acceptConnection(SOCKET &client_socket, void *client_address)
139181
{
140182
int client_addr_size = sizeof(sockaddr_in);
141-
client_socket = accept(this->server_socket, static_cast<sockaddr*>(client_address), &client_addr_size);
142-
if (client_socket == INVALID_SOCKET) {
183+
client_socket = accept(this->server_socket, static_cast<sockaddr *>(client_address), &client_addr_size);
184+
if (client_socket == INVALID_SOCKET)
185+
{
143186
std::printf("Error accepting connections: %d\n", WSAGetLastError());
144187
WSACleanup();
145188
exit(EXIT_FAILURE);
146189
}
190+
191+
// Assuming client_address is meant to store the result
192+
if (client_address != nullptr)
193+
{
194+
std::memcpy(client_address, &client_addr_storage, client_addr_size);
195+
}
196+
197+
char ip_str[INET6_ADDRSTRLEN] = {0}; // Large enough for both IPv4 and IPv6
198+
if (client_addr_storage.ss_family == AF_INET)
199+
{
200+
// IPv4
201+
struct sockaddr_in *addr_in = (struct sockaddr_in *)&client_addr_storage;
202+
inet_ntop(AF_INET, &addr_in->sin_addr, ip_str, INET_ADDRSTRLEN);
203+
}
204+
else if (client_addr_storage.ss_family == AF_INET6)
205+
{
206+
// IPv6
207+
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)&client_addr_storage;
208+
inet_ntop(AF_INET6, &addr_in6->sin6_addr, ip_str, INET6_ADDRSTRLEN);
209+
}
210+
211+
this->client_ip = std::string(ip_str);
212+
213+
for (auto it : this->ip_blacklist)
214+
{
215+
if (this->client_ip == it)
216+
{
217+
throw IPBlackListedException();
218+
}
219+
}
147220
}
148221

149222
ssize_t WinSocket::receiveData(SOCKET client_socket, char *buffer, unsigned int buffer_size)
150223
{
151224
ssize_t data = recv(client_socket, buffer, buffer_size, 0);
152225
if (data < 0)
153226
{
154-
perror("Receive error");
155-
std::cout << "Error code: " + errno << std::endl;
156-
exit(1);
227+
std::printf("Receive error\n");
228+
WSACleanup();
229+
exit(EXIT_FAILURE);
157230
}
158231
return data;
159232
}
160233

161234
void WinSocket::sendData(SOCKET client_socket, const void *buffer, unsigned int buffer_size, int flags)
162235
{
163-
send(client_socket, (char*)buffer, buffer_size, flags);
236+
send(client_socket, (char *)buffer, buffer_size, flags);
164237
}
165238

166239
void WinSocket::closeSocket()

0 commit comments

Comments
 (0)