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)); }
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);