mirror of
https://github.com/kiwix/libkiwix.git
synced 2025-12-24 06:57:59 -05:00
Compare commits
4 Commits
dirScan
...
feature/ip
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
528a532b27 | ||
|
|
fa410f739c | ||
|
|
5f1f37bd2a | ||
|
|
5855791899 |
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user