views:

115

answers:

2

i'm developing an application that is listening to tcp to get some xml data coming from other devices. i'm use sniffing c# code, and i can sniff all the packets. my problem is that in every packet i can find a Piece of the data in every packet. like this:

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 

the real data looks like this:

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

i want to be able to get the data in a string like the real data, not in pieces. is there is a method or a library in .net that can do that?

A: 

Are you sniffing, or do you just want to connect to the device and grab the data? If the latter, you can use the TcpClient class to do what you need.

using System.Net.Sockets;

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

And then tcp.GetStream() will get you something you can feed into your XML parser of choice.

Edit: Here's a slightly more detailed sample.

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

Note that this ignores the problem of any protocols you need to follow (for example, if you're communicating via HTTP (port 80), there's a lot of work involved in talking to the server before getting the data (and, there's another class that does this properly ;))

Mike Caron
ok thats look good ...i want to test it but i don't know how to parse the data from tcp.GetStreami tried this NetworkStream networkStream = tcpClient.GetStream();byte[] buffer = new byte[180000];string d= networkStream.Read(buffer,0,Convert.ToInt32(networkStream.Length-1)).ToString();i have this error..."This stream does not support seek operations."i'm new in networking programming and i don't know if this can work at allcan u tell me how to get the data from the network stream in a textbox or string??
Ramah
I've added a fairly detailed example of using TcpClient. As a bonus, you also get to see the server equivalent, but you probably don't need to pay any attention to it :)
Mike Caron
0 down vote accept i'm not getting any data at allall what i got is<myxmldocument><node1><node2></node2></node1></myxmldocument>Press any key to continue...any help please ?
Ramah
A: 

i did it by monitoring one port by thread..and Assembly them by sequence number. thanks for all your help

Ramah