Avatar billede majbom Novice
09. august 2006 - 10:06 Der er 29 kommentarer og
2 løsninger

sockets driller

hej eksperter

jeg sidder her og roder med sockets...

jeg har et program på en pc, som skal kommunikere med en såkaldt WebPIC (et print med en PIC-processor, rj45-stik og rs232-stik)

dette print kan indstilles til at spytte data der kommer ind på tcp/ip-porten ud på rs232-porten og omvendt

jeg har tilsluttet begge interfaces til min comp og hvis jeg kører telnet på tcp/ip-porten og hyper terminal på rs232-porten virker det fint begge veje.

mit problem er at jeg ikke kan "lytte" på tcp/ip-porten i mit program, jeg har fundet det her kode:

// connect til server
TcpClient cli = new TcpClient("192.168.0.201", 23);
StreamWriter sw = new StreamWriter(cli.GetStream());
StreamReader sr = new StreamReader(cli.GetStream());
string line;
string[] parts;
           
// skriv til server
int a = 12;
int b = 34;
sw.WriteLine("ADD " + a + " " + b);
sw.Flush();
           
// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
parts = line.Split(" ".ToCharArray());
int c = int.Parse(parts[1]);
MessageBox.Show(c.ToString());
           
// skriv til server
string s = "abc";
sw.WriteLine("DUP " + s);
sw.Flush();
           
// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
parts = line.Split(" ".ToCharArray());
string s2 = parts[1];
MessageBox.Show(s2);
           
// disconnect
cli.Close();

(jeg har fundet det i en artikel herinde af arne_v)

det sender godt nok det første data (ADD 12 34) til pic'en og jeg ser det i min hyper terminal, men så crasher programmet...

hvordan får jeg den til at modtage det jeg sender ind på tcp/ip?

håber der er nogle kloge hoveder der kan hjælpe, for jeg er sq ved at køre død i det her..

på forhånd tak
Avatar billede spif2001 Nybegynder
09. august 2006 - 10:53 #1
Hvad er fejlbeskeden når programmet crasher?
Avatar billede majbom Novice
09. august 2006 - 11:20 #2
det holder bare op med at svare...

når jeg kalder funktionen og derefter åbner terminalvinduet, er den blå bar foroven stadig mørk, som om programmet "lå øverst" så går der lidt, så bliver den grålig som den skal, når jeg så vil lukke programmet siger den at programmet ikke svarer...
Avatar billede spif2001 Nybegynder
09. august 2006 - 11:45 #3
Lyder som om at du står her og venter:

// læs fra server og skriv resultat til skærm
line = sr.ReadLine();

Er du sikker på, at din PIC sender noget tilbage?

Sæt eventuelt en timeout på TcpClienten:

cli.ReceiveTimeout = 5000;
Avatar billede spif2001 Nybegynder
09. august 2006 - 11:46 #4
Prøv også at afbryde en eventuel kørende FireWall - både windows egen og din.
Avatar billede majbom Novice
09. august 2006 - 11:58 #5
ja, altså jeg står og venter, og pic'en svarer ikke lige med det samme (det er indtil videre mig selv der skal skrive i hyperterminalen før den svarer, så der går jeg lige et par sekunder...)
men en time out lyder bestemt som noget der kunne være løsningen, det prøver jeg lige...
hvor skal den stå?
Avatar billede spif2001 Nybegynder
09. august 2006 - 12:18 #6
Den er i millisekunder, så mit eksempel fra før venter i 5 sekunder.

Hvis der så går mere en 5 sekunder, får du en IOException, så du skal lige have en try catch a la:

TcpClient cli = null;
try
{
// connect til server
cli = new TcpClient("192.168.0.201", 23);
cli.ReceiveTimeout = 5000;
StreamWriter sw = new StreamWriter(cli.GetStream());
StreamReader sr = new StreamReader(cli.GetStream());
string line;
string[] parts;
         
// skriv til server
int a = 12;
int b = 34;
sw.WriteLine("ADD " + a + " " + b);
sw.Flush();
         
// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
parts = line.Split(" ".ToCharArray());
int c = int.Parse(parts[1]);
MessageBox.Show(c.ToString());
         
// skriv til server
string s = "abc";
sw.WriteLine("DUP " + s);
sw.Flush();
         
// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
parts = line.Split(" ".ToCharArray());
string s2 = parts[1];
MessageBox.Show(s2);
}
catch(IOException ex)
{
  MessageBox.Show("IO: " + ex.Message);
}
catch(Exception ex)
{
  MessageBox.Show("Generel: " + ex.Message);

finally
{
// disconnect
if(cli != null)
  cli.Close();
}
Avatar billede majbom Novice
09. august 2006 - 12:26 #7
så langt så godt, hvis jeg ikke sender noget tilbage, så kommer den godt nok med en exception, men hvis jeg svarer, inden de 5 sekunder, så crasher det...
Avatar billede spif2001 Nybegynder
09. august 2006 - 12:31 #8
hmm  måske syntes CLI den skal sende mere end du modtager med den ReadLine().

Prøv at bruge ReadToEnd() og se hvad der sker.
Avatar billede majbom Novice
09. august 2006 - 12:40 #9
det er stadig samme fejl... :S
Avatar billede spif2001 Nybegynder
09. august 2006 - 12:58 #10
hmm - kommer du til at sende en uendelig mængde data? - en eller anden løkke på CLI der kører uendeligt eller noget lignende?
Avatar billede majbom Novice
09. august 2006 - 13:05 #11
klienten (webpic'en) sender kun det jeg skriver i hyper terminal, så nej, det er ikke uendeligt...
Avatar billede spif2001 Nybegynder
09. august 2006 - 13:11 #12
Har du prøvet at skifte socket nummer? Prøv evt. et højt nummer a la 25555...
Avatar billede majbom Novice
09. august 2006 - 13:23 #13
portnummer ikke? cli = new TcpClient("192.168.0.201", ->23<-);

der nægter klienten forbindelse... har osse prøvet med 8000
Avatar billede spif2001 Nybegynder
09. august 2006 - 13:32 #14
du har ikke adgang til PIC tingens sourcekode, så du kan ændre portnummeret der også?

Det kan jo være at det portnummer bliver brugt af et andet program, på den PC du tester fra.
Avatar billede majbom Novice
09. august 2006 - 13:51 #15
jeg har lige prøvet på port 8000 - samme problem :(
Avatar billede spif2001 Nybegynder
09. august 2006 - 14:01 #16
dammit :) - jeg kan sgi ikke få øje på det...
Avatar billede majbom Novice
09. august 2006 - 14:04 #17
hmm fladt...

har tænkt på om det kunne være webpic'en, men igen, det virker jo fint igennem telnet og hyperterminal...
Avatar billede siz23 Nybegynder
09. august 2006 - 14:47 #18
ReadLine() vil forsætte med at læse indtil den møder en ny linje.
ReadToEnd() vil læse til slutningen af streamen.

Men møder readline et linje skift?
og slutter din stream?

bare min lille idé
Avatar billede majbom Novice
11. august 2006 - 08:16 #19
sorry jeg ikke lige har svaret men havde ikke set at der var kommet flere kommentare..

jamen jeg sender jo bare lidt forskellige karakterer fra min hyperterminal, et linjeskift, er det et "enter" der definerer et linjeskift eller?
Avatar billede majbom Novice
11. august 2006 - 08:36 #20
okay, jeg er kommet lidt længere:

når jeg sender lidt forskellige chars fra hyperterminalen og afslutter med 2 gang "enter" kommer der en fejlmeddelelse, hvor der står: "Generel: indekset lå uden for arrayets grænser"
Avatar billede spif2001 Nybegynder
11. august 2006 - 08:56 #21
Når du så fyrer den her af:

int c = int.Parse(parts[1]);

er det jo ikke sikkert at du har fået noget på en index plads 1.

"Generel: indekset lå uden for arrayets grænser" er fejlen hvis du prøver at tilgå det index, men at der ikke er noget i.
Avatar billede majbom Novice
11. august 2006 - 09:05 #22
okay, jeg postede et indlæg, men det må have været samtidig med dig spif2001, for den blev ikke sat ind, så jeg prøver igen:

har lavet koden om så den ser sådan ud:

// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
MessageBox.Show(line.ToString());

i stedet for sådan:

// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
parts = line.Split(" ".ToCharArray());
int c = int.Parse(parts[1]);
MessageBox.Show(c.ToString());

og nu virker det, jeg skal dog trykke enter 2 gange i terminalvinduet, men det er lige meget

kan i ikke smide svar begge 2, så kan i dele de 200p, det var trods alt siz23 der kom med den enter-ide, men spif har osse hjulpet en del i starten :)
Avatar billede spif2001 Nybegynder
11. august 2006 - 09:26 #23
ok :) - godt du fik det i gang.
Avatar billede majbom Novice
11. august 2006 - 09:45 #24
hmm måske du kunne hjælpe lidt mere :)

nu ser koden således ud:

TcpClient cli = null;
try
{
// connect til server
cli = new TcpClient("192.168.0.201", 8000);
cli.ReceiveTimeout = 5000;
StreamWriter sw = new StreamWriter(cli.GetStream());
StreamReader sr = new StreamReader(cli.GetStream());
string line;
string line1;

// skriv til server
int a = 12;
int b = 34;
sw.WriteLine("ADD " + a + " " + b);
sw.Flush();

// læs fra server og skriv resultat til skærm
line = sr.ReadLine();
MessageBox.Show(line.ToString());

// skriv til server
string s = "abc";
sw.WriteLine("DUP " + s);
sw.Flush();

// læs fra server og skriv resultat til skærm
line1 = sr.ReadLine();
MessageBox.Show(line1.ToString());
}
catch (IOException ex)
{
MessageBox.Show("IO: " + ex.Message);
}
catch (Exception ex)
{
MessageBox.Show("Generel: " + ex.Message);
}
finally
{

// disconnect
if (cli != null)
cli.Close();
}

men når jeg har modtaget det jeg først sender tilbage, så sender programmet anden gang "DUP abc" og når jeg "svarer" på den, kommer programmet op med messageboxen ved den første karakter der bliver skrevet i terminalvinduet, og er tom...

synes ikke umiddelbart at det giver mening når jeg skal trykke enter 2 gange første gang...
Avatar billede spif2001 Nybegynder
11. august 2006 - 09:55 #25
Det lyder altså lidt som om, at der er uenighed om, hvornår de to programmer henholdsvis sender og modtager.

Sådan som du beskriver det, må der være noget galt med den protokol der er sat op.

Gennemgå protokollen minutiøst, så du / i er 100% sikre på hvad der bliver sendt / modtaget hvornår, og hvad der skal til for at protokollen kommer videre.
Avatar billede majbom Novice
11. august 2006 - 09:59 #26
jamen indtil videre er det jo mig der leger PIC via terminalen og når jeg modtager den første besked, sender jeg noget og trykker enter 2 gange, i programmet kommer der en messagebox, med hvad jeg har sendt fra terminalen og når jeg trykker ok i den, sender den næste besked (DUP abc) som terminalen modtager. og så snart jeg trykker en hvilken som helst tast i terminalen, kommer messageboxen op i programmet...
Avatar billede spif2001 Nybegynder
11. august 2006 - 11:29 #27
Jeg tror ikke rigtig du kan få hjælp herindefra til det.

Du skal vidst bare bakse med den kode og protokol indtil den virker. Try and try again ;)
Avatar billede majbom Novice
11. august 2006 - 11:33 #28
ja, det var osse bare noget testkode, jeg har fjernet anden halvleg, så jeg bruger kun første send/modtag og så virker det egentlig som det skal...

satser lige på at siz23 lige smider et svar...
Avatar billede siz23 Nybegynder
11. august 2006 - 13:06 #29
heh, synes ikke lige de 5 linjer var et svar værd, så du for lige lidt extra.

p.s. har ikke lige en compiler til at checke efter syntax fejl mm. men skulle værre til at finde ud af.
og kan nok også laves på en pænnere måde :D
men burde løse dit enter problem, og dit enter problem kan opstå fordi "enter" på din telnet ikke er en windows enter, fx. bruger windows #13#10 (eller #10#13, kan aldrig huske :=) som enter. og din telnet bruger måske det #10#13 hvilket vil sige at du vil værre nødtil at lave 2 x enter for at få windows kode for ENTER. Håber det giver mening har desvære ikke så meget tid, så bliver en lidt rodet reply. /soz

            string s;
            StreamReader sr = new StreamReader(cli.GetStream());
            while (true)
            {
                if (sr.Peek() >= 0)
                {
                    label1.Text = "modtager data";
                    if (sr.Peek() == 13)
                    {
                        //enter fundet afbryd lykken
                        s += "\n"; //tilføj et enter tegn til din streng
                        break;
                    }
                    s += sr.Read();
                }
                else
                {
                    label1.Text = "klar til at modtage mere data";
                    Application.DoEvents(); //køre beskeder der ligger i msg loop, bla. så windows ikke tror dit program er dødt.
                }
            }
Avatar billede majbom Novice
11. august 2006 - 13:19 #30
hehe takker siz23, jeg kigger på det :)

og god weekend til jer begge!
Avatar billede spif2001 Nybegynder
11. august 2006 - 13:28 #31
I lige måde.
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