PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : broken pipe bei socket-verbindung (php<->perl)



AceTheFace
07-04-2004, 19:08
Hi,

Habe auf ner Website ein php-script welches über einen socket zu einem perl script connected. Nun soll nach dem php connected ist, das perl-script zeichen zurück schicken.
Leider bekomme ich aber, sobald ich mit perl versuche etwas über den socket zu schicken "Datenübergabe unterbrochen (broken pipe)". Keine Ahnung was ich falsch mache bei dem Perl-Script. Simuliere ich das perl-script mit netcat, klappt das zurückschicken einwandfrei.

Hier mal das perl-script:



#!/usr/bin/perl
use IO::Socket;
$sock = IO::Socket::INET->new(
Listen => 1,
LocalPort => 8005,
Proto => 'tcp') or die "ERROR!!";

print "waiting for client...\n";

while(true) {
$client = $sock->accept();
while (<$client>) {
print $_;
#umbrueche rausschneiden
while ( (index($_,"\r") >= 0) || (index($_,"\n") >= 0) ){ chop($_); }

if ($_ eq "PING") {
print "PONG\n";
print $sock "PONG\n"; #<<----hier tritt der Fehler auf
}
}
}


Hier mal noch das php-script:



if ($fp = fsockopen($url,$port,$errno,$error,5)) {
echo "<p>connected</p>";
fwrite($fp, "PING\r\n");
while (!feof($fp)) {
$buffer = fgets($fp);
echo $buffer;
}
fclose($fp);
}
else {
echo "Connecting rp_client on $url Port $port failed...";
}


Gruß und danke,

Ace

AceTheFace
08-04-2004, 16:42
Hab per google gefunden wie man das wohl richtig macht ;)




#!/usr/bin/perl
use Socket;

# use port 8005 as default
my $port = shift || 8005;
my $proto = getprotobyname('tcp');

# 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, SOMAXCONN) or die "listen: $!";
print "SERVER started on port $port ";

# accepting a connection
my $client_addr;
while ($client_addr = accept(CLIENT, SERVER))
{
# send them a message, close connection
print CLIENT "Smile from the server";
close CLIENT;
}


Nun geht's!

Gruß,

Ace

Badsteve
08-04-2004, 19:12
hi,

du hättest in deinem ersten Beispiel einfach nur das $sock in der Betreffenden Zeile durch $client ersetzen müssen.

Btw. nutz chomp statt der while-Schleife mit chop, denn du kannst sicher sein, dass immer eine Zeile gelesen wird und chomp entfernt nur Newlines.



while($client = $sock->accept()) { ... ; close $client}


würde ich auch noch empfehlen.

Steve

PS Hast du einen Grund warum du nicht "use strict;" benutzt?