tSocket::tSocket(u16 port) : m_fd(kInvalidSocket) { m_openSocket(); m_bind(port); }
tSocket::tSocket(tAddr addr, u16 port) : m_fd(kInvalidSocket) { m_openSocket(); if (addr.getVersion() == kIPv4) { throw eRuntimeError("Cannot join IPv4 multicast group. Not supported!"); // struct sockaddr_in* ip4sockAddr = (struct sockaddr_in*) addr.m_sockaddr; // struct ip_mreqn joinRequest; // memset(&joinRequest, 0, sizeof(joinRequest)); // joinRequest.imr_multiaddr = ip4sockAddr->sin_addr; // joinRequest.imr_address.s_addr = INADDR_ANY; // joinRequest.imr_ifindex = 0; // if (::setsockopt(m_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &joinRequest, sizeof(joinRequest)) != 0) // { // m_finalize(); // throw eRuntimeError("Cannot join ipv4 multicast group!"); // } } else // kIPv6 { struct sockaddr_in6* ip6sockAddr = (struct sockaddr_in6*) addr.m_sockaddr; struct ipv6_mreq joinRequest; memset(&joinRequest, 0, sizeof(joinRequest)); joinRequest.ipv6mr_multiaddr = ip6sockAddr->sin6_addr; joinRequest.ipv6mr_interface = 0; #if __linux__ || __APPLE__ || __CYGWIN__ if (::setsockopt(m_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &joinRequest, sizeof(joinRequest)) != 0) #elif __MINGW32__ if (::setsockopt(m_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char*)(&joinRequest), sizeof(joinRequest)) != 0) #else #error What platform are you on!? #endif { int err = errno; m_finalize(); throw eRuntimeError(std::string("Cannot join ipv6 multicast group! Error: ") + strerror(err)); } } int on = 1; #if __linux__ || __APPLE__ || __CYGWIN__ if (::setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)) != 0) #elif __MINGW32__ if (::setsockopt(m_fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&on, sizeof(on)) != 0) #else #error What platform are you on!? #endif { m_finalize(); throw eSocketCreationError("Cannot enable reuse-addr on udp multicast socket."); } m_bind(port); }
int bind( sqlite3_stmt* stmt, int index ) { return m_bind(stmt, index); }