Avatar billede Lars Søndergaard Nybegynder
08. januar 2004 - 10:24 Der er 14 kommentarer og
2 løsninger

Lytte til port

Jeg skal lytte til en port, hvorfra der konstant bliver sends xml-strenge. Måske helt op til 650 i sekundet. Jeg skal fange disse xml-strenge og behandle dem.

Hvordan laver jeg bedst denne "lytte og gemme" funktion.

Jeg bruger:

m_sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

min m_sock er forbundet og autoriseret - what next ??
Avatar billede bennytordrup Nybegynder
08. januar 2004 - 10:34 #1
Jeg lytter lige med
Avatar billede sekhmet_ds Nybegynder
08. januar 2004 - 10:36 #2
Du skal først kalde Listen på din socket og derefter kalde BeginReceive. Dette starter med at håndtere indkomne requests asynkront.

Mere præcist information kan du få på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemNetSocketsSocketClassBeginReceiveTopic.asp
Avatar billede mortendahl2003 Nybegynder
08. januar 2004 - 15:41 #3
Avatar billede Lars Søndergaard Nybegynder
08. januar 2004 - 17:39 #4
Jeg takker foreløbig for info - jeg har læst på det hele dagen, men det er ikke lykkedes mig at fange nogle date fra min server forbindelse.

Her er en lille stump kode:

Byte[] temp = new byte[1];
socket.Receive(temp,1,0);
int len = (int) temp[0];
byte[] RecvBytes = new byte[len];
int bytes = socket.Receive(RecvBytes,len,0); //HER STOPPER DEN UDEN FEJL..

Der sker ikke mere.. hvad kan grunden være til det ?
Avatar billede arne_v Ekspert
08. januar 2004 - 18:59 #5
Jeg synes at du skulle bruge TcpListener klassen.

Det er lige ud af landevejen.

Eksempel:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

class Server
{
    public static void Main(string[] args)
    {
        TcpListener server = new TcpListener(IPAddress.Any, 1234);
        server.Start();
        TcpClient client = server.AcceptTcpClient();
        StreamReader rdr = new StreamReader(client.GetStream());
        string line;
        while((line = rdr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        rdr.Close();        client.Close();
        server.Stop();
    }
}

Og et matchende client program:

using System;
using System.IO;
using System.Net.Sockets;

class Client
{
    public static void Main(string[] args)
    {
        TcpClient client = new TcpClient("localhost", 1234);
        StreamWriter wrt = new StreamWriter(client.GetStream());
        for(int i = 0; i < 100; i++)
        {
            wrt.WriteLine("<arnexml>Dette er en test</arnexml>");
        }
        wrt.Close();
        client.Close();
    }
}
Avatar billede sekhmet_ds Nybegynder
08. januar 2004 - 21:00 #6
subtile> hvad mener du med at den stopper? Returnere metoden (hvis vi antager det er indholdet af en metode) eller stopper den bare der? I tilfælde den stopper er det sandsynligvis fordi den venter på at en forbindelse bliver forsøgt oprettet, altså at nogen sender noget til porten.
Avatar billede sekhmet_ds Nybegynder
08. januar 2004 - 22:10 #7
Jeg har fundet ud af at det jeg skrev ikke er helt korrekt.
Metoderne skal kaldes i følgende rækkefølge:

socket.Bind
socket.Listen
Socket retSock = socket.Accept
retSock.Receive

Jeg har testet det, godt nok med den asynkrone version af Receive, og det virker fint. Den Socket Accept returnere er den du skal bruge til at kommunikere med din klient over, den kan ikke bruges til at lave nye connections til andre klienter med. Hvis du vil det skal du kalde Accept på din oprindelige Socket igen.

Håber det hjælper, ellers må jeg lige sende noget eks. kode.
Avatar billede Lars Søndergaard Nybegynder
09. januar 2004 - 15:30 #8
Jeg koder op imod et API som næsten ikke er dokumenteret - jeg har fået at vide at jeg skal modtage xml strenge. Det foregår ved at jeg:

<b>forbinder:</b>
socket.Connect(IPEndPoint);

<b>autoriseres:</b>
Jeg sender nogle forskellige byte mv og modtager en xml streng indeholdende info om at jeg er autoriseret.

<b>Herefter starter jeg en funktion:</b>
Jeg sender igen nogle bytes og herved starter jeg den mekanisme der sender mig xml-strenge. Nu er problemet bare at fange dem.

arne_v > jeg bliver nødt til at modtage med samme socket som er forbundet og autoriset, men jeg vil da gerne prøve med en TcpListener blot for at se hvad der sker. API'et skulle jo gerne være sikret så alle mulige ikke kan hente informationer fra det.

sekhmet_ds > Jeg ved ikke hvorfor den stopper. Der returneres ikke noget - hverken exceptions eller data. Det kunne jo være fordi den venter på data, og så må det være fordi min simulator (som skal sende xml) ikke virker. Jeg har netop kontaktet dem som har lavet API'et. Jeg vender tilbage asap.

Foreløbig tak for hjælpen
Avatar billede arne_v Ekspert
09. januar 2004 - 15:34 #9
TcpClient og TcpListener er bare et abstraktions lag ovenpå en
almindelig Socket, som I mange tilfælde gør koden simplere.
Avatar billede Lars Søndergaard Nybegynder
09. januar 2004 - 15:47 #10
arne_v >

jeg prøvede at lave en getstream med en tcpClient og den stoppede også på samme måde. Kan det være fordi der intet sendes ?

public void test()
{
TcpClient client = new TcpClient("server", 1234);
StreamWriter wrt = new StreamWriter(client.GetStream());
for(int i = 0; i < 100; i++)
{
  wrt.WriteLine("<xml>Dette er en test</xml>");
}
wrt.Close();
client.Close();
}
Avatar billede arne_v Ekspert
10. januar 2004 - 23:23 #11
Prøv:

for(int i = 0; i < 100; i++)
{
  wrt.WriteLine("<xml>Dette er en test</xml>");
  wrt.Flush();
}
Avatar billede Lars Søndergaard Nybegynder
14. januar 2004 - 16:50 #12
problemet er ikke så enkelt

xml-data kommer flyvende i en lind strøm og jeg skal opfange dem og finde ud af hvordan jeg klipper de rigtige stumper ud - dvs fra <xml> til </xml> - Jeg er i stand til at udskrive xml-data men mine Console.Writeline(data); statements udskrive ikke een xml string af gangen men en masse blandet xml.

jeg vender tilbage med mere info så snart jeg ved mere :-(
Avatar billede arne_v Ekspert
14. januar 2004 - 17:19 #13
.NET har udmærket support for XML, så det må også være til at finde ud af.
Avatar billede Lars Søndergaard Nybegynder
21. januar 2004 - 10:45 #14
så fik jeg det til at virke.. længden på den xml streng jeg skal motage fylder de første 4byte.. det var rart at vide !! men mange tak for forslag og hjælp.
Avatar billede Lars Søndergaard Nybegynder
21. januar 2004 - 10:47 #15
sekhmet_ds > kom med et svar så er der også lidt til dig som tak for din tid :-)
Avatar billede Lars Søndergaard Nybegynder
21. januar 2004 - 10:48 #16
nå det var der åbenbart ikke.. jeg forsøgte eller at gemme 25 points til dig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester