phpbar.de logo

Mailinglisten-Archive

[php] Unterschiede bei sockets in PHP 5.2 und 5.2.5?

[php] Unterschiede bei sockets in PHP 5.2 und 5.2.5?

Alex Haeussel php at haeussel.net
Mon Jan 19 11:53:45 CET 2009


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