1--TEST-- 2Multicast support: IPv6 receive options (limited) 3--EXTENSIONS-- 4sockets 5--SKIPIF-- 6<?php 7 8if (!defined('IPPROTO_IPV6')) { 9 die('skip IPv6 not available.'); 10} 11// hide the output from socket_create() because it can raise 12// a warning if (for example) the linux kernel is lacking ipv6 13$s = @socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP); 14if ($s === false) { 15 die("skip unable to create socket"); 16} 17$br = socket_bind($s, '::', 3000); 18/* On Linux, there is no route ff00::/8 by default on lo, which makes it 19 * troublesome to send multicast traffic from lo, which we must since 20 * we're dealing with interface-local traffic... */ 21$so = @socket_set_option($s, IPPROTO_IPV6, MCAST_JOIN_GROUP, array( 22 "group" => 'ff01::114', 23 "interface" => 0, 24)); 25if ($so === false) { 26 die('skip unable to join multicast group on any interface.'); 27} 28$r = socket_sendto($s, $m = "testing packet", strlen($m), 0, 'ff01::114', 3000); 29if ($r === false) { 30 die('skip unable to send multicast packet.'); 31} 32$so = @socket_set_option($s, IPPROTO_IPV6, MCAST_LEAVE_GROUP, array( 33 "group" => 'ff01::114', 34 "interface" => 0, 35)); 36if (defined("MCAST_JOIN_SOURCE_GROUP")) { 37 $so = @socket_set_option($s, IPPROTO_IPV6, MCAST_JOIN_SOURCE_GROUP, array( 38 "group" => 'ff01::114', 39 "interface" => 0, 40 "source" => '2001::dead:beef', 41 )); 42 if ($so !== false) { 43 die('skip protocol independent multicast API is available.'); 44 } 45} 46--FILE-- 47<?php 48include __DIR__."/mcast_helpers.php.inc"; 49$domain = AF_INET6; 50$level = IPPROTO_IPV6; 51$interface = 0; 52$mcastaddr = 'ff01::114'; 53$sblock = "?"; 54 55echo "creating send socket\n"; 56$sends1 = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err"); 57var_dump($sends1); 58 59echo "creating receive socket\n"; 60$s = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err"); 61var_dump($s); 62$br = socket_bind($s, '::0', 3000) or die("err"); 63var_dump($br); 64 65$so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( 66 "group" => $mcastaddr, 67 "interface" => $interface, 68)) or die("err"); 69var_dump($so); 70 71$r = socket_sendto($sends1, $m = "testing packet", strlen($m), 0, $mcastaddr, 3000); 72var_dump($r); 73checktimeout($s, 500); 74$r = socket_recvfrom($s, $str, 2000, 0, $from, $fromPort); 75var_dump($r, $str, $from); 76$sblock = $from; 77 78$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, 3000); 79var_dump($r); 80 81$i = 0; 82checktimeout($s, 500); 83while (($str = socket_read($s, 3000, 500)) !== FALSE) { 84 $i++; 85 echo "$i> ", $str, "\n"; 86 87if ($i == 1) { 88 echo "leaving group\n"; 89 $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array( 90 "group" => $mcastaddr, 91 "interface" => $interface, 92 )); 93 var_dump($so); 94 $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); 95 var_dump($r); 96 $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000); 97 var_dump($r); 98} 99if ($i == 2) { 100 echo "re-joining group\n"; 101 $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( 102 "group" => $mcastaddr, 103 "interface" => $interface, 104 )); 105 var_dump($so); 106 $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000); 107 var_dump($r); 108} 109if ($i == 3) { 110 break; 111} 112 113} 114?> 115--EXPECTF-- 116creating send socket 117object(Socket)#%d (0) { 118} 119creating receive socket 120object(Socket)#%d (0) { 121} 122bool(true) 123bool(true) 124int(14) 125int(14) 126string(14) "testing packet" 127string(%d) "%s" 128int(14) 1291> initial packet 130leaving group 131bool(true) 132int(20) 133int(14) 1342> unicast packet 135re-joining group 136bool(true) 137int(12) 1383> mcast packet 139