private SocketError BindSocketByAddress(IntPtr socket, ISocketAddress socketAddress) { switch (socketAddress?.AddressFamily) { case AddressFamily.InterNetwork: if (socketAddress.Address?.IPAddress?.Equals(IPAddress.Any) == true) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [0.0.0.0]" ); return(SocketError.Success); } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("127.0.0.0"), IPAddress.Parse("127.255.255.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Loop Back]" ); return(SocketError.Success); // LoopBack } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("10.0.0.0"), IPAddress.Parse("10.255.255.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); return(SocketError.Success); // Private Network } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("172.16.0.0"), IPAddress.Parse("172.31.255.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); return(SocketError.Success); // Private Network } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("192.168.0.0"), IPAddress.Parse("192.168.255.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); return(SocketError.Success); // Private Network } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("169.254.1.0"), IPAddress.Parse("169.254.254.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Link Local Network]" ); return(SocketError.Success); // Link Local Network } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("224.0.0.0"), IPAddress.Parse("239.255.255.255"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [MultiCast Address]" ); return(SocketError.Success); // MultiCast } break; case AddressFamily.InterNetworkV6: if (socketAddress.Address?.IPAddress?.Equals(IPAddress.IPv6Any) == true) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [0000:]" ); return(SocketError.Success); } if (socketAddress.Address?.IPAddress?.Equals(IPAddress.IPv6Loopback) == true) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [Loop Back]" ); return(SocketError.Success); // LoopBack } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("fc00:0000:0000:0000:0000:0000:0000:0000"), IPAddress.Parse("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))) { DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due to the nature of passed IP Address. [fc00:]" ); return(SocketError.Success); // Unique Local Addresses, Private networks, MultiCast } break; default: DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due an unsupported address family of `{0}`.", socketAddress?.AddressFamily ); return(SocketError.Success); } var networkInterface = GetNetworkInterface(); var interfaceAddress = GetInterfaceAddress(networkInterface, socketAddress.AddressFamily, false); if (networkInterface == null || interfaceAddress == null) { DebugMessage( nameof(OnBind), "Binding for the `{0}:{1}` rejected due to lack of a valid interface address.", socketAddress.Address?.IPAddress, socketAddress.Port ); return(SocketError.SocketError); } if (interfaceAddress.AddressFamily == AddressFamily.InterNetwork) { var bindIn = new SocketAddressIn { Address = new AddressIn { IPAddress = interfaceAddress }, AddressFamily = interfaceAddress.AddressFamily, Port = 0 // Assign a random port }; DebugMessage( nameof(BindSocketByAddress), "Binding to `{0}:{1}` ...", bindIn.Address?.IPAddress, bindIn.Port ); return(Socket.Bind(socket, ref bindIn, Marshal.SizeOf(bindIn))); } if (interfaceAddress.AddressFamily == AddressFamily.InterNetworkV6) { var scopeId = (uint?)networkInterface.GetIPProperties()?.GetIPv6Properties()?.Index ?? 0; var flowInfo = (socketAddress as SocketAddressIn6?)?.FlowInfo ?? 0; var bindIn6 = new SocketAddressIn6 { Address = new AddressIn6 { IPAddress = interfaceAddress }, AddressFamily = interfaceAddress.AddressFamily, Port = 0, // Assign a random port ScopeId = scopeId, FlowInfo = flowInfo }; DebugMessage( nameof(BindSocketByAddress), "Binding to `{0}:{1}` ...", bindIn6.Address?.IPAddress, bindIn6.Port ); return(Socket.Bind(socket, ref bindIn6, Marshal.SizeOf(bindIn6))); } DebugMessage( nameof(BindSocketByAddress), "Binding to interface skipped due an unsupported interface address family of `{0}`.", interfaceAddress.AddressFamily ); return(SocketError.Success); }
/// <inheritdoc /> public IEndPoint Create(ISocketAddress socketAddress) { return(Implementation.Create(socketAddress.ToImplementation()).ToInterface()); }
private bool IsInternalAddress(IntPtr socket, ISocketAddress socketAddress) { switch (socketAddress?.AddressFamily) { case AddressFamily.InterNetwork: if (socketAddress.Address?.IPAddress?.Equals(IPAddress.Any) == true) { DebugMessage( nameof(IsInternalAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [0.0.0.0]" ); { return(true); } } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("127.0.0.0"), IPAddress.Parse("127.255.255.255"))) { DebugMessage( nameof(IsInternalAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Loop Back]" ); { return(true); } } break; case AddressFamily.InterNetworkV6: if (socketAddress.Address?.IPAddress?.Equals(IPAddress.IPv6Any) == true) { DebugMessage( nameof(IsInternalAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [0000:]" ); { return(true); } } if (socketAddress.Address?.IPAddress?.Equals(IPAddress.IPv6Loopback) == true) { DebugMessage( nameof(IsInternalAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Loop Back]" ); { return(true); } } break; } return(false); }
private bool IsSpecialAddress(IntPtr socket, ISocketAddress socketAddress) { if (IsInternalAddress(socket, socketAddress)) { return(true); } switch (socketAddress?.AddressFamily) { case AddressFamily.InterNetwork: if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("10.0.0.0"), IPAddress.Parse("10.255.255.255"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); { return(true); } } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("172.16.0.0"), IPAddress.Parse("172.31.255.255"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); { return(true); } } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("192.168.0.0"), IPAddress.Parse("192.168.255.255"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Private Range]" ); { return(true); } } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("169.254.1.0"), IPAddress.Parse("169.254.254.255"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [Link Local Network]" ); { return(true); } } if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("224.0.0.0"), IPAddress.Parse("239.255.255.255"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [MultiCast Address]" ); { return(true); } } break; case AddressFamily.InterNetworkV6: if (IsIpInRange(socketAddress.Address?.IPAddress, IPAddress.Parse("fc00:0000:0000:0000:0000:0000:0000:0000"), IPAddress.Parse("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))) { DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due to the nature of passed IP Address. [fc00:]" ); { return(true); } } break; default: DebugMessage( nameof(IsSpecialAddress), socket, "Binding to interface skipped due an unsupported address family of `{0}`.", socketAddress?.AddressFamily ); { return(true); } } return(false); }
private SocketError BindSocketByAddress(IntPtr socket, ISocketAddress socketAddress) { if (IsSpecialAddress(socket, socketAddress)) { return(SocketError.Success); } if (IsSocketMarkedAsBinded(socket)) { DebugMessage( nameof(BindSocketByAddress), socket, "Binding to interface skipped as the socket should be already binded." ); return(SocketError.Success); } var networkInterface = GetNetworkInterface(); var interfaceAddress = GetInterfaceAddress(networkInterface, socketAddress.AddressFamily, false); if (networkInterface == null || interfaceAddress == null) { DebugMessage( nameof(BindSocketByAddress), socket, "Binding for the `{0}:{1}` rejected due to lack of a valid interface address.", socketAddress.Address?.IPAddress, socketAddress.Port ); return(SocketError.SocketError); } if (interfaceAddress.AddressFamily == AddressFamily.InterNetwork) { var bindIn = new SocketAddressIn { Address = new AddressIn { IPAddress = interfaceAddress }, AddressFamily = interfaceAddress.AddressFamily, Port = 0 // Assign a random port }; DebugMessage( nameof(BindSocketByAddress), socket, "Binding to `{0}:{1}` ...", bindIn.Address?.IPAddress, bindIn.Port ); MarkSocketAsBinded(socket); return(NativeSocket.Bind(socket, ref bindIn, Marshal.SizeOf(bindIn))); } if (interfaceAddress.AddressFamily == AddressFamily.InterNetworkV6) { var scopeId = (uint?)networkInterface.GetIPProperties()?.GetIPv6Properties()?.Index ?? 0; var flowInfo = (socketAddress as SocketAddressIn6?)?.FlowInfo ?? 0; var bindIn6 = new SocketAddressIn6 { Address = new AddressIn6 { IPAddress = interfaceAddress }, AddressFamily = interfaceAddress.AddressFamily, Port = 0, // Assign a random port ScopeId = scopeId, FlowInfo = flowInfo }; DebugMessage( nameof(BindSocketByAddress), socket, "Binding to `{0}:{1}` ...", bindIn6.Address?.IPAddress, bindIn6.Port ); MarkSocketAsBinded(socket); return(NativeSocket.Bind(socket, ref bindIn6, Marshal.SizeOf(bindIn6))); } DebugMessage( nameof(BindSocketByAddress), socket, "Binding to interface skipped due an unsupported interface address family of `{0}`.", interfaceAddress.AddressFamily ); return(SocketError.Success); }