2010-07-28 22 views
1

Je développe une application qui écoute tcp pour obtenir des données xml provenant d'autres périphériques. J'utilise sniffing C# code, et je peux renifler tous les paquets. mon problème est que dans chaque paquet je peux trouver une pièce des données dans chaque paquet. comme ceci:lire des données xml sur tcp

1 packet from ip41 data:< 
2 packet from ip41 data:?xml versi 
3 packet from ip41 data:on="1.0" 
1 packet from ip35 data:< ?xml 
4 packet from ip41 data:encoding="UTF-8 

les données réelles ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?><alarm><datetime>2010-07-18T11:14:22Z</datetime><textch><textchid>020</textchid></textch><rule>DIR-020</rule><text>020-DIR-Intersection3_Magles_TCS6</text></alarm> 

Je veux être en mesure d'obtenir les données dans une chaîne comme les données réelles, en morceaux. y at-il une méthode ou une bibliothèque dans .net qui peut faire cela?

+0

duplication possible de [lire les données de reniflage sur tcp] (http://stackoverflow.com/questions/3345171/read-sniffing-data-over-tcp) –

Répondre

1

Je l'ai fait en surveillant un port par thread .. et les assembler par numéro de séquence. merci pour toute votre aide

1

Vous reniflez-vous, ou voulez-vous simplement vous connecter à l'appareil et récupérer les données? Si ce dernier, vous pouvez utiliser la classe TcpClient pour faire ce dont vous avez besoin.

using System.Net.Sockets; 

TcpClient tcp = new TcpClient(AddressFamily.InterNetwork); 
tcp.Connect(IPAddress.Parse("192.168.0.1"), 12345); 

Et puis tcp.GetStream() vous obtiendrez quelque chose que vous pouvez alimenter votre analyseur XML de choix.

Editer: Voici un exemple un peu plus détaillé.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Net.Sockets; 
using System.Threading; 

namespace ConsoleApplication1 { 

    class XMLBlaster { 
     Thread myThread; 

     public XMLBlaster() { 
      myThread = new Thread(Start); 
     } 

     public void Begin() { 
      myThread.Start(); 
     } 

     //This will listen for a connection on port 12345, and send a tiny XML document 
     //to the first person to connect. 
     protected void Start() { 
      TcpListener tcp = new TcpListener(IPAddress.Any, 12345); 
      tcp.Start(1); 

      TcpClient client = tcp.AcceptTcpClient(); 

      StreamWriter data = new StreamWriter(client.GetStream()); 

      data.Write("<myxmldocument><node1><node2></node2></node1></myxmldocument>"); 

      data.Close(); 
      client.Close(); 
     } 
    } 

    class Program { 


     static void Main(string[] args) { 

      //this sets up the server we will be reading 
      XMLBlaster server = new XMLBlaster(); 
      server.Begin(); 


      //this is the important bit 

      //First, create the client 
      TcpClient tcp = new TcpClient(AddressFamily.InterNetwork); 

      //Next, connect to the server. You probably will want to use the prober settings here 
      tcp.Connect(IPAddress.Loopback, 12345); 

      //Since byte manipulation is ugly, let's turn it into strings 
      StreamReader data_in = new StreamReader(tcp.GetStream()); 

      //And, just read everything the server has to say 
      Console.WriteLine(data_in.ReadToEnd()); 

      //when we're done, close up shop. 
      data_in.Close(); 
      tcp.Close(); 

      //this is just to pause the console so you can see what's going on. 
      Console.WriteLine("Press any key to continue..."); 
      Console.ReadKey(false); 
     } 
    } 
} 

Notez que cela ne tient pas le problème de tout protocole que vous devez suivre (par exemple, si vous communiquez via HTTP (port 80), il y a beaucoup de travail impliqué dans parler au serveur avant d'obtenir la data (et, il ya une autre classe qui le fait correctement;))

+0

ok c'est bon ... Je veux le tester mais je ne sais pas comment analyser les données de tcp.GetStream J'ai essayé cela NetworkStream networkStream = tcpClient.GetStream(); Octet [] tampon = nouvel octet [180000]; chaîne d = networkStream.Read (tampon, 0, Convert.ToInt32 (networkStream.Length-1)). ToString(); J'ai cette erreur ... "Ce flux ne supporte pas les opérations de recherche." Je suis nouveau dans la programmation réseau et je ne sais pas si cela peut fonctionner du tout pouvez-vous me dire comment obtenir les données du flux réseau dans une zone de texte ou une chaîne? – Ramah

+0

J'ai ajouté un exemple assez détaillé d'utilisation de TcpClient. En prime, vous obtenez également de voir l'équivalent du serveur, mais vous n'avez probablement pas besoin d'y prêter attention :) –

+0

0 bas vote accepter \t je ne reçois aucune donnée du tout tout ce que je GOT Appuyez sur une touche pour continuer ... toute aide s'il vous plaît? – Ramah