Socket Verbindung unter LINUX
Shaheen
- programmiertechnik
Hi,
ich habe unter SuSE über xinetd eine neue Socket-Verbindung auf einem bestimmten Port konfiguriert, die einfach ein Shell-Script aufruft, welcher etwas ausgibt, z. B. echo "gelungen".
Von einem andren Rechner aus mittels PHP (fsockopen, fgets) habe ich anschl. eine Verbindung zu diesem Rechner unter dem freigeschalteten Port geöffnet und auch wirklich "gelungen" zurückgeliefert bekommen.
Meine Frage ist, wie kann ich eigene Argumente über die Socket-Verbindung an den Shellscript senden, dort auswerten und entsprechend eine Antworte zurücksenden?
Schönen Dank im Voraus für jeden Vorschlag!
Gruß
Shaheen
Hallo Shaheen,
ich habe unter SuSE über xinetd eine neue Socket-Verbindung auf einem bestimmten Port konfiguriert, die einfach ein Shell-Script aufruft, welcher etwas ausgibt, z. B. echo "gelungen".
Nein, du hast keine Socket-Verbindung konfiguriert, sonder das xinetd-Programm selber, welches sich um die Sockets kümmert. Dein Shellscript merkt davon gar nichts, stdin und stdout werden halt nur mal eben übers Iternet geschickt ;)
Von einem andren Rechner aus mittels PHP (fsockopen, fgets) habe ich anschl. eine Verbindung zu diesem Rechner unter dem freigeschalteten Port geöffnet und auch wirklich "gelungen" zurückgeliefert bekommen.
cool, ne? Das gleiche, nur etwas komplizierter habe ich vor einiger Zeit auch programmiert: Serverseite ein perl-PRogramm über xinetd, Clientseite ein PHP-Script. Können wunderbar nun miteinander kommunizieren (ich habe ein spezielles Protokoll dafür geschrieben).
Meine Frage ist, wie kann ich eigene Argumente über die Socket-Verbindung an den Shellscript senden, dort auswerten und entsprechend eine Antworte zurücksenden?
Hier mal ein (kleiner) Ausschnitt aus dem PHP-Programm:
function GetOneLine($fh) {
$data = fgets($fh, 230);
if(strlen($data) == 0 || $data == "\n") {
print "(skipping blank line)\n";
return '100 {Blank Line}';
}
print "<b>></b> $data";
return $data;
}
function SayLine($text, $encrypt=false) {
#if(substr($text, 0, -1) != "\n") $text .= "\n"; // mit Leerzeile abschließen...
global $nsock;
$text = rtrim($text)."\n";
print '<b><</b> '.($encrypt && !$GLOBAL['protodebug'] ? str_repeat('*', strlen($text))."\n" : $text);
$r = fwrite($nsock, $text);
return !$r ? die("<p><b>Fehler beim Schreiben ins Netzwerksocket!</b> (Text [$text] returned $r)</p>") : $r;
}
Die Idee bei Sockets ist ja, dass man Netzwerkverbindungen wie Filehandles behandelt. Also lassen sich die ganzen f*()-"Tools" verwenden :)
Grüße,
Sven
Hallo Sven,
schönen Dank dafür, clientseitig das Senden scheint zu klappen, kannst du mir auch zeigen, wie es serverseitig bei meinem offenen Socket im Shellscript das Auslesen der übermittelten Daten funzt. Ich komme leider nicht auf die richtige Idee.
Schönen Dank!
Gruß
Shaheen
Hallo Shaheen,
schönen Dank dafür, clientseitig das Senden scheint zu klappen, kannst du mir auch zeigen, wie es serverseitig bei meinem offenen Socket im Shellscript das Auslesen der übermittelten Daten funzt. Ich komme leider nicht auf die richtige Idee.
während das PHP-Script auf der Clientseite dank Verwendung von (C/PHP-)Sockets (anders geht es wohl auch nicht ;) die Ein/Ausgabe wie ein Dateihandle verwerten kann, geht es auf der Seite des Programmes, welches durch xinetd aufgerufen wurde, schlicht und einfach über den Standard Ein/Ausgabekanal (stdin und stdout). Das heißt also:
PHP-Script schreibt Daten in => Netzwerk => Xinetd => Daten kommen beim Programm im
das Filehandle (= socket) (Server) stdin an
und andersrum:
Programm schreibt ins => Xinetd => Netzwerk => PHP-Script kann Datenhandle
stdout belauschen
Das ist ja der nette Vorteil von Xinetd: Man braucht sich beim Endprogramm überhauptnicht mehr um das Netzwerk kümmern - alles kommt über stdin und stdout an oder geht raus. Ein simples Shellscript also z.B.:
#!/bin/sh
echo Hallo, ich bin das Shellscript. Wenn Xinetd so eingerichtet
echo wurde, dass er z.b. für dieses Programm an Port 9700 lauscht,
echo so kann man sich per Telnet daran verbinden und schwupps kriegt
echo man diesen Text hier.
echo
echo Gebe jetzt bitte mal etwas ein:
read EINGABE
echo Sie gaben $EINGABE ein. Sehr schön ;)
So einfach ist es :)
Grüße,
Sven
sehr schön, das Empfangen klappt, jedoch kann ich per echo Befehl nicht zurücksenden über Shell-Script. Der PHP-Client empfängt nichts zurück. Wie kann ich den echo Befehl aufbauen?
Danke!
Gruß
Shaheen