summaryrefslogtreecommitdiff
path: root/src/socket.cpp
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2014-02-05 21:24:46 +0100
committersapier <Sapier at GMX dot net>2014-02-05 21:24:46 +0100
commit85fe75d1cbaf372f0a98558adcd5a612a0e19602 (patch)
tree8a552ca0e7bb69b192568037bb2857501abe0674 /src/socket.cpp
parent7f743178db2a45bd3f68ef2c9c7df6deca1f3ab6 (diff)
downloadminetest-85fe75d1cbaf372f0a98558adcd5a612a0e19602.tar.gz
minetest-85fe75d1cbaf372f0a98558adcd5a612a0e19602.tar.bz2
minetest-85fe75d1cbaf372f0a98558adcd5a612a0e19602.zip
Add the option to bind to a specific address
Diffstat (limited to 'src/socket.cpp')
-rw-r--r--src/socket.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/socket.cpp b/src/socket.cpp
index 78ff364e5..00856fb00 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -92,24 +92,27 @@ void sockets_cleanup()
Address::Address()
{
m_addr_family = 0;
- memset(&m_address, 0, sizeof m_address);
+ memset(&m_address, 0, sizeof(m_address));
m_port = 0;
}
Address::Address(u32 address, u16 port)
{
+ memset(&m_address, 0, sizeof(m_address));
setAddress(address);
setPort(port);
}
Address::Address(u8 a, u8 b, u8 c, u8 d, u16 port)
{
+ memset(&m_address, 0, sizeof(m_address));
setAddress(a, b, c, d);
setPort(port);
}
Address::Address(const IPv6AddressBytes * ipv6_bytes, u16 port)
{
+ memset(&m_address, 0, sizeof(m_address));
setAddress(ipv6_bytes);
setPort(port);
}
@@ -334,12 +337,20 @@ UDPSocket::~UDPSocket()
#endif
}
-void UDPSocket::Bind(u16 port)
+void UDPSocket::Bind(Address addr)
{
if(socket_enable_debug_output)
{
dstream << "UDPSocket(" << (int) m_handle << ")::Bind(): "
- << "port=" << port << std::endl;
+ << addr.serializeString() << ":"
+ << addr.getPort() << std::endl;
+ }
+
+ if (addr.getFamily() != m_addr_family)
+ {
+ char errmsg[] = "Socket and bind address families do not match";
+ errorstream << "Bind failed: " << errmsg << std::endl;
+ throw SocketException(errmsg);
}
if(m_addr_family == AF_INET6)
@@ -347,12 +358,12 @@ void UDPSocket::Bind(u16 port)
struct sockaddr_in6 address;
memset(&address, 0, sizeof(address));
+ address = addr.getAddress6();
address.sin6_family = AF_INET6;
- address.sin6_addr = in6addr_any;
- address.sin6_port = htons(port);
+ address.sin6_port = htons(addr.getPort());
if(bind(m_handle, (const struct sockaddr *) &address,
- sizeof(struct sockaddr_in6)) < 0)
+ sizeof(struct sockaddr_in6)) < 0)
{
dstream << (int) m_handle << ": Bind failed: "
<< strerror(errno) << std::endl;
@@ -364,9 +375,9 @@ void UDPSocket::Bind(u16 port)
struct sockaddr_in address;
memset(&address, 0, sizeof(address));
+ address = addr.getAddress();
address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;
- address.sin_port = htons(port);
+ address.sin_port = htons(addr.getPort());
if(bind(m_handle, (const struct sockaddr *) &address,
sizeof(struct sockaddr_in)) < 0)