본문 바로가기

PHP

Broadcasting in PHP

After several hours of working with sockets in an attempt to do UDP broadcasting,
I thought a little help was in order for anyone else looking to do something similar,
since it uses a number of those "undocumented" functions.  Here's how I did it:
 

<?php 
    
// here is a basic opening of the a socket.  AF_INET specifies the internet domain.  SOCK_DGRAM 
    // specifies the Datagram socket type the 0 specifies that I want to use the default protcol (which in this 
    // case is UDP) 
    
$sock socket(AF_INETSOCK_DGRAM0); 

    
// if the file handle assigned to socket is less than 0 then opening the socket failed 
    
if($sock 0
    { 
        echo 
"socket() failed, error: " strerror($sock) . "\n"
    } 

    
// here's where I set the socket options, this is essential to allow broadcasting.  An earlier comment (as of 
    // June 4th, 2001) explains what the parameters are.  For my purposes (UDP broadcasting) I need to set 
    // the broadcast option at the socket level to true.  In C, this done using SOL_SOCKET as the level param 
    // (2) and SO_BROADCAST as the type param (3).  These may exist in PHP but I couldn't reference them  
    // so I used the values that referencing these variables in C returns (namely 1 and 6 respectively).  This 
    // function is basically just a wrapper to the C  function so check out the C documentation for more info 
    
$opt_ret setsockopt($sock16TRUE); 

    
// if the return value is less than one, an error occured setting the options 
    
if($opt_ret 0
    { 
        echo 
"setsockopt() failed, error: " strerror($opt_ret) . "\n"
    } 

    
// finally I am ready to broad cast something.  The sendto function allows this without any 
    // connections (essential for broadcasting).  So, this function sends the contents of $broadcast_string to the 
    // general broadcast address (255.255.255.255) on port 4096.  The 0 (param 4) specifies no special 
    // options, you can read about the options with man sendto 
    
$send_ret sendto($sock$broadcast_stringstrlen($broadcast_string), 0'255.255.255.255'4096); 

    // if the return value is less than 0, an error has occured 
    
if($send_ret 0
    { 
         echo 
"sendto() failed, error: " strerror($send_ret) . "<BR>\n";
    } 
// be sure to close your socket when you're done 
close($sock);
?>

출처:
 
http://php.net/manual/en/ref.sockets.php