diff --git a/src/WiFiUdp.cpp b/src/WiFiUdp.cpp index 1d08085a..b40a6999 100644 --- a/src/WiFiUdp.cpp +++ b/src/WiFiUdp.cpp @@ -68,15 +68,29 @@ uint8_t WiFiUDP::begin(uint16_t port) return 1; } -uint8_t WiFiUDP::beginMulticast(IPAddress ip, uint16_t port) +uint8_t WiFiUDP::mcastGroupJoin(IPAddress ip) +{ + uint32_t multiIp = ip; + + return setsockopt(_socket, SOL_SOCKET, IP_ADD_MEMBERSHIP, &multiIp, sizeof(multiIp)); +} + +uint8_t WiFiUDP::mcastGroupLeave(IPAddress ip) { uint32_t multiIp = ip; + return setsockopt(_socket, SOL_SOCKET, IP_DROP_MEMBERSHIP, &multiIp, sizeof(multiIp)); +} + +uint8_t WiFiUDP::beginMulticast(IPAddress ip, uint16_t port) +{ if (!begin(port)) { return 0; } - setsockopt(_socket, SOL_SOCKET, IP_ADD_MEMBERSHIP, &multiIp, sizeof(multiIp)); + if (mcastGroupJoin(ip) != SOCK_ERR_NO_ERROR) { + return 0; + } return 1; } diff --git a/src/WiFiUdp.h b/src/WiFiUdp.h index d1cf6eb7..3edfa994 100644 --- a/src/WiFiUdp.h +++ b/src/WiFiUdp.h @@ -46,6 +46,8 @@ class WiFiUDP : public UDP { virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use virtual uint8_t beginMulticast(IPAddress, uint16_t); // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 if there are no sockets available to use virtual uint8_t beginMulti(IPAddress ip, uint16_t port) { return beginMulticast(ip, port); } + virtual uint8_t mcastGroupJoin(IPAddress); + virtual uint8_t mcastGroupLeave(IPAddress); virtual void stop(); // Finish with the UDP socket // Sending UDP packets