Hallo zusammen,
hab da nochmal ein Problem ...
Ich möchte mit einem Clientprogramm eine Nachricht an einen Port einer bestimmten Ip (Server) schicken, die dann von einem anderen Programm abgefragt wird.
Soweit so gut, das ganze funktioniert auch wenn eine Netzwerkverbindung besteht und das andere Programm läuft.
Wenn nicht stürzt das Clientprogramm ab !
Zur Zeit mach ich das am Client so
try
{
//Client öffnen
TcpClient client = new TcpClient(arr_PCInvent[1], int_port);
//Text in Byte umwandeln
Byte[] data = System.Text.Encoding.ASCII.GetBytes(str_AusgabeText);
//Netzwerkstream öffnen
NetworkStream stream = client.GetStream();
//Datensatz schreiben
stream.Write(data, 0, data.Length);
//Client schließen
client.Close();
}
catch
{
//Fehlerbehandlung
lstFehlerausgabe.Items.Insert(0, System.DateTime.Now.ToString() + " Fehler beim Versenden der Nachricht an die IP: " + arr_PCInvent[1]);
}
Wenn keine Verbindung erstellt werden kann läuft das Programm ab Zeile 4 in den Catch-Teil und hängt sich danach auf ! Warum ? Was mach ich falsch ?
Danke schonmal im Vorhinein 🙂
Gruss Chris
Haste schon versucht das in eine Methode zu schreiben und den try-catch Block beim Aufruf der Methode verwendest? Etwa so:
public void conncten()
{
//Client öffnen
TcpClient client = new TcpClient(arr_PCInvent[1], int_port);
//Text in Byte umwandeln
Byte[] data = System.Text.Encoding.ASCII.GetBytes(str_AusgabeText);
//Netzwerkstream öffnen
NetworkStream stream = client.GetStream();
//Datensatz schreiben
stream.Write(data, 0, data.Length);
//Client schließen
client.Close();
}
................................................................
private void button1_Click(object sender, System.EventArgs e)
{
try
{
connecten();
}
catch(Exception)
{
MessageBox.Show("Dein Chatpartner ist nicht bereit, oder du hast die falsche bzw. eine ungültige IP Adresse angegeben", "Fehler 02");
}
}
Musste dann beim Methodenaufruf eventuell noch die IP und den Port übergeben...
TcpClient.GetStream-Methode:
Zuerst muss die Connect-Methode aufgerufen werden, sonst löst die GetStream-Methode eine InvalidOperationException aus.
Liegt es vielleicht daran?
Noch etwas, die Client-Verbindung würde ich nicht im try - Block schließen. Was passiert, wenn Du die Verbindung öffnest und danach erst ein Exception auslöst? Dann wird nämlich Deine Verbindung nicht geschlossen. Dafür gibt es den finally Block, der immer durchlaufen wird.
@ moson: Er hängt sich zumindest nicht mehr auf 🙂
@ Noodles: Der Fehler entsteht schon in der Zeile
TcpClient client = new TcpClient(arr_PCInvent[1], int_port);
Kann also nicht an der TcpClient.GetStream-Methode liegen.
Das zweite was du gerade angesprochen hast wollte ich ja eigentlich auch machen, bekomm das aber irgendwie nicht hin. Wenn ich client.Close(); in den finally Block schreibe kommt immer der Fehler "Typ oder Namespace 'client' konnte nicht gefunden werden...." Mach ich da was bei der Instanzierung des Objektes falsch ?
Hi,
das gehört aber eindeutig nach Netzwerk --> verschoben.
Viele Grüße
www.mycsharp.de
Bitte vor dem Fragen immer in die FAQ schauen und die Suche benutzen. Danke.
Original von zeus
Hi,das gehört aber eindeutig nach Netzwerk --> verschoben.
Hast Recht, hab nicht aufgepasst ... Sorry
Original von Noodles
Noch etwas, die Client-Verbindung würde ich nicht im try - Block schließen. Was passiert, wenn Du die Verbindung öffnest und danach erst ein Exception auslöst? Dann wird nämlich Deine Verbindung nicht geschlossen. Dafür gibt es den finally Block, der immer durchlaufen wird.
Hier wird die Verbindung aufgebaut:
TcpClient client = new TcpClient(arr_PCInvent[1], int_port);
Das nach dem Verbindungsaufbau noch ne Exception ausgelöst wird halte ich für unwarscheinlich...
Da bei ihm garkeine Verbindung aufgebaut werden kann, so braucht er ja auch keine zu Closen...
Original von Noodles
TcpClient.GetStream-Methode:
Zitat:
Zuerst muss die Connect-Methode aufgerufen werden, sonst löst die GetStream-Methode eine InvalidOperationException aus.Liegt es vielleicht daran
Die Connect Methode brauchste garnicht...
Original von moson
Das nach dem Verbindungsaufbau noch ne Exception ausgelöst wird halte ich für unwarscheinlich...
Da bei ihm garkeine Verbindung aufgebaut werden kann, so braucht er ja auch keine zu Closen...
Ich meinte das im Allgemeinen. Und wenn Du da der Meinung bist, dass es unwahrscheinlich ist, dann kannst Du es ja ignorieren.
Original von moson
Original von Noodles
TcpClient.GetStream-Methode:
Zitat:
Zuerst muss die Connect-Methode aufgerufen werden, sonst löst die GetStream-Methode eine InvalidOperationException aus.Liegt es vielleicht daran
Die Connect Methode brauchste garnicht...
Hab ich dem Tutorial auch gesehen, aber mein Zitat ist aus der Framework SDK Doku.
Estmal vielen Dank für eure Antworten.
@ moson: Ich denke schon das es wichtig ist die close-Methode in den Finally-Block zu schreiben, falls die Verbindung mal aufgebaut wird und der Stream danach abbricht, wobei du bei meinem jetzigen Problem natürlich Recht hast...
@ Noodles: Danke für den Link, hab aber nichts zu dem try-catch-finally-Problem gefunden 🙁
@ All: Kann man irgendwie betimmen, wie lange versucht werden soll eine Verbindung aufzubauen ???
Strebe da noch ne andere Überlegung an...
Wäre es sinnvoll einen ping an den Server zu schicken und bei Antwort erst eine Verbindung herzustellen ?
Wenn ja kann mir dann jemand sagen wie ich das mache und die Antwort auswerte ???
Andere Vorschläge sind natürlich auch sehr willkommen 😁
Original von rockynl
@ Noodles: Danke für den Link, hab aber nichts zu dem try-catch-finally-Problem gefunden 😦
Man könnte es so tun:
TcpClient client = new TcpClient();
string host = ""; int port = 000;
try
{
client.Connect(host, port);
...
}
catch
{
//Fehlerbehandlung
...
}
finally
{
client.Close();
}
Original von rockynl
@ All: Kann man irgendwie betimmen, wie lange versucht werden soll eine Verbindung aufzubauen ???
Schau Dir mal die ReceiveTimeout Methode der TcpClient Klasse, vielleicht löst die ja Dein Problem.
Original von moson
Ok, ich wollte dich nicht persönlich angreifen...
Hast Du doch auch nicht. 😁
Danke, weis jetzt auch wie das mit der Pinganfrage geht...
Process Verbindungstest = new Process();
Verbindungstest.StartInfo.FileName = "ping.exe";
Verbindungstest.StartInfo.Arguments = arr_PCInvent[1];
Verbindungstest.StartInfo.UseShellExecute = false;
Verbindungstest.StartInfo.RedirectStandardOutput = true;
Verbindungstest.StartInfo.CreateNoWindow = true;
Verbindungstest.Start();
string str_Ergebnis = Verbindungstest.StandardOutput.ReadToEnd();
Verbindungstest.WaitForExit();
In der Variablen str_Ergebnis steht dann die Ausgabe von dem Pingbefehl...
Weis nicht ob es die beste Lösung ist, aber es funktioniert ...
Verbesserungsvorschläge sind willkommen 🙂
Ich habe jetzt noch ein sauberes Aufräumen (meiner Meinung nach) gefunden:
System.Net.Sockets.TcpClient tc = null;
try
{
tc.Connect("Host", 00);
}
catch
{
// ...
}
finally
{
if(tc != null)
tc.Close();
}