Exemplo n.º 1
0
 internal static unsafe void GetSockaddrInet(IPEndPointStruct inetAddress, sockaddr_storage *addr, out int length)
 {
     if (inetAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
     {
         sockaddr_in *addrIn = (sockaddr_in *)addr;
         addrIn->sin_family = AF_INET;
         addrIn->sin_port   = htons((ushort)inetAddress.Port);
         int bytesWritten;
         inetAddress.Address.TryWriteBytes(new Span <byte>(addrIn->sin_addr.s_addr, 4), out bytesWritten);
         length = SizeOf.sockaddr_in;
     }
     else if (inetAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
     {
         sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;
         addrIn->sin6_family   = AF_INET6;
         addrIn->sin6_port     = htons((ushort)inetAddress.Port);
         addrIn->sin6_flowinfo = 0;
         addrIn->sin6_scope_id = 0;
         int bytesWritten;
         inetAddress.Address.TryWriteBytes(new Span <byte>(addrIn->sin6_addr.s6_addr, 16), out bytesWritten);
         length = SizeOf.sockaddr_in6;
     }
     else
     {
         length = 0;
     }
 }
Exemplo n.º 2
0
        public SOCKADDR_STORAGE get_sockaddr_storage(socklen_t *len = NULL)
        {
            SOCKADDR_STORAGE sa;
            const byte       family = get_family();

            if (family == AF_INET)
            {
                sockaddr_in *sin = (sockaddr_in *)&sa;
                if (len)
                {
                    *len = sizeof(sockaddr_in);
                }
                memset(sin, 0, sizeof(sockaddr_in));
                sin.sin_family      = family;
                sin.sin_port        = htons(_port);
                sin.sin_addr.s_addr = _sin4;
            }
            else
            {
                sockaddr_in6 *sin6 = (sockaddr_in6 *)&sa;
                memset(sin6, 0, sizeof(sockaddr_in6));
                if (len)
                {
                    *len = sizeof(sockaddr_in6);
                }
                sin6.sin6_family = family;
                sin6.sin6_addr   = _in._in6addr;
                sin6.sin6_port   = htons(_port);
            }
            return(sa);
        }
Exemplo n.º 3
0
        private static unsafe bool ToIPEndPointStruct(sockaddr_storage *addr, out IPEndPointStruct ep, IPAddress reuseAddress = null)
        {
            if (addr->ss_family == AF_INET)
            {
                sockaddr_in *addrIn = (sockaddr_in *)addr;
                long         value  = ((addrIn->sin_addr.s_addr[3] << 24 | addrIn->sin_addr.s_addr[2] << 16 | addrIn->sin_addr.s_addr[1] << 8 | addrIn->sin_addr.s_addr[0]) & 0x0FFFFFFFF);
#pragma warning disable CS0618 // 'IPAddress.Address' is obsolete
                bool matchesReuseAddress = reuseAddress != null && reuseAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && reuseAddress.Address == value;
#pragma warning restore CS0618
                int port = ntohs(addrIn->sin_port);
                ep = new IPEndPointStruct(matchesReuseAddress ? reuseAddress : new IPAddress(value), port);
                return(true);
            }
            else if (addr->ss_family == AF_INET6)
            {
                sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;
                // We can't check if we can use reuseAddress without allocating.
                const int length = 16;
                var       bytes  = new byte[length];
                for (int i = 0; i < length; i++)
                {
                    bytes[i] = addrIn->sin6_addr.s6_addr[i];
                }
                int port = ntohs(addrIn->sin6_port);
                ep = new IPEndPointStruct(new IPAddress(bytes, addrIn->sin6_scope_id), port);
                return(true);
            }
            else
            {
                ep = default(IPEndPointStruct);
                return(false);
            }
        }
Exemplo n.º 4
0
        public static unsafe IPEndPoint AddrToIpEndPoint(sockaddr_storage *addr)
        {
            if (addr->ss_family == AF_INET)
            {
                sockaddr_in *addrIn = (sockaddr_in *)addr;
                long         value  = ((addrIn->sin_addr.s_addr[3] << 24 | addrIn->sin_addr.s_addr[2] << 16 | addrIn->sin_addr.s_addr[1] << 8 | addrIn->sin_addr.s_addr[0]) & 0x0FFFFFFFF);
                int          port   = ntohs(addrIn->sin_port);
                return(new IPEndPoint(new IPAddress(value), port));
            }

            if (addr->ss_family == AF_INET6)
            {
                sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;
                // We can't check if we can use reuseAddress without allocating.
                const int length = 16;
                var       bytes  = new byte[length];
                for (int i = 0; i < length; i++)
                {
                    bytes[i] = addrIn->sin6_addr.s6_addr[i];
                }
                int port = ntohs(addrIn->sin6_port);
                return(new IPEndPoint(new IPAddress(bytes, addrIn->sin6_scope_id), port));
            }

            throw new NotSupportedException();
        }
Exemplo n.º 5
0
 public static unsafe void ToSockAddr(this IPEndPoint ipEndPoint, sockaddr_storage *addr, out int length)
 {
     if (ipEndPoint.AddressFamily == AddressFamily.InterNetwork)
     {
         sockaddr_in *addrIn = (sockaddr_in *)addr;
         addrIn->sin_family = AF_INET;
         addrIn->sin_port   = htons((ushort)ipEndPoint.Port);
         int bytesWritten;
         ipEndPoint.Address.TryWriteBytes(new Span <byte>(addrIn->sin_addr.s_addr, 4), out bytesWritten);
         length = SizeOf.sockaddr_in;
     }
     else if (ipEndPoint.AddressFamily == AddressFamily.InterNetworkV6)
     {
         sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;
         addrIn->sin6_family   = AF_INET6;
         addrIn->sin6_port     = htons((ushort)ipEndPoint.Port);
         addrIn->sin6_flowinfo = 0;
         addrIn->sin6_scope_id = 0;
         int bytesWritten;
         ipEndPoint.Address.TryWriteBytes(new Span <byte>(addrIn->sin6_addr.s6_addr, 16), out bytesWritten);
         length = SizeOf.sockaddr_in6;
     }
     else
     {
         length = 0;
     }
 }
 public static unsafe IPEndPoint AddrToIpEndPoint(sockaddr_storage *addr)
 {
     if (addr->ss_family == AF_INET)
     {
         sockaddr_in *addrIn = (sockaddr_in *)addr;
         long         value  = ((addrIn->sin_addr.s_addr[3] << 24 | addrIn->sin_addr.s_addr[2] << 16 | addrIn->sin_addr.s_addr[1] << 8 | addrIn->sin_addr.s_addr[0]) & 0x0FFFFFFFF);
         int          port   = ntohs(addrIn->sin_port);
         return(new IPEndPoint(new IPAddress(value), port));
     }
     else if (addr->ss_family == AF_INET6)
     {
         sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;
         Span <byte>   bytes  = stackalloc byte[16];
         for (int i = 0; i < bytes.Length; i++)
         {
             bytes[i] = addrIn->sin6_addr.s6_addr[i];
         }
         int port = ntohs(addrIn->sin6_port);
         return(new IPEndPoint(new IPAddress(bytes, addrIn->sin6_scope_id), port));
     }
     else
     {
         ThrowHelper.ThrowNewNotSupportedException_AddressFamilyNotSupported();
         return(null);
     }
 }
Exemplo n.º 7
0
        private static unsafe void EndPoint6ToSockAddr(IPEndPoint inet6Address, sockaddr_storage *addr, out int length)
        {
            sockaddr_in6 *addrIn = (sockaddr_in6 *)addr;

            addrIn->sin6_family   = AF_INET6;
            addrIn->sin6_port     = htons((ushort)inet6Address.Port);
            addrIn->sin6_flowinfo = 0;
            addrIn->sin6_scope_id = 0;
            inet6Address.Address.TryWriteBytes(new Span <byte>(addrIn->sin6_addr.s6_addr, 16), out _);
            length = SizeOf.sockaddr_in6;
        }
Exemplo n.º 8
0
 void set(SOCKADDR_STORAGE *sa, socklen_t len)
 {
     if (sa.ss_family == AF_INET)
     {
         assert(len >= sizeof(sockaddr_in));
         const sockaddr_in *sin = (sockaddr_in *)sa;
         _sin6w[0] = 0;
         _sin6w[1] = 0;
         _sin6w[2] = 0;
         _sin6w[3] = 0;
         _sin6w[4] = 0;
         _sin6w[5] = 0xffff;
         _sin4     = sin.sin_addr.s_addr;
         _port     = ntohs(sin.sin_port);
     }
     else
     {
         assert(len >= sizeof(sockaddr_in6));
         const sockaddr_in6 *sin6 = (sockaddr_in6 *)sa;
         _in._in6addr = sin6.sin6_addr;
         _port        = ntohs(sin6.sin6_port);
     }
 }