Mailinglisten-Archive |
Hallo Listianer, ich habe vor kurzem ein Projekt aufs Auge gedrückt bekommen bei dem über sockets mit einem Gerät kommuniziert wird. Dieses Gerät liefert Temperaturwerte zurück welche anschließend als Grafik ausgegeben werden. Soweit hat an der Stelle auch alles funktioniert. Jetzt häufen sich die Probleme das die Verbindung immer wieder "abreist" und erst nach einem Neustart wieder aufgebaut werden kann. Es ist jedoch kein Muster zu erkennen, da es an manchen Tagen auch wieder stabil läuft. Alle Kunden welche das Problem haben, haben openSuSE 10.3 im Einsatz welche PHP 5.2.5 mitbringt. Kunden bei denen es bisher keine Probleme gab, laufen unter PHP openSuSE 10.2 mit PHP 5.2. Alle anderen Software und Hardwarekomponenten sind identisch. Dazu kommt noch, das sich meine Erfahrungen mit sockets doch eher in Grenzen halten. ;-) Ist irgendjemandem bekannt ob es in diesen beiden Versionen gravierende Unterschiede gibt, was das socket handling angeht? Hier ist auch noch der Code welcher den Socket aufbaut bzw. vom Socket liest. Vielleicht erkennt ja auch wer den Fehler oder hat damit Erfahrungen Grüße Alex Der connect: function connect_as_client () { $this->trace ('Connect as client'); // Sequenzen und Socket zurück setzen !! $this->socket = NULL; $this->last_seq = 0; // letzte versendete Sequenz Nummer; wird erhöht bei jedem Frame Austausch $this->last_ack = 0; // letzte bestätigte Sequenz $this->socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); if (!$this->socket) { $this->error ("Socketfehler :".socket_strerror ($this->socket)); // halt(); return FALSE; } $this->trace ('socket = '.$this->socket); $this->trace ('try connect to '.$this->adress.':'.$this->port); socket_set_nonblock ($this->socket); $loops = 0; $ok = FALSE; while ($loops++ < 100) { // 2 Sekunden probieren $ret = socket_connect ($this->socket, $this->adress, $this->port); $this->trace ('socket_connect = '.$ret); if ($ret > 0) { $this->trace ('socket = '.$ret); $ok = TRUE; break; } $this->trace ('loop '.$loops); usleep (20000); // wartet 1/50 Sekunde } socket_set_block ($this->socket); $this->trace ('ret = '.$ret); if ($ret <= 0) { $this->error ("socket_connect() fehlgeschlagen: Grund: " . socket_strerror (socket_last_error())); $this->disconnect(); return FALSE; } return TRUE; } Das lesen: function read_frame () { $this->trace ('start read_frame'); $buffer = NULL; $i = 0; do { $i++; $read = socket_read ($this->socket, 1024); $buffer .= $read; $seq_start_pos = strpos ($buffer, pack ("v", FRAME_SEQ_START)); $seq_end_pos = strpos ($buffer, pack ("v", FRAME_SEQ_ENDE)); usleep (100); } while ((($seq_start_pos === FALSE) or ($seq_end_pos === FALSE)) and ($i < 100)); // insgesamt 1/100 Sekunde wird gelesen if (($seq_start_pos === FALSE) or ($seq_end_pos === FALSE)) $buffer = NULL; else $buffer = substr ($buffer, $seq_start_pos, $seq_end_pos + 2); $this->trace ('end read_frame'); return $buffer; // $buffer = NULL, wenn nichts gelesen werden konnte }
php::bar PHP Wiki - Listenarchive