Änderung bei PHP-Sockets unter 4.0?

Moin Paresy,

ich muss meine Peaq-Multiroom-Lautsprecher per DLNA-Discovery im Netzwerk suchen. Dafür habe ich unter 3.4 folgendes Skript benutzt, das eine Liste mit allen UPnP-Devices zurückgibt:


<?
#$st = "urn:schemas-pure-com:service:RTSPGateway:1";
$st = "ssdp:all";
$mx = 2;
$man = 'ssdp:discover';
$from = null;
$port = null;
$sockTimout = '10';

$USER_AGENT = 'MacOSX/10.8.2 UPnP/1.1 PHP-UPnP/0.0.1a';
		// BUILD MESSAGE
		$msg  = 'M-SEARCH * HTTP/1.1' . "
";
		$msg .= 'HOST: 239.255.255.250:1900' ."
";
		$msg .= 'MAN: "'. $man .'"' . "
";
		$msg .= 'MX: '. $mx ."
";
		$msg .= 'ST:' . $st ."
";
		$msg .= 'USER-AGENT: '. $USER_AGENT ."
";
		$msg .= '' ."
";

		// MULTICAST MESSAGE
		$sock = socket_create( AF_INET, SOCK_DGRAM, 0 );
		$opt_ret = socket_set_option( $sock, 1, 6, TRUE );
		$send_ret = socket_sendto( $sock, $msg, strlen( $msg ), 0, '239.255.255.250', 1900);

		// SET TIMEOUT FOR RECIEVE
		socket_set_option( $sock, SOL_SOCKET, SO_RCVTIMEO, array( 'sec'=>$sockTimout, 'usec'=>'0' ) );

		// RECIEVE RESPONSE
		$response = array();
		do {
			$buf = null;
			@socket_recvfrom( $sock, $buf, 1024, MSG_WAITALL, $from, $port );
			if( !is_null($buf) )$response[] = $buf;
		} while( !is_null($buf) );

		// CLOSE SOCKET
		socket_close( $sock );

		print_r( $response);
 ?>

Unter 4.0 Beta ist das Skript umgehend fertig ohne Ergebnisse (oder Fehlermeldungen) zu bringen. Unter 3.4 lief es bestimmt 10 Sekunden lang.

Da das für mich ein echter „Dealbreaker“ für den Umstieg auf 4.0 ist würde ich mich über Hilfestellungen freuen!

Ich kann dir da leider nicht wirklich weiterhelfen, da dies keine Funktionen von IP-Symcon sind. Wir haben von PHP 5.4 auf PHP 5.5 gewechselt. Hast du mal im PHP Changelog geschaut, ob sich was an der Handhabung geändert hat?

paresy

Moin Paresy,

danke für Deine schnelle Antwort. Du hast vermutlich Recht, es liegt irgendwie an PHP 5.5 unter Windows.

Ich habe es mit lokalen Installationen von PHP 5.4.45, 5.5.30 sowie 5.6.15 getestet. Es geht dort nur mit der 5.4. Als Fehlerquelle habe ich die Funktion „socket_recvfrom“ identifiziert, die ab 5.5 folgende Meldung wirft

The attempted operation is not supported for the type of object referenced.

Das Changelog von PHP gibt leider nichts sinnvolles her. Es scheint auch nicht an 5.5 im Allgemeinen sondern an der Windows-Version von PHP zu liegen. Unter Ubuntu funktioniert das Skript mit PHP 5.5.8. :mad:

Vielleicht liegt es an dem VC11-Kompiler der seit 5.5 benutzt wird?

So, ich bin der Sache näher gekommen!

wenn man in

socket_recvfrom( $sock, $buf, 1024, MSG_WAITALL, $from, $port );

das MSG_WAITALL durch „0“ ersetzt

socket_recvfrom( $sock, $buf, 1024,0, $from, $port );

geht es auf einmal.

Die Konstante MSG_WAITALL ist aber als definiert und hat den Wert 8… keine Ahnung.