diff --git a/core/src/utils/net.cpp b/core/src/utils/net.cpp index 4095e7ea..4df9d9ff 100644 --- a/core/src/utils/net.cpp +++ b/core/src/utils/net.cpp @@ -109,11 +109,6 @@ namespace net { addr.sin_port = htons(port); } - bool Address::isMulticast() const { - IP_t ip = getIP(); - return (ip >> 28) == 0b1110; - } - // === Socket functions === Socket::Socket(SockHandle_t sock, const Address* raddr) { @@ -380,7 +375,7 @@ namespace net { return connect(Address(host, port)); } - std::shared_ptr openudp(const Address& raddr, const Address& laddr) { + std::shared_ptr openudp(const Address& raddr, const Address& laddr, bool allowBroadcast) { // Init library if needed init(); @@ -388,12 +383,12 @@ namespace net { SockHandle_t s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // If the remote address is multicast, allow multicast connections -#ifdef _WIN32 - const char enable = raddr.isMulticast(); -#else - int enable = raddr.isMulticast(); -#endif - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0) { + #ifdef _WIN32 + const char enable = allowBroadcast; + #else + int enable = allowBroadcast; + #endif + if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(int)) < 0) { closeSocket(s); throw std::runtime_error("Could not configure socket"); return NULL; @@ -410,15 +405,15 @@ namespace net { return std::make_shared(s, &raddr); } - std::shared_ptr openudp(std::string rhost, int rport, const Address& laddr) { - return openudp(Address(rhost, rport), laddr); + std::shared_ptr openudp(std::string rhost, int rport, const Address& laddr, bool allowBroadcast) { + return openudp(Address(rhost, rport), laddr, allowBroadcast); } - std::shared_ptr openudp(const Address& raddr, std::string lhost, int lport) { - return openudp(raddr, Address(lhost, lport)); + std::shared_ptr openudp(const Address& raddr, std::string lhost, int lport, bool allowBroadcast) { + return openudp(raddr, Address(lhost, lport), allowBroadcast); } - std::shared_ptr openudp(std::string rhost, int rport, std::string lhost, int lport) { - return openudp(Address(rhost, rport), Address(lhost, lport)); + std::shared_ptr openudp(std::string rhost, int rport, std::string lhost, int lport, bool allowBroadcast) { + return openudp(Address(rhost, rport), Address(lhost, lport), allowBroadcast); } } diff --git a/core/src/utils/net.h b/core/src/utils/net.h index a2137441..72d6d073 100644 --- a/core/src/utils/net.h +++ b/core/src/utils/net.h @@ -93,12 +93,6 @@ namespace net { */ void setPort(int port); - /** - * Check if the address is multicast. - * @return True if multicast, false if not. - */ - bool isMulticast() const; - struct sockaddr_in addr; }; @@ -256,7 +250,7 @@ namespace net { * @param laddr Local address to bind the socket to. * @return Socket instance on success, Throws runtime_error otherwise. */ - std::shared_ptr openudp(const Address& raddr, const Address& laddr); + std::shared_ptr openudp(const Address& raddr, const Address& laddr, bool allowBroadcast = false); /** * Create UDP socket. @@ -265,24 +259,24 @@ namespace net { * @param laddr Local address to bind the socket to. * @return Socket instance on success, Throws runtime_error otherwise. */ - std::shared_ptr openudp(std::string rhost, int rport, const Address& laddr); + std::shared_ptr openudp(std::string rhost, int rport, const Address& laddr, bool allowBroadcast = false); /** * Create UDP socket. - * @param raddr Remote address. Set to a multicast address to allow multicast. + * @param raddr Remote address. Set to a multicast or broadcast address to allow multicast. * @param lhost Local hostname or IP used to bind the socket (optional, "0.0.0.0" for Any). * @param lpost Local port used to bind the socket to (optional, 0 to allocate automatically). * @return Socket instance on success, Throws runtime_error otherwise. */ - std::shared_ptr openudp(const Address& raddr, std::string lhost = "0.0.0.0", int lport = 0); + std::shared_ptr openudp(const Address& raddr, std::string lhost = "0.0.0.0", int lport = 0, bool allowBroadcast = false); /** * Create UDP socket. - * @param rhost Remote hostname or IP address. Set to a multicast address to allow multicast. + * @param rhost Remote hostname or IP address. Set to a multicast or broadcast address to allow multicast. * @param rport Remote port. * @param lhost Local hostname or IP used to bind the socket (optional, "0.0.0.0" for Any). * @param lpost Local port used to bind the socket to (optional, 0 to allocate automatically). * @return Socket instance on success, Throws runtime_error otherwise. */ - std::shared_ptr openudp(std::string rhost, int rport, std::string lhost = "0.0.0.0", int lport = 0); + std::shared_ptr openudp(std::string rhost, int rport, std::string lhost = "0.0.0.0", int lport = 0, bool allowBroadcast = false); } \ No newline at end of file