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