1--TEST-- 2Multicast support: IPv4 receive options 3--EXTENSIONS-- 4sockets 5--SKIPIF-- 6<?php 7 8if (getenv('SKIP_ONLINE_TESTS')) die('skip online test'); 9$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 10$br = socket_bind($s, '0.0.0.0', 0); 11$so = @socket_set_option($s, IPPROTO_IP, MCAST_JOIN_GROUP, array( 12 "group" => '224.0.0.23', 13 "interface" => 'lo', 14)); 15if ($so === false) { 16 die('skip interface \'lo\' is unavailable.'); 17} 18if (!defined("MCAST_BLOCK_SOURCE")) { 19 die('skip source operations are unavailable'); 20} 21?> 22--FILE-- 23<?php 24include __DIR__."/mcast_helpers.php.inc"; 25$domain = AF_INET; 26$level = IPPROTO_IP; 27$interface = "lo"; 28$mcastaddr = '224.0.0.23'; 29$sblock = "127.0.0.1"; 30 31echo "creating send socket bound to 127.0.0.1\n"; 32$sends1 = socket_create($domain, SOCK_DGRAM, SOL_UDP); 33$br = socket_bind($sends1, '127.0.0.1'); 34var_dump($br); 35 36echo "creating unbound socket and hoping the routing table causes an interface other than lo to be used for sending messages to $mcastaddr\n"; 37$sends2 = socket_create($domain, SOCK_DGRAM, SOL_UDP); 38var_dump($br); 39 40echo "creating receive socket\n"; 41$s = socket_create($domain, SOCK_DGRAM, SOL_UDP); 42var_dump($s); 43$br = socket_bind($s, '0.0.0.0', 0); 44socket_getsockname($s, $unused, $port); 45var_dump($br); 46 47$so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( 48 "group" => $mcastaddr, 49 "interface" => $interface, 50)); 51var_dump($so); 52 53$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, $port); 54var_dump($r); 55 56$i = 0; 57checktimeout($s, 500); 58while (($str = socket_read($s, 3000)) !== FALSE) { 59 $i++; 60 echo "$i> ", $str, "\n"; 61 62if ($i == 1) { 63 echo "leaving group\n"; 64 $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array( 65 "group" => $mcastaddr, 66 "interface" => $interface, 67 )); 68 var_dump($so); 69 $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); 70 var_dump($r); 71 $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); 72 var_dump($r); 73} 74if ($i == 2) { 75 echo "re-joining group\n"; 76 $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( 77 "group" => $mcastaddr, 78 "interface" => $interface, 79 )); 80 var_dump($so); 81 $r = socket_sendto($sends2, $m = "ignored mcast packet (different interface)", strlen($m), 0, $mcastaddr, $port); 82 var_dump($r); 83 $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port); 84 var_dump($r); 85} 86if ($i == 3) { 87 echo "blocking source\n"; 88 $so = socket_set_option($s, $level, MCAST_BLOCK_SOURCE, array( 89 "group" => $mcastaddr, 90 "interface" => $interface, 91 "source" => $sblock, 92 )); 93 var_dump($so); 94 $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, $port); 95 var_dump($r); 96 $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); 97 var_dump($r); 98} 99if ($i == 4) { 100 echo "unblocking source\n"; 101 $so = socket_set_option($s, $level, MCAST_UNBLOCK_SOURCE, array( 102 "group" => $mcastaddr, 103 "interface" => $interface, 104 "source" => $sblock, 105 )); 106 var_dump($so); 107 $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, $port); 108 var_dump($r); 109} 110if ($i == 5) { 111 echo "leaving group\n"; 112 $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array( 113 "group" => $mcastaddr, 114 "interface" => $interface, 115 )); 116 var_dump($so); 117 $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); 118 var_dump($r); 119 $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); 120 var_dump($r); 121} 122if ($i == 6) { 123 echo "joining source group\n"; 124 $so = socket_set_option($s, $level, MCAST_JOIN_SOURCE_GROUP, array( 125 "group" => $mcastaddr, 126 "interface" => $interface, 127 "source" => $sblock, 128 )); 129 var_dump($so); 130 $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, $port); 131 var_dump($r); 132} 133if ($i == 7) { 134 echo "leaving source group\n"; 135 $so = socket_set_option($s, $level, MCAST_LEAVE_SOURCE_GROUP, array( 136 "group" => $mcastaddr, 137 "interface" => $interface, 138 "source" => $sblock, 139 )); 140 var_dump($so); 141 $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); 142 var_dump($r); 143 $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); 144 var_dump($r); 145} 146if ($i == 8) { 147/* echo "rjsg\n"; 148 $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( 149 "group" => $mcastaddr, 150 "interface" => $interface, 151 )); 152 var_dump($so);*/ 153 break; 154} 155 156} 157?> 158--EXPECTF-- 159creating send socket bound to 127.0.0.1 160bool(true) 161creating unbound socket and hoping the routing table causes an interface other than lo to be used for sending messages to 224.0.0.23 162bool(true) 163creating receive socket 164object(Socket)#%d (0) { 165} 166bool(true) 167bool(true) 168int(14) 1691> initial packet 170leaving group 171bool(true) 172int(20) 173int(14) 1742> unicast packet 175re-joining group 176bool(true) 177int(42) 178int(12) 1793> mcast packet 180blocking source 181bool(true) 182int(31) 183int(14) 1844> unicast packet 185unblocking source 186bool(true) 187int(27) 1885> mcast packet from 127.0.0.1 189leaving group 190bool(true) 191int(20) 192int(14) 1936> unicast packet 194joining source group 195bool(true) 196int(27) 1977> mcast packet from 127.0.0.1 198leaving source group 199bool(true) 200int(20) 201int(14) 2028> unicast packet 203