+
+#if !defined(WINSOCK)
+ if( (result = ::bind(handle, addr.getAddr(), addr.getAddrLen() ) ) < 0 ) {
+ SG_LOG(SG_IO, SG_ALERT, "bind(" << addr.getHost() << ":" << addr.getPort() << ") failed. Errno " << errno << " (" << strerror(errno) << ")");
+ return result;
+ }
+#endif
+
+ // 224.0.0.0 - 239.255.255.255 are multicast
+ // Usage of 239.x.x.x is recommended for local scope
+ // Reference: http://tools.ietf.org/html/rfc5771
+ if( ntohl(addr.getIP()) >= 0xe0000000 && ntohl(addr.getIP()) <= 0xefffffff ) {
+
+#if defined(WINSOCK)
+ struct sockaddr_in a;
+ a.sin_addr.S_un.S_addr = INADDR_ANY;
+ a.sin_family = AF_INET;
+ a.sin_port = htons(port);
+
+ if( (result = ::bind(handle,(const sockaddr*)&a,sizeof(a))) < 0 ) {
+ SG_LOG(SG_IO, SG_ALERT, "bind(any:" << port << ") failed. Errno " << errno << " (" << strerror(errno) << ")");
+ return result;
+ }
+#endif
+
+ struct ip_mreq mreq;
+ mreq.imr_multiaddr.s_addr = addr.getIP();
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+ if( (result=::setsockopt(getHandle(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *)&mreq, sizeof(mreq))) != 0 ) {
+ SG_LOG(SG_IO, SG_ALERT, "setsockopt(IP_ADD_MEMBERSHIP) failed. Errno " << errno << " (" << strerror(errno) << ")");
+ return result;
+ }
+ }
+#if defined(WINSOCK)
+ else if( (result = ::bind(handle,addr->getAddr(), addr->getAddrLen())) < 0 ) {
+ SG_LOG(SG_IO, SG_ALERT, "bind(" << host << ":" << port << ") failed. Errno " << errno << " (" << strerror(errno) << ")");
+ return result;
+ }
+#endif
+
+ return 0;