mcast_ipv6_recv.phpt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. --TEST--
  2. Multicast support: IPv6 receive options
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded('sockets')) {
  6. die('skip sockets extension not available.');
  7. }
  8. if (!defined('IPPROTO_IPV6')) {
  9. die('skip IPv6 not available.');
  10. }
  11. $s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
  12. if ($s === false) {
  13. die("skip unable to create socket");
  14. }
  15. $br = socket_bind($s, '::', 3000);
  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', 3000);
  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', 3000) or die("err");
  59. var_dump($br);
  60. $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array(
  61. "group" => $mcastaddr,
  62. "interface" => $interface,
  63. )) or die("err");
  64. var_dump($so);
  65. $r = socket_sendto($sends1, $m = "testing packet", strlen($m), 0, $mcastaddr, 3000);
  66. var_dump($r);
  67. checktimeout($s, 500);
  68. $r = socket_recvfrom($s, $str, 2000, 0, $from, $fromPort);
  69. var_dump($r, $str, $from);
  70. $sblock = $from;
  71. $r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, 3000);
  72. var_dump($r);
  73. $i = 0;
  74. checktimeout($s, 500);
  75. while (($str = socket_read($s, 3000)) !== FALSE) {
  76. $i++;
  77. echo "$i> ", $str, "\n";
  78. if ($i == 1) {
  79. echo "leaving group\n";
  80. $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array(
  81. "group" => $mcastaddr,
  82. "interface" => $interface,
  83. ));
  84. var_dump($so);
  85. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000);
  86. var_dump($r);
  87. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000);
  88. var_dump($r);
  89. }
  90. if ($i == 2) {
  91. echo "re-joining group\n";
  92. $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array(
  93. "group" => $mcastaddr,
  94. "interface" => $interface,
  95. ));
  96. var_dump($so);
  97. $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000);
  98. var_dump($r);
  99. }
  100. if ($i == 3) {
  101. echo "blocking source\n";
  102. $so = socket_set_option($s, $level, MCAST_BLOCK_SOURCE, array(
  103. "group" => $mcastaddr,
  104. "interface" => $interface,
  105. "source" => $sblock,
  106. ));
  107. var_dump($so);
  108. $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, 3000);
  109. var_dump($r);
  110. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000);
  111. var_dump($r);
  112. }
  113. if ($i == 4) {
  114. echo "unblocking source\n";
  115. $so = socket_set_option($s, $level, MCAST_UNBLOCK_SOURCE, array(
  116. "group" => $mcastaddr,
  117. "interface" => $interface,
  118. "source" => $sblock,
  119. ));
  120. var_dump($so);
  121. $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000);
  122. var_dump($r);
  123. }
  124. if ($i == 5) {
  125. echo "leaving group\n";
  126. $so = socket_set_option($s, $level, MCAST_LEAVE_GROUP, array(
  127. "group" => $mcastaddr,
  128. "interface" => $interface,
  129. ));
  130. var_dump($so);
  131. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000);
  132. var_dump($r);
  133. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000);
  134. var_dump($r);
  135. }
  136. if ($i == 6) {
  137. echo "joining source group\n";
  138. $so = socket_set_option($s, $level, MCAST_JOIN_SOURCE_GROUP, array(
  139. "group" => $mcastaddr,
  140. "interface" => $interface,
  141. "source" => $sblock,
  142. ));
  143. var_dump($so);
  144. $r = socket_sendto($sends1, $m = "mcast packet from desired source", strlen($m), 0, $mcastaddr, 3000);
  145. var_dump($r);
  146. }
  147. if ($i == 7) {
  148. echo "leaving source group\n";
  149. $so = socket_set_option($s, $level, MCAST_LEAVE_SOURCE_GROUP, array(
  150. "group" => $mcastaddr,
  151. "interface" => $interface,
  152. "source" => $sblock,
  153. ));
  154. var_dump($so);
  155. $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000);
  156. var_dump($r);
  157. $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000);
  158. var_dump($r);
  159. }
  160. if ($i == 8) {
  161. /*echo "joining source group\n";
  162. $so = socket_set_option($s, $level, MCAST_JOIN_SOURCE_GROUP, array(
  163. "group" => $mcastaddr,
  164. "interface" => $interface,
  165. "source" => $sblock,
  166. ));
  167. var_dump($so);*/
  168. break;
  169. }
  170. }
  171. --EXPECTF--
  172. creating send socket
  173. resource(%d) of type (Socket)
  174. creating receive socket
  175. resource(%d) of type (Socket)
  176. bool(true)
  177. bool(true)
  178. int(14)
  179. int(14)
  180. string(14) "testing packet"
  181. string(%d) "%s"
  182. int(14)
  183. 1> initial packet
  184. leaving group
  185. bool(true)
  186. int(20)
  187. int(14)
  188. 2> unicast packet
  189. re-joining group
  190. bool(true)
  191. int(12)
  192. 3> mcast packet
  193. blocking source
  194. bool(true)
  195. int(31)
  196. int(14)
  197. 4> unicast packet
  198. unblocking source
  199. bool(true)
  200. int(12)
  201. 5> mcast packet
  202. leaving group
  203. bool(true)
  204. int(20)
  205. int(14)
  206. 6> unicast packet
  207. joining source group
  208. bool(true)
  209. int(32)
  210. 7> mcast packet from desired source
  211. leaving source group
  212. bool(true)
  213. int(20)
  214. int(14)
  215. 8> unicast packet