2010-07-28 3 views
1

Я разрабатываю приложение, которое слушает tcp, чтобы получить некоторые XML-данные, поступающие с других устройств. Я использую sniffing код C#, и я могу обнюхать все пакеты. моя проблема в том, что в каждом пакете я могу найти Piece данных в каждом пакете. так:читать xml данные по 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 

реальные данные выглядят следующим образом:

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

я хочу, чтобы иметь возможность получить данные в виде строки, как реальные данные, а не по частям. есть способ или библиотека в .net, которые могут это сделать?

+0

возможно дубликат [читать нюхают данных по протоколу TCP] (http://stackoverflow.com/questions/3345171/read-sniffing-data-over-tcp) –

ответ

1

Я сделал это, отслеживая один порт по потоку..and Сборка их по порядковым номерам. спасибо за вашу помощь

1

Вы обнюхиваете, или просто хотите подключиться к устройству и захватить данные? Если последний, вы можете использовать класс TcpClient для выполнения необходимых действий.

using System.Net.Sockets; 

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

И тогда tcp.GetStream() получит вам то, что вы можете подать в ваш XML-парсер выбора.

Редактировать: Вот несколько более подробный пример.

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

Обратите внимание, что при этом игнорируется проблема любых протоколов, которые вы должны следовать (например, если вы общаетесь через HTTP (порт 80), есть много работы, участие в разговоре с сервером до получения data (и, есть еще один класс, который делает это правильно;))

+0

OK то будет хорошо выглядеть ... Я хочу проверить его, но я не знаю, как анализировать данные из tcp.GetStream Я пробовал это NetworkStream networkStream = tcpClient.GetStream(); байт [] buffer = новый байт [180000]; строка d = networkStream.Read (буфер, 0, Convert.ToInt32 (networkStream.Length-1)). ToString(); У меня есть эта ошибка ... «Этот поток не поддерживает операции поиска». Я новичок в сетевом программировании, и я не знаю, может ли это вообще работать Можете ли вы рассказать мне, как получить данные из сетевого потока в текстовое поле или строку? – Ramah

+0

Я добавил довольно подробный пример использования TcpClient. В качестве бонуса, вы также можете увидеть эквивалент сервера, но вы, вероятно, не нужно обращать внимание на это :) –

+0

0 вниз голосования принять \t я не получаю никаких данных вообще все, что я GOT является Нажмите любую клавишу для продолжения ... любая помощь, пожалуйста? – Ramah