Für alle Modul Entwickler die ein Discover einbauen!

Ich habe hier mehrere Module getestet und auch selbst das Problem beim Entwickeln schon erlebt.
Man testet sein Discover und alle klappt SUPER, doch meist hat man in seinem Rechner nur eine aktive Netzwerkkarte.

Damit würde ein Discover wie folgt, auch prima funtionieren.


	....
    $cs = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    if ($cs) {
        socket_set_option($cs, SOL_SOCKET, SO_REUSEADDR, 1);
        socket_set_option($cs, SOL_SOCKET, SO_BROADCAST, 1);
        socket_set_option($cs, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0));
		....
		socket_sendto($cs, .... );
		
		while (socket_recvfrom($cs, $response, 1024, 0, $from, $port)) {
			...
		}
	}
	...

sind aber mehrere aktive Netzwerkkarten im Rechner WLAN und LAN oder mehrere LAN / WLAN Adapter dann klappt´s nicht mit dem Discover da der $cs (Socket) keine Antworten oder mal so/mal so, erhält.
In diesem Falle, würde ich auch generell empfehlen, den Socket an die aktive Netzwerkkarte zu binden.

Eine Möglichkeit die aktive IP zu ermitteln wäre zB. Sys_GetNetworkInfo() sicherer ist es aber mit


	...
	$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
	socket_connect($s, '8.8.8.8', 53);  // verbinde zu UDP Adresse aber sende keine Daten
	socket_getsockname($s, $local_ip_address, $local_port);
	socket_close($s);
	// somit haben wir in $local_ip_address und $local_port die Daten zum binden des Sockets
	---

	$cs = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    if ($cs) {
        socket_set_option($cs, SOL_SOCKET, SO_BROADCAST, 1);
        socket_set_option($cs, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0));
		// Hier den Socket an die active IP ... und wenn benötigt wie hier, den Port binden.
        socket_bind($cs,$local_ip_address,$local_port);
		....
		
		socket_sendto($cs, .... );
		
		while (socket_recvfrom($cs, $response, 1024, 0, $from, $port)) {
			...
		}
	}

damit solte es dann auch mit mehreren Netzwerkkarten zuverlässig funktionieren.

Schönes WE an alle Leser
cu
Xaver
:loveips:

Hast du mal meine Module getestet?
Weil dort nutze ich socket_bind an 0.0.0.0 und das funktionierte bisher sehr gut.
Allerdings habe ich nur mit Windows und Linux getestet. Kein Docker oder MacOS.
Michael
PS: ich habe es in den korrekten Bereich verschoben.

Danke fürs verschieben :wink:

Ich habe nicht alle getestet :). Aber bei dem aktuellen Modul von Fronzo (Broadlink) discover zb. war bind auf dieser Adresse und ich habe nichts gefunden.
Nach dem ändern des Bind´s auf die IP und Port ging es sofort.

Dieses verhalten habe ich zuerst bei meinen Upnp Discover Modul erlebt. Ich habe hier 4-5 aktive Netzwerk devices und ohne das binden an die aktive IP geht gar nichts.
Außerdem arbeite und teste ich unter Windows 10 , aber auch auf meinem Server R12 wo ips aktiv läuft, der jedoch auch mehrere LANS hat , ist es genau so.

Dazu kommt das die getesteten Module nach der Modifikation alle meine Geräte erkannt haben.

Aber ich lerne stets und gerne dazu :smiley: