Problem mit Class Library



  • Hallo Zusammen!

    Ich habe ein Problem mit einer Class Library, die ich geschrieben hab. Die Klasse hat die Funktion, eine Verbindung zu einem TCPServer herzustellen, und einen String zu übermitteln. Ich verwende dazu die TCPClient Klasse, und da man damit nur Byte Arrays versenden kann, zum verschlüsseln die ASCIIEncoding Klasse (bzw hab ich auch schon BinaryWriter verwendet) Die Ip Adresse(string), der Port(int), sowie die Nachricht(string) werden in der Klasse übergeben.

    Der TCP Server ist eine Industrieanzeige, welche den String (der über bestimmte Steuerzeichen verfügt) direkt übernimmt und dann anzeigt. Solange ich die Klasse in einem Windows Programm, auf dem Rechner auf dem ich die Klasse entwickelt hab, einbinde funktioniert alles einwandfrei.

    Das Problem ist folgendes: Ich verwende diese Klasse in einem Industrieprogramm, welches .Net unterstützt. Wenn ich nun meine Klasse einbinde und ausführe wird die Verbindung einwandfrei aufgebaut. Nur die Anzeige nimmt den String nicht an. Ich habe jetzt den Verdacht, dass bei der Umwandlung des Strings etwas nicht einwandfrei funktioniert, da die Verbindung ja steht (seh ich im Command Fenster über den Befehl "netstat -an)

    Kann es sein, dass da ein Problem mit dem .Net Framework vorliegt, da das Industrieprogramm auf einem anderen Rechner liegt (verschiedene Versionen etc.)??

    Für jede Hilfe wäre ich sehr dankbar!

    Tom
    🙂 🙂



  • Hallo nochmal!

    Hab jetzt was interessantes herausgefunden:

    Wenn ich die Version mit dem BinaryWriter verwende:

    anzeige = new TcpClient();
    stream = anzeige.GetStream();
    bw = new BinaryWriter(stream);
    

    Und bei der write Funktion den String den ich senden will direkt in der Klasse hineinschreibe, dann funktioniert das ganze auch in dem Industrieprogramm.

    bw.write("$YTest\n");
    

    Wenn ich aber den Text über eine String Variable der Klasse übergeben will, dann funktioniert das ganze nicht!

    public bool senden (string IP, int port, string message)
    {
    ..
    ...
    ...
    ...
    
    bw.write(message) 
    
    }
    

    Ich blick da jetzt schön langsam nicht mehr durch!!

    Danke im Voraus für die Hilfe!
    Tom



  • Mach dir doch nen Breakpoint bei bw.Write und schau ob bei beiden Varianten wirklich das gleiche im String ist, der Fehler muss irgendwo anders sein. Ob der String nun direkt übergeben wird, oder als Parameter der Funktion ist egal. Wahrscheinlich wird der zwischendurch irgendwo verändert.

    Das die Umwandlung mit ASCIIEncoding zum zu sendenen ByteArray oder das schreiben mit dem BinaryWriter unterschiedliche Ergebnisse bringen ist klar.
    Im ersten Fall hast du halt die ASCII Darstellung und das wars. Beim Schreiben mit dem BinaryWriter wird erst noch die Länge des Strings geschrieben. Denke dein Industrieprogramm erwartet einfach das Format - da behauptet sich mal wieder der Spruch RTFM 🙂 Net bös gemeint.



  • Ich muss ja zugeben, dass ich ziemlicher Anfänger in C# bin...

    Ich poste jetzt einfach mal den ganzen Code. Wenn ich den Aufruf der Funktion so mache:

    Siebert.SiebertAnzeige.Senden("10.1.56.32",2000,"$YTest\n"
    

    Dann müsste doch das selbe passieren, wie wenn ich den Text direkt hineinschreibe!!

    using System;
    using System.Data;
    using System.Net.Sockets;
    using System.Net;
    using System.IO;
    
    namespace Siebert
    {
    	/// <summary>
    	/// Diese Klasse stellt die Kommunikation zwischen IAS und der Siebert Anzeige sicher.
    	/// </summary>
    	public class SiebertAnzeige
    	{
    		private TcpClient anzeige;
    		private BinaryWriter bw;
    		private NetworkStream stream;
    
    		// Klasse zum versenden von Daten an Siebert Anzeigen (Brandschutzmeldungen)
    		/// <summary>
    		/// sendet eine nachricht an einen netzwerkserver
    		/// </summary>
    		/// <param name="server">ip oder hostname des servers als string</param>
    		/// <param name="port">portnummer</param>
    		/// <param name="message">die zu sendende nachricht</param>
    		/// <returns>true wenn alles geklappt hat.</returns>
    		public bool Senden(string server, int port, string message)
    		{
    			if (server == null || server.Length < 1) 
    			{
    				throw new Exception("Senden: Ungültiger Servername.");
    			}
    
    			if (port < 0) 
    			{
    				throw new Exception("Senden: Ungültige Portnummer.");
    			}
    
    			if (message == null || message.Length < 1) 
    			{
    				return true;     // nothing to do
    			}
    
    			try
    			{	
    				anzeige = new TcpClient();
    				anzeige.Connect(IPAddress.Parse(server), port);
    				try 
    				{
    					stream = anzeige.GetStream();
    					bw = new BinaryWriter(stream);
    					//bw.Write("$YTest\n");  so funktionierts!!					
                        bw.Write(message);
    				}
    				finally
    				{
    					bw.Close();
    					stream.Close();
    					anzeige.Close();
    				}
    
    			}
    			catch(Exception ex)
    			{
    				Console.WriteLine("In SiebertAnzeige:Senden ist ein Fehler aufgetreten: " + ex.Message + " " + ex.StackTrace);
    				throw (ex);
    			}	
    			return true;
    		}
    
    	}
    
    }
    


  • Hab jetzt rausgefunden woran es gescheitert ist. Und zwar hab ich mit einem Sniffer (Packetyzer) herausgefunden, dass mein Industrieprogramm, das Linefeed am Ende des Texts (\n) nicht als solches sondern als normalen Text ansieht. Also \n in der Klasse dazugebastelt --> Funzt!


Anmelden zum Antworten