mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 06:52:36 +01:00
zmq: Enable IPv6 on listening socket
This commit is contained in:
parent
f66eceaecf
commit
ded449b726
1 changed files with 24 additions and 0 deletions
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <chain.h>
|
||||
#include <chainparams.h>
|
||||
#include <netbase.h>
|
||||
#include <node/blockstorage.h>
|
||||
#include <rpc/server.h>
|
||||
#include <streams.h>
|
||||
|
@ -73,6 +74,20 @@ static int zmq_send_multipart(void *sock, const void* data, size_t size, ...)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool IsZMQAddressIPV6(const std::string &zmq_address)
|
||||
{
|
||||
const std::string tcp_prefix = "tcp://";
|
||||
const size_t tcp_index = zmq_address.rfind(tcp_prefix);
|
||||
const size_t colon_index = zmq_address.rfind(":");
|
||||
if (tcp_index == 0 && colon_index != std::string::npos) {
|
||||
const std::string ip = zmq_address.substr(tcp_prefix.length(), colon_index - tcp_prefix.length());
|
||||
CNetAddr addr;
|
||||
LookupHost(ip, addr, false);
|
||||
if (addr.IsIPv6()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
|
||||
{
|
||||
assert(!psocket);
|
||||
|
@ -107,6 +122,15 @@ bool CZMQAbstractPublishNotifier::Initialize(void *pcontext)
|
|||
return false;
|
||||
}
|
||||
|
||||
// On some systems (e.g. OpenBSD) the ZMQ_IPV6 must not be enabled, if the address to bind isn't IPv6
|
||||
const int enable_ipv6 { IsZMQAddressIPV6(address) ? 1 : 0};
|
||||
rc = zmq_setsockopt(psocket, ZMQ_IPV6, &enable_ipv6, sizeof(enable_ipv6));
|
||||
if (rc != 0) {
|
||||
zmqError("Failed to set ZMQ_IPV6");
|
||||
zmq_close(psocket);
|
||||
return false;
|
||||
}
|
||||
|
||||
rc = zmq_bind(psocket, address.c_str());
|
||||
if (rc != 0)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue