예제 #1
0
        private bool InitDevice()
        {
            if (_current_if == null)
            {
                MessageBox.Show("Please select network interface first", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            if (rbModeRouting.Checked)
            {
                _mode = DEVICE_MODE.MODE_ROUTING;
            }
            if (rbModeTunneling.Checked)
            {
                _mode = DEVICE_MODE.MODE_TUNNELING;
            }

            if (_sock != null && _sock.IsBound)
            {
                _sock.Close();
            }

            string local_addr = this.ipAddressControl1.Text;

            _local_endpoint = new IPEndPoint(IPAddress.Parse(local_addr), (int)this.numericUpDown1.Value);
            _sock           = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP);
            _sock.Bind(_local_endpoint);

            switch (_mode)
            {
            case DEVICE_MODE.MODE_ROUTING:
                IPAddress       multicast_addr = IPAddress.Parse(DEFAULT_MULTICAST_ADDRESS);
                MulticastOption option         = new MulticastOption(multicast_addr);
                _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, option);
                _remote_data_endpoint       = new IPEndPoint(multicast_addr, DEFAULT_EIB_PORT);
                this.ipAddressControl1.Text = DEFAULT_MULTICAST_ADDRESS;
                break;

            case DEVICE_MODE.MODE_TUNNELING:
                IPAddress       maddr = IPAddress.Parse(DEFAULT_MULTICAST_ADDRESS);
                MulticastOption opt   = new MulticastOption(maddr, IPAddress.Parse(local_addr));
                _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, opt);
                _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);
                //_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, 1);
                _recv_sequence = 0;
                _send_sequence = 0;
                this.ipAddressControl1.Text = local_addr;
                break;
            }

            return(true);
        }
예제 #2
0
        private bool InitDevice()
        {
            if (_current_if == null)
            {
                MessageBox.Show("Please select network interface first", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (rbModeRouting.Checked)
            {
                _mode = DEVICE_MODE.MODE_ROUTING;
            }
            if (rbModeTunneling.Checked)
            {
                _mode = DEVICE_MODE.MODE_TUNNELING;
            }

            if(_sock != null && _sock.IsBound)
                _sock.Close();

            string local_addr = this.ipAddressControl1.Text;
            _local_endpoint = new IPEndPoint(IPAddress.Parse(local_addr), (int)this.numericUpDown1.Value);
            _sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP);
            _sock.Bind(_local_endpoint);

            switch (_mode)
            {
                case DEVICE_MODE.MODE_ROUTING:
                    IPAddress multicast_addr = IPAddress.Parse(DEFAULT_MULTICAST_ADDRESS);
                    MulticastOption option = new MulticastOption(multicast_addr);
                    _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, option);
                    _remote_data_endpoint = new IPEndPoint(multicast_addr, DEFAULT_EIB_PORT);
                    this.ipAddressControl1.Text = DEFAULT_MULTICAST_ADDRESS;
                    break;
                case DEVICE_MODE.MODE_TUNNELING:
                    IPAddress maddr = IPAddress.Parse(DEFAULT_MULTICAST_ADDRESS);
                    MulticastOption opt = new MulticastOption(maddr, IPAddress.Parse(local_addr));
                    _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, opt);
                    _sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);
                    //_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, 1);
                    _recv_sequence = 0;
                    _send_sequence = 0;
                    this.ipAddressControl1.Text = local_addr;
                    break;
            }

            return true;
        }