我在两个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);
}?>
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);
}?>
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货