mcast_ipv6_recv.phpt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. --TEST--
  2. Multicast support: IPv6 receive options
  3. --EXTENSIONS--
  4. sockets
  5. --SKIPIF--
  6. <?php
  7. if (!defined('IPPROTO_IPV6')) {
  8. die('skip IPv6 not available.');
  9. }
  10. $s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
  11. if ($s === false) {
  12. die("skip unable to create socket");
  13. }
  14. $br = socket_bind($s, '::', 0);
  15. socket_getsockname($s, $unused, $port);
  16. /* On Linux, there is no route ff00::/8 by default on lo, which makes it
  17. * troublesome to send multicast traffic from lo, which we must since
  18. * we're dealing with interface-local traffic... */
  19. $so = @socket_set_option($s, IPPROTO_IPV6, MCAST_JOIN_GROUP, array(
  20. "group" => 'ff01::114',
  21. "interface" => 0,
  22. ));
  23. if ($so === false) {
  24. die('skip unable to join multicast group on any interface.');
  25. }
  26. $r = socket_sendto($s, $m = "testing packet", strlen($m), 0, 'ff01::114', $port);
  27. if ($r === false) {
  28. die('skip unable to send multicast packet.');
  29. }
  30. if (!defined("MCAST_JOIN_SOURCE_GROUP"))
  31. die('skip source operations are unavailable');
  32. $so = @socket_set_option($s, IPPROTO_IPV6, MCAST_LEAVE_GROUP, array(
  33. "group" => 'ff01::114',
  34. "interface" => 0,
  35. ));
  36. $so = @socket_set_option($s, IPPROTO_IPV6, MCAST_JOIN_SOURCE_GROUP, array(
  37. "group" => 'ff01::114',
  38. "interface" => 0,
  39. "source" => '2001::dead:beef',
  40. ));
  41. if ($so === false) {
  42. die('skip protocol independent multicast API is unavailable.');
  43. }
  44. --FILE--
  45. <?php
  46. include __DIR__."/mcast_helpers.php.inc";
  47. $domain = AF_INET6;
  48. $level = IPPROTO_IPV6;
  49. $interface = 0;
  50. $mcastaddr = 'ff01::114';
  51. $sblock = "?";
  52. echo "creating send socket\n";
  53. $sends1 = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err");
  54. var_dump($sends1);
  55. echo "creating receive socket\n";
  56. $s = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err");
  57. var_dump($s);
  58. $br = socket_bind($s, '::0', 0) or die("err");
  59. var_dump($br);
  60. socket_getsockname($s, $unused, $port);
  61. $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array(
  62. "group" => $mcastaddr,
  63. "interface" => $interface,
  64. )) or die("err");
  65. var_dump($so);
  66. $r = socket_sendto($sends1, $m = "testing packet", strlen($m), 0, $mcastaddr, $port);
  67. var_dump($r);
  68. checktimeout($s, 500);
  69. $r = socket_recvfrom($s, $str, 2000, 0, $from, $fromPort);
  70. var_dump($r, $str, $from);
  71. $sblock = $from;
  72. $r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, $port);
  73. var_dump($r);
  74. $i = 0;
  75. checktimeout($s, 500);
  76. while (($str = socket_read($s, 3000)) !== FALSE) {
  77. $i++;
  78. echo "$i> ", $str, "\n";
  79. if ($i == 1) {
  80. echo "leaving group\n";
  81. $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array(
  82. "group" => $mcastaddr,
  83. "interface" => $interface,
  84. ));
  85. var_dump($so);
  86. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port);
  87. var_dump($r);
  88. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port);
  89. var_dump($r);
  90. }
  91. if ($i == 2) {
  92. echo "re-joining group\n";
  93. $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array(
  94. "group" => $mcastaddr,
  95. "interface" => $interface,
  96. ));
  97. var_dump($so);
  98. $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port);
  99. var_dump($r);
  100. }
  101. if ($i == 3) {
  102. echo "blocking source\n";
  103. $so = socket_set_option($s, $level, MCAST_BLOCK_SOURCE, array(
  104. "group" => $mcastaddr,
  105. "interface" => $interface,
  106. "source" => $sblock,
  107. ));
  108. var_dump($so);
  109. $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, $port);
  110. var_dump($r);
  111. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port);
  112. var_dump($r);
  113. }
  114. if ($i == 4) {
  115. echo "unblocking source\n";
  116. $so = socket_set_option($s, $level, MCAST_UNBLOCK_SOURCE, array(
  117. "group" => $mcastaddr,
  118. "interface" => $interface,
  119. "source" => $sblock,
  120. ));
  121. var_dump($so);
  122. $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port);
  123. var_dump($r);
  124. }
  125. if ($i == 5) {
  126. echo "leaving group\n";
  127. $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array(
  128. "group" => $mcastaddr,
  129. "interface" => $interface,
  130. ));
  131. var_dump($so);
  132. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port);
  133. var_dump($r);
  134. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port);
  135. var_dump($r);
  136. }
  137. if ($i == 6) {
  138. echo "joining source group\n";
  139. $so = socket_set_option($s, $level, MCAST_JOIN_SOURCE_GROUP, array(
  140. "group" => $mcastaddr,
  141. "interface" => $interface,
  142. "source" => $sblock,
  143. ));
  144. var_dump($so);
  145. $r = socket_sendto($sends1, $m = "mcast packet from desired source", strlen($m), 0, $mcastaddr, $port);
  146. var_dump($r);
  147. }
  148. if ($i == 7) {
  149. echo "leaving source group\n";
  150. $so = socket_set_option($s, $level, MCAST_LEAVE_SOURCE_GROUP, array(
  151. "group" => $mcastaddr,
  152. "interface" => $interface,
  153. "source" => $sblock,
  154. ));
  155. var_dump($so);
  156. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port);
  157. var_dump($r);
  158. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port);
  159. var_dump($r);
  160. }
  161. if ($i == 8) {
  162. /*echo "joining source group\n";
  163. $so = socket_set_option($s, $level, MCAST_JOIN_SOURCE_GROUP, array(
  164. "group" => $mcastaddr,
  165. "interface" => $interface,
  166. "source" => $sblock,
  167. ));
  168. var_dump($so);*/
  169. break;
  170. }
  171. }
  172. ?>
  173. --EXPECTF--
  174. creating send socket
  175. object(Socket)#%d (0) {
  176. }
  177. creating receive socket
  178. object(Socket)#%d (0) {
  179. }
  180. bool(true)
  181. bool(true)
  182. int(14)
  183. int(14)
  184. string(14) "testing packet"
  185. string(%d) "%s"
  186. int(14)
  187. 1> initial packet
  188. leaving group
  189. bool(true)
  190. int(20)
  191. int(14)
  192. 2> unicast packet
  193. re-joining group
  194. bool(true)
  195. int(12)
  196. 3> mcast packet
  197. blocking source
  198. bool(true)
  199. int(31)
  200. int(14)
  201. 4> unicast packet
  202. unblocking source
  203. bool(true)
  204. int(12)
  205. 5> mcast packet
  206. leaving group
  207. bool(true)
  208. int(20)
  209. int(14)
  210. 6> unicast packet
  211. joining source group
  212. bool(true)
  213. int(32)
  214. 7> mcast packet from desired source
  215. leaving source group
  216. bool(true)
  217. int(20)
  218. int(14)
  219. 8> unicast packet