summaryrefslogtreecommitdiff
path: root/src/SocketCore.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-20 14:23:25 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-20 14:23:25 +0000
commit9281f1126471fa90e2d6fe094c4c6eba00073ea6 (patch)
treedb2dc360e785cf78fd67f565d061cc24dc68f388 /src/SocketCore.cc
parentaee471e52c6f7ac06817600e2c21b400ef375ecb (diff)
2010-02-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added Local Peer Discovery. It is disabled by default. Use --bt-enable-lpd to enable the function. * src/BtConstants.h * src/BtSetup.cc * src/LpdDispatchMessageCommand.cc * src/LpdDispatchMessageCommand.h * src/LpdMessage.h * src/LpdMessageDispatcher.cc * src/LpdMessageDispatcher.h * src/LpdMessageReceiver.cc * src/LpdMessageReceiver.h * src/LpdReceiveMessageCommand.cc * src/LpdReceiveMessageCommand.h * src/Makefile.am * src/OptionHandlerFactory.cc * src/Peer.cc * src/Peer.h * src/PeerInteractionCommand.cc * src/SocketCore.cc * src/SocketCore.h * src/prefs.cc * src/prefs.h * src/usage_text.h * src/util.cc * src/util.h * test/LpdMessageDispatcherTest.cc * test/LpdMessageReceiverTest.cc * test/Makefile.am
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__