March 14, 2008

Socket To Me

Sockets are the building blocks of networking connections between computers. Today I want to go though how to create a UDP listener (or socket server) in PHP. I recently had to do this to receive GPS data from some black boxes, and had a hard time finding examples of this type of UDP socket server. First of we need to specify who/where this socket will be created for; the host and port.

Pick a port that is higher than 1024, those below that are reserved.

#!/usr/bin/php -q
$address = "0"; //glom onto all addresses
$rport = "1228"; //receiving port

You should make $address = “″ if you only want to allow connections on the localhost…

Create the socket and bind it to that host and port, inside an infinite loop.

while (true) { //create a loop in which to collect packets
    /* create a socket in the AF_INET family,
    using SOCK_DGRAM for udp connections */
    $mysock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_bind($mysock, $address, $rport);
    $from = "";
    $port = 0;
    //use socket_recvfrom() to collect connecting host/port info
    socket_recvfrom($mysock, $buf, 65535, 0, $from, $port);

In my case the GPS data was coming in as Comma Seperated Values (csv). So I’m doing a simple parse for that:

//---- code to parse my csv data into an array
$lines = split("\n", $buf);
$i = 0;
foreach ($lines as $line) {
     $linevalues = explode(",", $line);
if (count($linevalues) > 1) {
         $values[$i] = $linevalues;
     } //end if
} //end foreach
//---- code to parse my csv data into a multidimensional array
print_r($values); //print out the array

In my case I’m going to be inserting the values into a MySQL database, but putting a multidimensional array into a MySQL database has been covered elsewhere.

You could also echo out the host and port connecting to your socket.

echo "From remote address $from and remote port $port" . PHP_EOL;
} //end while(true)

Leave a comment