[perl] server socket bind probleem

Pagina: 1
Acties:

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 08:01
Volgend stukje code komt uit een eenvoudig server programma
(het is gewoon een socket die alles uitprint wat je er naar toe stuurt,
of dat is toch de bedoeling :) )
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Socket;

my $poort = 8888;
#my $max = "1";

foreach (@ARGV) {
    if (/=/) {
        ($optie, $waarde) = split(/=/);
    if (lc($optie) eq "max") { $max = $waarde;}
    elsif (lc($optie) eq "poort") { $poort = $waarde;}
    }
}

# we openen een socket
socket(LUISTER, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die "kan geen socket starten!";

# binden van de socket aan het opgegeven poortnummer
bind(LUISTER,sockaddr_in($poort,INADDR_ANY)); || die "fout bij binden poort aan socket!";
...


Als ik deze code uitvoer loopt alles normaal, geen van de 'die'
boodschappen duiken op. Wil ik echter connecten op deze socket
dan wordt die nooit gevonden... niet met mijn perl client en ook
niet met een telnet applicatie.

Nochtans komt deze code uit een van mijn oudere programma's waar
die wel werkte (is gewoon copy/paste). Het enige verschil tussen de
nieuwe en oude code is dat in de oude code de gewenste poort voor
het serverproces werd ingelezen met een <STDIN> instructie ipv via
de CLI.

Verder heb ik vanalles geprobeerd... de "" weggehaald bij de standaardwaarde
van $poort, vervangen door ' ',... etc. maar niets hielp tot nu toe.

Ben ik beter af met het lezen van mijn poort door <STDIN>? (denk
zelf van niet, want ik weet dat die foreach (@ARGV) constructie
werkt, die komt ook uit een oud programma van mij).

Clowns to the left of me, Jokers to the right


  • Grum
  • Registratie: Juni 2001
  • Niet online
bind(LUISTER,sockaddr_in($poort,INADDR_ANY)); || die "fout bij binden poort aan socket!";

Dat klopt iig al niet :D

Tis namelijk behoorlijk identiek aan:

code:
1
2
bind(LUISTER,sockaddr_in($poort,INADDR_ANY)); # <=========
die "fout bij binden poort aan socket!";


Nu kan je zelf wel raden dat dit altijd 'died' :D

[ Voor 55% gewijzigd door Grum op 30-11-2002 12:33 ]


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

code:
1
2
3
4
5
socket(LUISTER, PF_INET, SOCK_STREAM, getprotobyname('tcp'))
    || die "kan geen socket starten!";
#wtf doet die puntkomma (;) aan het eind van de volgende regel?
bind(LUISTER,sockaddr_in($poort,INADDR_ANY))[b][u];[/u][/b]
    || die "fout bij binden poort aan socket!";


edit:
Oh... te laat }:O

[ Voor 35% gewijzigd door muba op 30-11-2002 15:41 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 08:01
mja die ; stond daar niet voor niets... ik had namelijk geprobeerd om die 'die' boodschap in comments te zetten dus met # ervoor... toen dat ook niet werkte heb ik dit bericht opgesteld en de boel gecopy/paste. Ik heb waarschijnlijk die # verwijderd maar de ; ervoor even over het hoofd gezien :)

nuja, heb ondertussen mijn code nog wat opgeschoond
(dus gekeken naar ; en # en zo), maar het werkt nog altijd niet :(

Clowns to the left of me, Jokers to the right


Verwijderd

Misschien dat je het regeltje bewust hebt weggelaten in het example maar moet er niet nog een regeltje bij voordat de socket daadwerkelijk luistert? Zie regeltje hieronder. De rest ziet er volgens mij zo op het eerste gezicht wel redelijk uit behalve de opmerkingen die hierboven al zijn geplaatst.

code:
1
2
3
listen(LUISTER, $max);
of
listen(LUISTER, SOMAXCONN);


Zo even uit de losse pols hoor ik heb er even een example bijgepakt van mezelf maar tis wel wat anders dan jouw code.

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 08:01
ok dat was het dus 8)7

de listen() ontbrak

klassiek geval van verkeerd copy/pasten van oude code ;)

bedankt voor de tip _/-\o_

Clowns to the left of me, Jokers to the right

Pagina: 1