예제 #1
0
        private bool BindSocket(IntPtr socket, AddressFamily addressFamily, IPAddress ipAddress, int portNumber = 0)
        {
            switch (addressFamily)
            {
            case AddressFamily.InterNetwork:
                if (ipAddress.Equals(IPAddress.Any))
                {
                    return(true);
                }
                if (IsIpInRange(ipAddress, IPAddress.Parse("127.0.0.0"), IPAddress.Parse("127.255.255.255")))
                {
                    return(true);    // Loopback
                }
                if (IsIpInRange(ipAddress, IPAddress.Parse("10.0.0.0"), IPAddress.Parse("10.255.255.255")))
                {
                    return(true);    // Private Network
                }
                if (IsIpInRange(ipAddress, IPAddress.Parse("172.16.0.0"), IPAddress.Parse("172.31.255.255")))
                {
                    return(true);    // Private Network
                }
                if (IsIpInRange(ipAddress, IPAddress.Parse("192.168.0.0"), IPAddress.Parse("192.168.255.255")))
                {
                    return(true);    // Private Network
                }
                if (IsIpInRange(ipAddress, IPAddress.Parse("224.0.0.0"), IPAddress.Parse("239.255.255.255")))
                {
                    return(true);    // Multicast
                }
                var networkIp = GetNetworkInterfaceIPAddress(addressFamily);
                if (networkIp == null)
                {
                    return(false);
                }
                if (networkIp.Equals(ipAddress))
                {
                    return(true);
                }
                var bindIn = new SocketAddressIn
                {
                    IPAddress = new SocketAddressIn.AddressIn {
                        IpAddress = networkIp
                    },
                    Family = networkIp.AddressFamily,
                    Port   = portNumber
                };
                var addressIn = bindIn;
                ContinueExecution(() => DebugMessage("Auto Bind: " + addressIn.IPAddress.IpAddress));
                return(Socket.Bind(socket, ref bindIn, Marshal.SizeOf(bindIn)) == SocketError.Success);

            default:
                return(true);
            }
        }
예제 #2
0
        private SocketError Do_Bind(IntPtr socket, ref SocketAddressIn address, int addressSize)
        {
            var addressIn = address;

            ContinueExecution(
                () => DebugMessage("Bind: " + addressIn.IPAddress.IpAddress + ":" + addressIn.Port));

            var networkIp = GetNetworkInterfaceIPAddress(address.Family);

            if (networkIp != null && !address.IPAddress.IpAddress.Equals(IPAddress.Any) &&
                !address.IPAddress.IpAddress.Equals(networkIp) &&
                !IsIpInRange(address.IPAddress.IpAddress, IPAddress.Parse("127.0.0.0"),
                             IPAddress.Parse("127.255.255.255")))
            {
                address.IPAddress.IpAddress = networkIp;
                ContinueExecution(() => DebugMessage("Modified Bind: " + addressIn.IPAddress.IpAddress));
            }
            return(Socket.Bind(socket, ref address, addressSize));
        }