Müssen Sie ein UDP-client Beispiel
Ich habe eine Segel-Timer Windfahne, überträgt Daten per UDP über ein WiFi-Netzwerk erstellt von der Windfahne hardware. Das system funktioniert einwandfrei, und ich kann die Daten Lesen über 3rd-party-Navigationssoftware INavX. Aber ich möchte in der Lage sein, um Lesen Sie den UDP-stream direkt über die PHP zum testen, und ich kann nicht mein script ausgeführt. Ich habe keine Vorherige Erfahrung mit UDP.
Ich weiß, die hardware und das Netzwerk sind, richtig funktionieren, weil die oben genannte software funktioniert einwandfrei. Auch kann ich sehen, die den Netzwerk-traffic in wireshark. Ich habe versucht zu Fragen, den Verkäufer um Hilfe, aber Sie sagten, Sie sind phasing mein Modell heraus, Sie wird nicht helfen, mich mit dem Modell, das ich habe, und ich sollte einen neuen kaufen. Aber der Kerl, der schrieb, die Navigations-software, sagte, es ist eine einfache Netzwerkverbindung ohne initiation strings oder nichts, "Nur an den port anschließen, und Sie sollten sehen Daten."
Was macht dieses ein bisschen anders als andere UDP-Beispiele, die ich gesehen habe, ist dies ist im wesentlichen "nur Zuhören" (ist es das, was ist Rundfunk?). Wenn ich versuche zum schreiben von Daten an den socket, bekomme ich ein "permission denied" - Fehler, weshalb ich die Angabe der ip und port in der socket_recvfrom Funktion.
Hier ist mein client-code in PHP:
<?php
# based on from http://www.binarytides.com/udp-socket-programming-in-php/
/*
Simple php udp socket client
*/
//Reduce errors
error_reporting(~E_WARNING);
//network settings for the wind vane
$server = '255.255.255.255';
$port = 55554;
if( isset($argv[1]) ) $server = $argv[1];
if( isset($argv[2]) ) $port = $argv[2];
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
//Bind the source address
if( !socket_bind($sock, "127.0.0.1" , 55554) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
//Communication loop
while(1)
{
//Now receive reply from server and print it
if( ($bytesRead = socket_recvfrom ( $sock , $reply , 2045 , 0 , $server, $port )) === FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
if( ! in_array($errorcode, array(35) ) )
die("Could not receive data: [$errorcode] $errormsg \n");
}
if( $bytesRead > 0 ) {
echo "Reply : $reply";
}
usleep(500000);
}
InformationsquelleAutor Tim Herzog | 2015-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geben diesem einen Versuch:
Sie sollten nicht geben Sie eine IP-Adresse für die Sendungen, aber es gibt einige Beiträge gibt, die gegenteiliges. Ich habe nur ein OS X-Maschine zu testen, gerade jetzt und es funktioniert gut dort.
SO_BROADCAST
ist wahrscheinlich unnötig, aber ich habe es im Falle.Vielen Dank für das Codebeispiel! Funktionierte perfekt.
InformationsquelleAutor
Den oben genannten Szenarien nicht für mich gearbeitet, kam immer mit invalid-Protokoll irgendeine Art von Fehler:
Obwohl dies funktionierte gut:
C++ Empfänger:
PHP: Absender
InformationsquelleAutor user2195463