Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 /// <inheritdoc />
 public IEndPoint Create(ISocketAddress socketAddress)
 {
     return(Implementation.Create(socketAddress.ToImplementation()).ToInterface());
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }