summaryrefslogtreecommitdiff
path: root/src/SocketCore.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/SocketCore.cc')
-rw-r--r--src/SocketCore.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
index d2bc2f10..4be28b30 100644
--- a/src/SocketCore.cc
+++ b/src/SocketCore.cc
@@ -253,6 +253,18 @@ static sock_t bindTo
return -1;
}
+void SocketCore::bindWithFamily(uint16_t port, int family, int flags)
+{
+ closeConnection();
+ std::string error;
+ sock_t fd = bindTo(0, port, family, _sockType, flags, error);
+ if(fd == (sock_t) -1) {
+ throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, error.c_str()).str());
+ } else {
+ sockfd = fd;
+ }
+}
+
void SocketCore::bind(uint16_t port, int flags)
{
closeConnection();
@@ -403,6 +415,28 @@ void SocketCore::establishConnection(const std::string& host, uint16_t port)
}
}
+void SocketCore::setSockOpt
+(int level, int optname, void* optval, socklen_t optlen)
+{
+ if(setsockopt(sockfd, level, optname, optval, optlen) < 0) {
+ throw DL_ABORT_EX(StringFormat(EX_SOCKET_SET_OPT, errorMsg()).str());
+ }
+}
+
+void SocketCore::setMulticastTtl(unsigned char ttl)
+{
+ setSockOpt(IPPROTO_IP, IP_MULTICAST_TTL, (a2_sockopt_t)&ttl, sizeof(ttl));
+}
+
+void SocketCore::joinMulticastGroup(const std::string& ipaddr, uint16_t port)
+{
+ struct ip_mreq mreq;
+ memset(&mreq, 0, sizeof(mreq));
+ mreq.imr_multiaddr.s_addr = inet_addr(ipaddr.c_str());
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+ setSockOpt(IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
+}
+
void SocketCore::setNonBlockingMode()
{
#ifdef __MINGW32__