public static IPAddress CreateIPAddress(Sockaddr addr) { byte[] bytes = null; switch (addr.sin_family) { case (byte)SockAddrFamily.Inet: byte[] ipv4addr = new byte[4]; ipv4addr[0] = (byte)(addr.sin_addr & 0x000000FF); ipv4addr[1] = (byte)((addr.sin_addr & 0x0000FF00) >> 8); ipv4addr[2] = (byte)((addr.sin_addr & 0x00FF0000) >> 16); ipv4addr[3] = (byte)((addr.sin_addr & 0xFF000000) >> 24); bytes = ipv4addr; break; case (byte)SockAddrFamily.Inet6: bytes = addr.sin6_addr8; break; default: #if false Console.WriteLine($"Unknown socket address family {addr.sin_family}"); #endif bytes = null; break; } return((bytes != null) ? new IPAddress(bytes): null); }
string GetZeroconfHostKey(NSNetService service) { StringBuilder sb = new StringBuilder(); if (service.Addresses != null) { foreach (NSData address in service.Addresses) { if (address != null) { Sockaddr saddr = Sockaddr.CreateSockaddr(address.Bytes); IPAddress ipAddr = Sockaddr.CreateIPAddress(saddr); if (ipAddr != null) { sb.Append((sb.Length == 0 ? ipAddr.ToString() : $";{ipAddr.ToString()}")); } } else { Console.WriteLine($"{nameof(GetZeroconfHostKey)}: Got null entry in NSNetService.Addresses, Service {service?.Name}"); } } } else { Console.WriteLine($"{nameof(GetZeroconfHostKey)}: NSNetService.Addresses is null, Service {service?.Name}"); } return(sb.ToString()); }
ZeroconfHost GetOrCreateZeroconfHost(NSNetService service) { ZeroconfHost host; string hostKey = GetZeroconfHostKey(service); lock (zeroconfHostDict) { if (!zeroconfHostDict.TryGetValue(hostKey, out host)) { host = new ZeroconfHost(); host.DisplayName = service.Name; List <string> ipAddrList = new List <string>(); foreach (NSData address in service.Addresses) { Sockaddr saddr = Sockaddr.CreateSockaddr(address.Bytes); IPAddress ipAddr = Sockaddr.CreateIPAddress(saddr); if (ipAddr != null) { ipAddrList.Add(ipAddr.ToString()); } } host.IPAddresses = ipAddrList; host.Id = host.IPAddress; zeroconfHostDict[hostKey] = host; } } return(host); }
public static Sockaddr CreateSockaddr(IntPtr bytes) { Sockaddr sock = (Sockaddr)Marshal.PtrToStructure(bytes, typeof(Sockaddr)); return(sock); }