Compare commits

...

4 Commits

Author SHA1 Message Date
sgourdas
528a532b27 fixup! Get ipv4 working on dual stack 2024-10-06 13:24:52 +03:00
sgourdas
fa410f739c Fix Server::setAddress 2024-10-05 15:24:21 +03:00
sgourdas
5f1f37bd2a kiwix-serve: Error message reword 2024-10-05 12:04:45 +03:00
sgourdas
5855791899 kiwix-serve: Disable IPV6_ONLY on Windows 2024-10-05 12:01:40 +03:00
2 changed files with 33 additions and 3 deletions

View File

@@ -75,9 +75,11 @@ void Server::setRoot(const std::string& root)
}
}
// FIXME: this method is implemented under the assumption that it is invoked only once (per object).
void Server::setAddress(const std::string& addr)
{
m_addr.addr.clear();
m_addr.addr6.clear();
if (addr.empty()) return;
if (addr.find(':') != std::string::npos) { // IPv6

View File

@@ -515,7 +515,28 @@ bool InternalServer::start() {
struct sockaddr* sockaddr = (m_ipMode==IpMode::ALL || m_ipMode==IpMode::IPV6)
? (struct sockaddr*)&sockAddr6
: (struct sockaddr*)&sockAddr4;
#ifdef _WIN32
SOCKET sock = INVALID_SOCKET;
if (m_ipMode == IpMode::ALL || m_ipMode == IpMode::IPV6) {
if ((sock = socket(AF_INET6, SOCK_STREAM, 0)) == INVALID_SOCKET) {
std::cerr << "ERROR: Failed to create IPv6 socket" << std::endl;
return false;
}
int opt = 0;
if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&opt, sizeof(opt)) != 0) {
std::cerr << "ERROR: Failed to set IPV6_V6ONLY option" << std::endl;
closesocket(sock);
return false;
}
if (::bind(sock, (struct sockaddr*)&sockAddr6, sizeof(sockAddr6)) == SOCKET_ERROR) {
std::cerr << "ERROR: Failed to bind IPv6 socket" << std::endl;
closesocket(sock);
return false;
}
}
#endif
mp_daemon = MHD_start_daemon(flags,
m_port,
NULL,
@@ -523,14 +544,21 @@ bool InternalServer::start() {
&staticHandlerCallback,
this,
MHD_OPTION_SOCK_ADDR, sockaddr,
#ifdef _WIN32
(sock == INVALID_SOCKET) ? MHD_OPTION_END : MHD_OPTION_LISTEN_SOCKET, sock,
#endif
MHD_OPTION_THREAD_POOL_SIZE, m_nbThreads,
MHD_OPTION_PER_IP_CONNECTION_LIMIT, m_ipConnectionLimit,
MHD_OPTION_END);
if (mp_daemon == nullptr) {
std::cerr << "Unable to instantiate the HTTP daemon. The port " << m_port
<< " is maybe already occupied or need more permissions to be open. "
std::cerr << "ERROR: Unable to instantiate the HTTP daemon. The port " << m_port
<< " may already be in use, or more permissions are required to open it. "
"Please try as root or with a port number higher or equal to 1024."
<< std::endl;
#ifdef _WIN32
if (sock != INVALID_SOCKET) closesocket(sock);
#endif
return false;
}
auto server_start_time = std::chrono::system_clock::now().time_since_epoch();