我在两个linux虚拟机下写的两段测试程序 发送广播的 php有错没有找到错误,请高人帮我看看!虚拟机 1eth0      Link encap:Ethernet  HWaddr 00:0C:29:B6:CC:2E  
          inet addr:192.168.5.212  Bcast:192.168.5.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feb6:cc2e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:378061 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26163 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:30157452 (28.7 MiB)  TX bytes:23229143 (22.1 MiB)
          Interrupt:169 Base address:0x2000 lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:43717 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43717 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3786283 (3.6 MiB)  TX bytes:3786283 (3.6 MiB)虚拟机 2         eth0      Link encap:Ethernet  HWaddr 00:0C:29:76:9C:FA  
          inet addr:192.168.5.214  Bcast:192.168.5.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe76:9cfa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:782950 errors:0 dropped:0 overruns:0 frame:0
          TX packets:510280 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:98264719 (93.7 MiB)  TX bytes:281173211 (268.1 MiB)
          Interrupt:169 Base address:0x2000 lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:73456 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73456 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:5536889 (5.2 MiB)  TX bytes:5536889 (5.2 MiB)下面为两段程序:虚拟机 2 (192.168.5.214)上的代码#! /usr/local/bin/php -q
<?php
set_time_limit(0);  //run forever
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock,"192.168.5.214",7001);
// setup the socket options
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, TRUE);
socket_set_block($sock);
socket_set_option($sock,
                         SOL_SOCKET,
                         SO_RCVTIMEO,
                         array("sec"=>1,"usec"=>0));while(1){ echo "L";
 if($len = @socket_recvfrom($sock,$ret,2000,MSG_WAITALL,$cIP,$cPort)){
                    print_r(array($cIP,$cPort,$ret));
                    break;
         }
}?> 虚拟机 1 (192.168.5.212)上的代码#!/usr/local/bin/php -q
<?php
// NOTE!
// This is quick and dirty code! It comes without error handling!// Timeout in seconds waiting for a response.
$timeout = 20;
$braddr=@exec(" ifconfig | grep Bcast | cut -d \":\" -f 3 | cut -d \" \" -f 1 ");
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock,"192.168.5.212",7001);
$buf = "Hello,world!";
$sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, TRUE);
socket_set_block($sock);
socket_set_option($sock,
                         SOL_SOCKET,
                         SO_RCVTIMEO,
                         array("sec"=>1,"usec"=>0));if ($sock_data){
   $sock_data = socket_sendto($sock, $buf, strlen($buf), 0, $braddr, 7001);//注意$braddr此处若改为192.168.5.214(不做广播) 则那边可以正常收到包
   echo  $sock_data;

socket_set_block($sock);socket_set_option($sock,
                         SOL_SOCKET,
                         SO_RCVTIMEO,
                         array("sec"=>10,"usec"=>0));
$timeout += time();
while (time() <= $timeout-1) {
 if (($len = @socket_recvfrom($sock,$ret,2048,0,$cIP,$cPort)) != false) {
   echo bin2hex($ret);
 }
}
socket_set_nonblock($sock);if ($sock_data){
      socket_close($sock); //Close socket
      unset($sock);
      return(true);
 }?>