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#:
A to serwer:
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.
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: