Schreiben Sie einen sockel und Umgang mit Defekten Rohrleitungen
Habe ich ein code in PHP, eine Verbindung zu einem socket. Ich habe immer eine Pfeife, die nur zeitweise während des Schreibens. Die Probleme scheint zu gehen Weg, wenn schreiben an das Rohr wieder. Ich Frage mich, was ' s benötigt (der sicherste Weg), um sich zu erholen. Ich bin auch gefragt, ob socket_write zurückgeben kann, ohne das schreiben der vollständigen Zeichenfolge, die übergeben wurde, hinein. Hier ist, was ich derzeit habe.
function getSocket() {
$socket = socket_create( AF_UNIX, SOCK_STREAM, 0 );
if ( $socket === FALSE ) {
throw new Exception(
"socket_create failed: reason: " . socket_strerror( socket_last_error() ));
}
}
$result = socket_connect($socket, $address);
if ($result === false) {
throw new Exception("socket_connect() failed.\nReason: ($result) " .
socket_strerror(socket_last_error($socket)));
}
return $socket;
}
function writeSocket($stmt) {
$tries = 0;
$socket = getSocket();
do {
//Is is possible that socket_write may not write the full $stmt?
//Do I need to keep rewriting until it's finished?
$writeResult = socket_write( $socket, $stmt, strlen( $stmt ) );
if ($writeResult === FALSE) {
//Got a broken pipe, What's the best way to re-establish and
//try to write again, do I need to call socket_shutdown?
socket_close($socket);
$socket = getSocket();
}
$tries++;
} while ( $tries < MAX_SOCKET_TRIES && $writeResult === FALSE);
}
InformationsquelleAutor Juan Mendes | 2011-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Q1. Ich Frage mich, was ' s benötigt (der sicherste Weg), um sich zu erholen.
A: Das hängt von der Anwendung ab. Der socket-listener ist, schließen Sie die Verbindung, oder die Sie sich gesetzt haben-socket-Optionen, die Sie nicht zeigen, Sie uns. Wie Sie sich mit jeder dieser Dinge hängt von der Semantik der Anwendung.
Q2. Ich bin auch gefragt, ob socket_write zurückgeben kann, ohne das schreiben der vollständigen Zeichenfolge, die übergeben wurde, hinein.
A: Ja.
socket_write()
schreiben kann keine bytes, einige der bytes, oder alle bytes vor der Rückkehr. Wenn gibt es einen Wert größer als null, aber weniger als die Länge der Eingabe, stellen Sie offsets (vielleicht mitsubstr()
). Wenn es null oder weniger, überprüfensocket_last_error()
für Hinweise, ob es sich wiederholen kann. Diese Verdrehung ist bedeckt in der Anleitung.Die Dokumentation für socket_write() bietet keine solche Garantie.
InformationsquelleAutor geocar
Haben Sie versucht, die Einstellung SO_KEEPALIVE oder SO_SNDTIMEO? Sie könnte auch test in der Schleife für die Länge des Puffers, um zu sehen, wenn das ganze gesendet wurde.
Glück und HTH,
-- Joe
Was ist der Fehler, der immer wieder?
Warnung: Ein Fehler wurde erkannt, der verhindert das laden dieser Seite. Wenn das problem weiterhin besteht, Kontaktieren Sie bitte den administrator der website. socket_write() [<a href='function.socket-write'> - Funktion.socket-write</a>]: unable to write to socket [32]: Broken pipe application/classes/cci/DataSrv.php
InformationsquelleAutor Mindfulgeek
Verwenden
socket_set_nonblock()
und fixieren Sie Ihrewhile
Aussage:$writeResult === FALSE
sollte$writeResult !== FALSE
statt.InformationsquelleAutor Narf