Example #1
0
        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);
        }
Example #2
0
        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());
        }
Example #3
0
        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);
        }
Example #4
0
        public static Sockaddr CreateSockaddr(IntPtr bytes)
        {
            Sockaddr sock = (Sockaddr)Marshal.PtrToStructure(bytes, typeof(Sockaddr));

            return(sock);
        }