UDP Broadcast

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Elmo Nuts

Elmo Nuts

24/11/2015 21:55:50
Quote Anchor link
Beste forumleden,

ik heb problemen met het ontvangen van replies op een UDP broadcast.
Ik verzend een udp broadcast vanuit een server, waarop de clients keurig antwoord geven op poort 6437
In eerste instantie gebruikte ik de functie "socket_recvfrom" omdat die mij , buiten de data, ook het ip adres van de antwoordende client geeft.
(wat ik nodig heb)
Alleen krijg ik met deze functie maar 1 client te pakken, terwijl ik met wireshark duidelijk meerdere zie antwoorden.
Ook meerdere malen socket_recvfrom voor een periode in een loop laten lopen helpt niet, ik zie maar 1 antwoord.

Als ik echter "socket_read" gebruik om de data van poort 6437 uit te lezen, zie ik wel alle data van alle antwoordende clients.

Is er iemand die weet hoe ik , buiten de data, ook alle ip adressen van de antwoordende clients kan zien?
thanks!


Code voor ontvangen udp broadcast:


$port = 6437; //receive port

//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) / open socket
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Couldn't create socket: [$errorcode] $errormsg \n");
}

socket_set_nonblock($sock); //nonblocking optie


// Bind the source address
if( !socket_bind($sock, "0.0.0.0" , $port) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Could not bind socket : [$errorcode] $errormsg \n");
}

stream_set_timeout($sock, 15); // stream timeout 15 sec

/*/////////////////////////optie socket_recvfrom//////////////////////////////////
$message="";
sleep(4); ... wait for replies

if(socket_recvfrom($sock, $buf, 2045,MSG_PEEK, $remote_ip, $remote_port)=== FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Could not receive data: [$errorcode] $errormsg \n");
}
else
{

$message= $remote_ip." : Port: ". $remote_port."---- SN : ". $buf."\n"; // store remote ip / remote port /data

sleep(1);

}
*//////////////////////////////////////////////////////

//////////////////////// optie socket_read//////////////////////////////
$message="";

sleep(4);
for ($x = 0;$x <= 4; $x++)
{
sleep(1);
$message = $message.socket_read($sock, 64, MSG_PEEK);
}
 
PHP hulp

PHP hulp

29/03/2024 01:58:16
 
Ben van Velzen

Ben van Velzen

24/11/2015 22:38:36
Quote Anchor link
Het zou helpen als je ook blijft lezen tot je niks meer binnenkrijgt. In het geval van UDP zul je met een timeout moeten werken, omdat UDP stateless is, en je dus niet kan weten of er nog meer data volgt.
 
Elmo Nuts

Elmo Nuts

25/11/2015 23:06:34
Quote Anchor link
Ha Ben,
dank voor je reactie.
De timeout komt van de optie stream_set_timeout($sock, 15);
Lijkt te werken.

Ik heb uiteindelijk een oplossing gevonden door het ip adres eerst te lezen met functie socket_recvfrom() met de optie MSG_PEEK , zodat de data blijft staan.
Daarna lees ik de data weg met socket_read()
waarschijnlijk een knutsel oplossing , maar het werkt.


sleep(10); // wacht 10 sec op reacties
do
{
$host=""; $port=0; // clear
socket_recvfrom($sock, $buffer, 64, MSG_PEEK, $host, $port); //lees alleen IP adressen , laat data staan
$message = socket_read($sock, 64, PHP_BINARY_READ ); // lees datapayload en verwijder van buffer
echo $message." ".$host." ".$port."\n";
}
while (strlen($message>3)); // stop als er niets meer is
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.