я разрабатываю приложение, которое слушает tcp для получения некоторых данных XML, прибывающих из других устройств. я - использование, осуществляющее сниффинг c# код, и я могу осуществить сниффинг всех пакетов. моя проблема состоит в том, что в каждом пакете я могу найти Часть данных в каждом пакете. как это:
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, который может сделать это?
Я сделал это, отслеживая один порт за потоком ... и собирая их по порядковому номеру. спасибо за вашу помощь
Вы нюхаете или просто хотите подключиться к устройству и получить данные? В последнем случае вы можете использовать класс TcpClient, чтобы делать то, что вам нужно.
using System.Net.Sockets;
TcpClient tcp = new TcpClient(AddressFamily.InterNetwork);
tcp.Connect(IPAddress.Parse("192.168.0.1"), 12345);
А затем tcp.GetStream ()
предоставит вам то, что вы можете передать в ваш выбранный синтаксический анализатор XML.
Edit: Вот немного более подробный образец.
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), вам потребуется много работы, чтобы поговорить с сервером перед получением данных (и, есть другой класс, который делает это правильно;))