Skip to content

Commit 5b870db

Browse files
committed
feat(server): added port param -p and added best binding best effort mechanism (port+1 forever)
1 parent ef1c878 commit 5b870db

File tree

3 files changed

+68
-20
lines changed

3 files changed

+68
-20
lines changed

CS2RemoteConsole-server/src/main.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include "utils.h"
33
#include <iostream>
44
#include <csignal>
5+
#include <cstdlib>
6+
#include <string>
57

68
std::atomic<bool> applicationRunning(true);
79

@@ -11,11 +13,22 @@ void signalHandler(int signum)
1113
applicationRunning = false;
1214
}
1315

14-
int main()
16+
int main(int argc, char* argv[])
1517
{
1618
signal(SIGINT, signalHandler);
1719
signal(SIGTERM, signalHandler);
1820

21+
uint16_t port = 42069; // Default port
22+
23+
for (int i = 1; i < argc; i++)
24+
{
25+
std::string arg = argv[i];
26+
if ((arg == "-p" || arg == "--port") && i + 1 < argc)
27+
{
28+
port = static_cast<uint16_t>(std::atoi(argv[++i]));
29+
}
30+
}
31+
1932
#ifdef _WIN32
2033
if (!initializeWinsock())
2134
{
@@ -24,7 +37,7 @@ int main()
2437
}
2538
#endif
2639

27-
Server server(42069, applicationRunning);
40+
Server server(port, applicationRunning);
2841
if (!server.start())
2942
{
3043
return 1;

CS2RemoteConsole-server/src/server.cpp

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
#include <sstream>
55
#include <algorithm>
66

7-
Server::Server(uint16_t port, std::atomic<bool>& running)
8-
: m_port(port), m_listenSocket(INVALID_SOCKET), m_running(running)
7+
Server::Server(uint16_t initialPort, std::atomic<bool>& running)
8+
: m_initialPort(initialPort), m_port(initialPort), m_listenSocket(INVALID_SOCKET), m_running(running)
99
{
1010
}
1111

@@ -16,23 +16,52 @@ Server::~Server()
1616

1717
bool Server::start()
1818
{
19-
m_listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
20-
if (m_listenSocket == INVALID_SOCKET)
19+
const int MAX_PORT = 65535; // Maximum valid port number
20+
21+
while (m_port <= MAX_PORT)
2122
{
22-
std::cerr << "Error creating socket: " << SOCKET_ERROR_CODE << std::endl;
23-
return false;
24-
}
23+
std::cout << "Attempting to bind to port " << m_port << "..." << std::endl;
2524

26-
sockaddr_in serverAddr{};
27-
serverAddr.sin_family = AF_INET;
28-
serverAddr.sin_addr.s_addr = INADDR_ANY;
29-
serverAddr.sin_port = htons(m_port);
25+
m_listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
26+
if (m_listenSocket == INVALID_SOCKET)
27+
{
28+
std::cerr << "Error creating socket: " << SOCKET_ERROR_CODE << std::endl;
29+
return false;
30+
}
3031

31-
if (bind(m_listenSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
32-
{
33-
std::cerr << "Bind failed: " << SOCKET_ERROR_CODE << std::endl;
34-
cleanupSockets();
35-
return false;
32+
int opt = 1;
33+
if (setsockopt(m_listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)) < 0)
34+
{
35+
std::cerr << "setsockopt(SO_REUSEADDR) failed: " << SOCKET_ERROR_CODE << std::endl;
36+
cleanupSockets();
37+
return false;
38+
}
39+
40+
sockaddr_in serverAddr{};
41+
serverAddr.sin_family = AF_INET;
42+
serverAddr.sin_addr.s_addr = INADDR_ANY;
43+
serverAddr.sin_port = htons(m_port);
44+
45+
if (bind(m_listenSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
46+
{
47+
std::cerr << "Bind failed on port " << m_port << ": " << SOCKET_ERROR_CODE << std::endl;
48+
49+
cleanupSockets();
50+
51+
// Try the next port
52+
m_port++;
53+
54+
if (m_port > MAX_PORT)
55+
{
56+
std::cerr << "Exhausted all available ports. Failed to start server." << std::endl;
57+
return false;
58+
}
59+
60+
continue;
61+
}
62+
63+
// If we reach here, bind was successful
64+
break;
3665
}
3766

3867
if (listen(m_listenSocket, SOMAXCONN) == SOCKET_ERROR)
@@ -44,7 +73,11 @@ bool Server::start()
4473

4574
setNonBlocking(m_listenSocket);
4675

47-
std::cout << "Server is listening on port " << m_port << "..." << std::endl;
76+
std::cout << "Server is listening on port " << m_port << std::endl;
77+
if (m_port != m_initialPort)
78+
{
79+
std::cout << "Note: The server is using a different port than initially specified." << std::endl;
80+
}
4881
return true;
4982
}
5083

CS2RemoteConsole-server/src/server.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
class Server
1111
{
1212
public:
13-
Server(uint16_t port, std::atomic<bool>& running);
13+
Server(uint16_t initialPort, std::atomic<bool>& running);
1414
~Server();
1515

1616
bool start();
1717
void run();
18+
uint16_t getCurrentPort() const { return m_port; }
1819

1920
private:
21+
uint16_t m_initialPort;
2022
uint16_t m_port;
2123
SOCKET m_listenSocket;
2224
std::vector<ClientInfo> m_clients;

0 commit comments

Comments
 (0)