int UdpSocket::send(Address addr, unsigned short port, const char* bytes, int len) { if (addr.getType() != addr_type) return 0; char addr_buf[sizeof(sockaddr_in6)]; memset(addr_buf, 0, sizeof(sockaddr_in6)); if (addr_type == Address::IPV4) { #if !defined(__ANDROID__) ((sockaddr_in*)addr_buf)->sin_len = sizeof(sockaddr_in); #endif ((sockaddr_in*)addr_buf)->sin_family = AF_INET; memcpy(&((sockaddr_in*)addr_buf)->sin_addr, addr.getAddr(), sizeof(in_addr)); ((sockaddr_in*)addr_buf)->sin_port = htons(port); } else { #if !defined(__ANDROID__) ((sockaddr_in6*)addr_buf)->sin6_len = sizeof(sockaddr_in6); #endif ((sockaddr_in6*)addr_buf)->sin6_family = AF_INET6; memcpy(&((sockaddr_in6*)addr_buf)->sin6_addr, addr.getAddr(), sizeof(in6_addr)); ((sockaddr_in*)addr_buf)->sin_port = htons(port); } return (int)sendto(fd, bytes, len, 0, (sockaddr*)addr_buf, addr_type == Address::IPV4 ? sizeof(sockaddr_in) : sizeof(sockaddr_in6)); }
bool UdpSocket::joinMulticastGroup(Address local, Address group) { if (addr_type == Address::IPV4) { struct ip_mreq g; memcpy(&g.imr_multiaddr.s_addr, group.getAddr(), sizeof(in_addr)); memcpy(&g.imr_interface.s_addr, local.getAddr(), sizeof(in_addr)); if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&g, sizeof(ip_mreq)) == 0) return true; } else { // TODO: Multicast listening with IPV6, in a cross platform manner } return false; }