Socket Verbindung zu Delphi TServerSocket

Socket Verbindung zu Delphi TServerSocket

am 17.10.2007 17:12:10 von berny

Hi,

möchte aus einem PHP Script mit socket_write eine Delphi Anwendung mit
TServerSocket ansprechen. Das PHP Script meldet keine Fehler beim
anlegen, öffnen, schreiben und schliessen der Socket, in der Delphi
Anwendung kommt aber nichts rein, auch kein OnClientConnect?!

PHP script:

error_reporting (E_ALL);
echo "

TCP/IP Verbindung

\n";
$service_port = 1111;
$address = '192.168.178.20';
$socket = socket_create (AF_INET, SOCK_STREAM, TCP);
if ($socket < 0) {
echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror
($socket) . "\n";
} else {
echo "socket_create() OK.\n";
}
echo "
";
echo "Versuche, eine Verbindung zu '$address' auf Port '$service_port'
aufzubauen ...";
echo "
";
$result = socket_connect ($socket, $address, $service_port);
if ($result < 0) {
echo "socket_connect() fehlgeschlagen.\nGrund: ($result) " .
socket_strerror($result) . "\n";
} else {
echo "socket_connect() OK.\n";
}
echo "
";
$in = "Hello";
$out = '';
echo "Einen Request senden ...";
echo "
";
socket_write ($socket, $in, strlen ($in));
echo "socket_write OK.\n";
echo "
";
echo "Die Antwort lesen:\n\n";
while ($out = socket_read ($socket, 2048)) {
echo $out;
}
echo "
";
echo "Den Socket schliessen ...";
socket_close ($socket);
echo "
";
echo "socket_close OK.\n\n";
?>

Wie stelle ich es an das bei der TServerSocket was ankommt?

Grüsse,
Berny

Re: Socket Verbindung zu Delphi TServerSocket

am 17.10.2007 20:59:32 von dafox

berny schrieb:

> möchte aus einem PHP Script mit socket_write eine Delphi Anwendung mit
> TServerSocket ansprechen. Das PHP Script meldet keine Fehler beim
> anlegen, öffnen, schreiben und schliessen der Socket, in der Delphi
> Anwendung kommt aber nichts rein, auch kein OnClientConnect?!

So kann das nicht funktionieren. Warum verwendest du überhaupt die
Socket-Extension, anstatt einfach Streams zu nehmen? Hast du überhaupt
mal ins Handbuch geschaut?

> > error_reporting (E_ALL);
> echo "

TCP/IP Verbindung

\n";
> $service_port = 1111;
> $address = '192.168.178.20';
> $socket = socket_create (AF_INET, SOCK_STREAM, TCP);
^^^
Hier sollte dir eine Notice und anschliessend wahrscheinlich eine
Warning um die Ohren fliegen. Der dritte Parameter muss ein Integer
sein, kein String. Die Konstante heisst SOL_TCP.



> if ($socket < 0) {

Was ist das für ein Quatsch? $socket ist kein Integer, also macht es
keinen Sinn die Variable hier mit einer Zahl zu vergleichen. Du suchst

if(is_resource($socket)) {

oder verkürzt

if(!$socket) {

Dein Vergleich führt dazu, dass *immer* der else-Zweig ausgeführt wird,
da $socket in keinen Fall kleiner als 0 ist, bzw. in *keinem* Fall zu
einem Integer gecastet wird, der kleiner als 0 ist.




> echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror
> ($socket) . "\n";

Das funktioniert an dieser Stelle nicht aus zwei Gründen nicht:

1. socket_strerror() erwartet als ersten Parameter einen Integer und
keine Resource. Du musst hier zunächst socket_last_error() nutzen und
die Rückgabe der Funktion an socket_strerror() übergeben.

socket_strerror(socket_last_error($socket))

2. Sollte das Erzeugen des Sockets mit socket_create() fehlschlagen,
dann ist $socket keine Resource, sondern bool'sch false. Du kannst
also bei einem Fehler von socket_create() nicht diese Funktionen
verwenden.





> } else {
> echo "socket_create() OK.\n";
> }
> echo "
";
> echo "Versuche, eine Verbindung zu '$address' auf Port '$service_port'
> aufzubauen ...";
> echo "
";
> $result = socket_connect ($socket, $address, $service_port);
> if ($result < 0) {

Siehe oben. Es wird auch hier immer der else-Zweig ausgeführt.

> echo "socket_connect() fehlgeschlagen.\nGrund: ($result) " .
> socket_strerror($result) . "\n";
> } else {
> echo "socket_connect() OK.\n";
> }

[...]

> Wie stelle ich es an das bei der TServerSocket was ankommt?

Du solltest einfach die Fehler ausmerzen. Ich kann nicht glauben, dass
du mit error_reporting(E_ALL) keine Fehlermeldungen gesehen hast.

Ist "display_errors" in der PHP-Konfiguration aktiviert?

Davon abgesehen würde ich hier, wie bereits erwähnt, auf die Extension
verzichten und einfach einen Stream erzeugen:

$address = 'tcp://192.168.178.20:1111';
$timeout = 5;

// Client-Socket erzeugen
if(!$socket = fsockopen($address, $errno, $errstr, $timeout)) {
exit("Error connecting to $address. Reason: $errstr");
}

// Request senden - Ein Fehler hier ist enorm selten
if(!fwrite($socket, 'Hello')) {
exit("Error writing on socket.");
}

// Response empfangen
while($data = fread($socket, 2048)) {
echo $data;
}

// Verbindung trennen
fclose($socket);
?>