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;
     }
 }
        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();
        }
        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);
            }
        }
        public static unsafe PosixResult GetSockName(int socket, sockaddr_storage *addr)
        {
            socklen_t sockLen = SizeOf.sockaddr_storage;
            int       rv      = getsockname(socket, (sockaddr *)addr, &sockLen);

            return(PosixResult.FromReturnValue(rv));
        }
Example #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);
     }
 }
        private static unsafe void EndPoint4ToSockAddr(IPEndPoint inetAddress, sockaddr_storage *addr, out int length)
        {
            sockaddr_in *addrIn = (sockaddr_in *)addr;

            addrIn->sin_family = AF_INET;
            addrIn->sin_port   = htons((ushort)inetAddress.Port);
            inetAddress.Address.TryWriteBytes(new Span <byte>(addrIn->sin_addr.s_addr, 4), out _);
            length = SizeOf.sockaddr_in;
        }
        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;
        }
        public OutboundConnectionContext(LinuxSocket socket, EndPoint remote, TransportThreadContext threadContext)
            : base(socket, null, remote, threadContext)
        {
            sockaddr_storage addr = default;
            var addrHandle        = GCHandle.Alloc(addr, GCHandleType.Pinned);

            _addr       = (sockaddr_storage *)addrHandle.AddrOfPinnedObject();
            _addrHandle = addrHandle;

            // Add IConnectionInherentKeepAliveFeature to the tcp connection impl since Kestrel doesn't implement
            // the IConnectionHeartbeatFeature
            Features.Set <IConnectionInherentKeepAliveFeature>(this);
        }
 public static unsafe void ToSockAddr(this IPEndPoint inetAddress, sockaddr_storage *addr, out int length)
 {
     if (inetAddress.AddressFamily == AddressFamily.InterNetwork)
     {
         EndPoint4ToSockAddr(inetAddress, addr, out length);
     }
     else if (inetAddress.AddressFamily == AddressFamily.InterNetworkV6)
     {
         EndPoint6ToSockAddr(inetAddress, addr, out length);
     }
     else
     {
         length = 0;
     }
 }
        public AcceptSocketContext(LinuxSocket socket, IPEndPoint endPoint, ChannelWriter <ConnectionContext> acceptQueue)
        {
            EndPoint    = endPoint;
            AcceptQueue = acceptQueue;
            Socket      = socket;

            sockaddr_storage storage = default;
            var addrHandle           = GCHandle.Alloc(storage, GCHandleType.Pinned);

            _addr       = (sockaddr_storage *)addrHandle.AddrOfPinnedObject();
            _addrHandle = addrHandle;

            socklen_t addrLen       = SizeOf.sockaddr_storage;
            var       addrLenHandle = GCHandle.Alloc(addrLen, GCHandleType.Pinned);

            _addLen        = (socklen_t *)addrLenHandle.AddrOfPinnedObject();
            _addrLenHandle = addrLenHandle;
        }
 public static unsafe PosixResult GetSockName(Socket socket, sockaddr_storage *addr)
 => GetSockName(socket.DangerousGetHandle().ToInt32(), addr);