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
1717bool 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
0 commit comments