Laden...

Nachricht an einen Port schicken

Erstellt von rockynl vor 20 Jahren Letzter Beitrag vor 20 Jahren 6.135 Views
R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren
Nachricht an einen Port schicken

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

151 Beiträge seit 2003
vor 20 Jahren

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...

N
4.644 Beiträge seit 2004
vor 20 Jahren

TcpClient.GetStream-Methode:

Zuerst muss die Connect-Methode aufgerufen werden, sonst löst die GetStream-Methode eine InvalidOperationException aus.

Liegt es vielleicht daran?

N
4.644 Beiträge seit 2004
vor 20 Jahren

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.

R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren

@ 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 ?

445 Beiträge seit 2003
vor 20 Jahren

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.

N
4.644 Beiträge seit 2004
vor 20 Jahren

Guckst Du hier. Ich denke, dass könnte Dir helfen.

R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren

Original von zeus
Hi,

das gehört aber eindeutig nach Netzwerk --> verschoben.

Hast Recht, hab nicht aufgepasst ... Sorry

151 Beiträge seit 2003
vor 20 Jahren

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...

N
4.644 Beiträge seit 2004
vor 20 Jahren

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.

151 Beiträge seit 2003
vor 20 Jahren

Ok, ich wollte dich nicht persönlich angreifen...

R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren

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 ???

R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren

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 😁

N
4.644 Beiträge seit 2004
vor 20 Jahren

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. 😁

R
rockynl Themenstarter:in
53 Beiträge seit 2004
vor 20 Jahren

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 🙂

N
4.644 Beiträge seit 2004
vor 20 Jahren

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();
}