elmbrook Ответов: 1

Соединение не удалось установить, потому что целевая машина активно отказалась от него-удаленный рабочий стол


Я играю с созданием удаленного рабочего стола.

Я использую TCP.

Я получаю сообщение об ошибке "соединение не может быть установлено, потому что целевая машина активно отказалась от него".

Есть идеи, как заставить это работать?

Клиент
private readonly TcpClient client = new TcpClient();
        private NetworkStream mainStream;
        private int portNumber;

        private static Image GrabDesktop ()
        {
            Rectangle bounds = Screen.PrimaryScreen.Bounds;
            Bitmap screenshot = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb);
            Graphics graphic = Graphics.FromImage(screenshot);
            graphic.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy);

            return screenshot;
        }

        private void SendDesktopImage()
        {
            BinaryFormatter binformatter = new BinaryFormatter();
            mainStream = client.GetStream();
            binformatter.Serialize(mainStream, GrabDesktop());
        }

        public Form1()
        {
            InitializeComponent();
        }

         private void btnConnect_Click(object sender, EventArgs e)
        {
            portNumber = int.Parse(txtPort.Text.Trim());

            try
            {
                client.Connect(txtIP.Text, portNumber);
                MessageBox.Show("Connected");
            }
            catch(Exception ex)
            {
                MessageBox.Show("Failed to Connect: " + ex.Message);
            }
        }

        private void btnShare_Click(object sender, EventArgs e)
        {
            if (btnShare.Text.StartsWith("Share"))
            {
                timer1.Start();
                btnShare.Text = "Stop Sharing";
            }
            else
            {
                timer1.Stop();
                btnShare.Text = "Share my screen";
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SendDesktopImage();
        }


сервер выглядит следующим образом
private readonly TcpClient client = new TcpClient();
       private NetworkStream mainStream;
       private int portNumber;

       private static Image GrabDesktop ()
       {
           Rectangle bounds = Screen.PrimaryScreen.Bounds;
           Bitmap screenshot = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb);
           Graphics graphic = Graphics.FromImage(screenshot);
           graphic.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy);

           return screenshot;
       }

       private void SendDesktopImage()
       {
           BinaryFormatter binformatter = new BinaryFormatter();
           mainStream = client.GetStream();
           binformatter.Serialize(mainStream, GrabDesktop());
       }

       public Form1()
       {
           InitializeComponent();
       }

        private void btnConnect_Click(object sender, EventArgs e)
       {
           portNumber = int.Parse(txtPort.Text.Trim());

           try
           {
               client.Connect(txtIP.Text, portNumber);
               MessageBox.Show("Connected");
           }
           catch(Exception ex)
           {
               MessageBox.Show("Failed to Connect: " + ex.Message);
           }
       }

       private void btnShare_Click(object sender, EventArgs e)
       {
           if (btnShare.Text.StartsWith("Share"))
           {
               timer1.Start();
               btnShare.Text = "Stop Sharing";
           }
           else
           {
               timer1.Stop();
               btnShare.Text = "Share my screen";
           }
       }

       private void timer1_Tick(object sender, EventArgs e)
       {
           SendDesktopImage();
       }


Что я уже пробовал:

Я попробовал запустить приведенный выше код

1 Ответов

Рейтинг:
9

johannesnestler

Итак, вы создали два клиента и ни одного сервера для прослушивания соединений? Я бы сказал, еще раз прочитать об основах. Реализуйте асинхронный прослушивающий сокет (как показано на MSDN - если вы ищете сервер сокетов - мне не нравится это говорить - но RTFM)...
Короткая версия: с одной стороны создайте слушателя:

Socket socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketListener.Bind(localEndPoint);
socketListener.Listen(100);

// then in some "wait"-Loop (async to main thread) you wait for Connections
socketListener.BeginAccept(new AsyncCallback(AcceptCallback), socketListener);


Ваша клиентская сторона кажется в порядке после беглого взгляда...

Не стесняйтесь задавать дополнительные вопросы, удачи вам в вашем проекте!