Schrift
[thread]4430[/thread]

Socket Problem mit localhost: use Socket

Leser: 2


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2006-07-04 05:15
#37305 #37305
So, da es schon so spät ist will ich mich vorerst mal kurz fassen.

Ich habe mir ein kleines Programm mit use Socket; geschrieben.

Wenn ich von einem anderen Rechner per telnet oder php connecte funktioniert alles wunderbar.

Wenn ich aber auf dem gleichen Server mit telnet localhost 2728 connecte, dann bricht er irgendwo im script ab.
Wenn ich per PHP auf dem gleichen Server connecte braucht er ~2 Minuten bis er eine Fehlermeldung ausspuckt.

Nochn bissl Quellcode:
Quote
# create a socket, make it reusable
socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1) or die "setsock: $!";

# grab a port on this machine
my $paddr = sockaddr_in($port, INADDR_ANY);

# bind to a port, then listen
bind(SERVER, $paddr) or die "bind: $!";
listen(SERVER, 5) or die "listen: $!";
print "SERVER started on port $port\n";
esskar
 2006-07-04 06:45
#37306 #37306
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi;
lauffähig ist dein code aber nicht;
wie wäre es mit etwas, was ich einfach ausführen muss, damit ich direkt sehe wo's hackt!

PS: willkommen bei der perl-community.de
renee
 2006-07-04 09:58
#37307 #37307
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gibt's ne Fehlermeldung?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
in2fire
 2006-07-04 14:50
#37308 #37308
User since
2006-07-04
6 Artikel
BenutzerIn
[default_avatar]
Ja war gestern ein bissl spät.

Also das ist jetzt die Stelle, an der er sich aufhängt.
Wenn ich mich mit telnet über localhost einlogge, dann kommt nach der Loginabfrage nichts mehr und mit PHP sagt er mir, dass ich mich nicht eingeloggt habe.

Quote
while ($client_addr = accept(CLIENT, SERVER)) {

#add ip to logfile
my ($client_port, $client_ip) = sockaddr_in($client_addr);
my $client_ipnum = inet_ntoa($client_ip);
#print LOGFILE "connection from: [$client_ipnum]\n";

while (<CLIENT>) {
recv (CLIENT, $output, 1024, 0);
@output_a = split(" ",$output);
if (!$output_a[0]) {
$output_a[0] = $output;
};

#add command to logfile
#print LOGFILE "$output\n";

if ($output_a[0] eq "login") {
if ($output_a[1] eq $password) {
$login = 1;
send(CLIENT,"erfolgreich eingeloggt<br>\n",100,0);
};
};

if ($login != 1) {
send(CLIENT,"login: $output_a[0] $output_a[1] \n",100,0);
#Sie haben sich nicht eingeloggt. Beende Verbindung.\n
sleep(1);
close CLIENT;
last;
};



P.S. macht ja nen netten Eindruck die Community hier :).\n\n

<!--EDIT|in2fire|1152010284-->
betterworld
 2006-07-04 15:01
#37309 #37309
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Also mit <CLIENT> liest Du eine Zeile ein und mit recv einen Block. Das Problem ist, dass das Zeilenlesen gepuffert ist, d. h. es wird ein großer Block eingelesen und davon die erste Zeile zurueckgegeben. Dieser Block steht dem recv danach nicht mehr zur Verfuegung.

Wenn Du Dich lokal von demselben Server aus verbindest, kommt die zweite Zeile wahrscheinlich viel schneller nach der ersten an, sodass sie mit in dem Puffer landet.

Als Faustregel gilt, dass man nie gepufferte Sachen mit ungepufferten Sachen mixen soll.

Ferner frage ich mich, warum Du die Eingabe output nennst und nicht input. [s]Außerdem ist das erste Argument an split immer ein regulärer Ausdruck. Der sollte der besseren Lesbarkeit zuliebe mit / / begrenzt sein und nicht mit " ".[/s]

Uebrigens gibt es auch CPAN:IO::Socket::INET. Das ist weitaus komfortabler zu bedienen als die socket-Funktion und Konsorten.

Ferner beachte bitte immer noch dein Beitrag von esskar: Dein Code ist nicht ohne weiteres ausfuehrbar. Bitte poste das nächste Mal auch die use-Zeilen am Anfang, damit wir ohne Mühe testen koennen.\n\n

<!--EDIT|betterworld|1152053616-->
in2fire
 2006-07-04 15:27
#37310 #37310
User since
2006-07-04
6 Artikel
BenutzerIn
[default_avatar]
Hmmm klingt logisch prima danke.

Kann ich die Zeile recv (CLIENT, $output, 1024, 0);
irgendwie durch
$output = $_; ersetzen?
Oder wie lese ich einzelne Zeilen, statt einem Block ein?


$output habe ich einfach von einem anderem Programm übernommen.

Diese Splitsyntax kommt von meinem PHP gecode. Ich wechsle immer wieder zwischen diesen beiden Sprachen.

IO::SOCKET::INET habe ich auch schon probiert. Bin damit aber irgendwie nicht zurande gekommen, obwohl es einfacher sein soll.


Und ich muss zugeben, dass ich kein Buch über die Socketprogrammierung besitze.
Ich habe mich an den dürftigen Codeschnipseln im Internet orientiert und solange rumprobiert, bis es geklappt hat.
Von gepuffert und ungepuffert stand dort niergends was.\n\n

<!--EDIT|in2fire|1152012640-->
betterworld
 2006-07-04 18:54
#37311 #37311
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=in2fire,04.07.2006, 13:27]Kann ich die Zeile recv (CLIENT, $output, 1024, 0);
irgendwie durch
$output = $_; ersetzen?[/quote]
Wenn Du ueber einen Editor verfuegst, solltest Du das irgendwie koennen.
esskar
 2006-07-04 18:55
#37312 #37312
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=in2fire,04.07.2006, 13:27]Kann ich die Zeile recv (CLIENT, $output, 1024, 0);
irgendwie durch
$output = $_;  ersetzen?
Oder wie lese ich einzelne Zeilen, statt einem Block ein?[/quote]
kannst auch gleich
Code: (dl )
while ($output = <CLIENT>) {


sagen.

btw.
benutzt du use strict; und use warnings;
Dubu
 2006-07-05 00:26
#37313 #37313
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=betterworld,04.07.2006, 13:01]Außerdem ist das erste Argument an split immer ein regulärer Ausdruck.  Der sollte der besseren Lesbarkeit zuliebe mit / / begrenzt sein und nicht mit " ".[/quote]
Aber ein split " ", ... (mit einem Leerzeichen) hat eine besondere Bedeutung und ist nicht das Gleiche wie split / /, .... Das kann hier durchaus so gemeint sein. Siehe perldoc -f split.
betterworld
 2006-07-05 02:51
#37314 #37314
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Dubu,04.07.2006, 22:26][quote=betterworld,04.07.2006, 13:01]Außerdem ist das erste Argument an split immer ein regulärer Ausdruck. Der sollte der besseren Lesbarkeit zuliebe mit / / begrenzt sein und nicht mit " ".[/quote]
Aber ein split " ", ... (mit einem Leerzeichen) hat eine besondere Bedeutung und ist nicht das Gleiche wie split / /, .... Das kann hier durchaus so gemeint sein. Siehe perldoc -f split.[/quote]
Oh... dann entschuldigt bitte meinen falschen Kommentar.\n\n

<!--EDIT|betterworld|1152053505-->
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-07-04 05:15.