, C . , . (UDP , , UDP, , .) , , , - , .
, , ? , , . , , , , , .
, PHP ioctl(2) raw socket FD. - ioctl(sock, FIONREAD, &n) PHP-land, . ( , , , fopen fsockopen, , .) , .
, :
. socket_set_nonblock . socket_read, socket_write .. . , , , $data = socket_read($socket, 1024), 1024 , . (N.B. 0, .)
socket_select, . , / / , .
, , , , -. socket_select ; , , , socket_read. (, 10 ), .
, , , .
, , . , , , . , , .
, . , , , , . , pack 32- . , 4 . 4 , unpack , , .
<?php
$payload = "Have a nice day!\n";
$len = strlen($payload) + 1;
$packet = pack("Na", $len, $payload);
socket_send($sock, $packet, $len + 4);
...
<?php
$r = socket_read($sock, 4);
$la = unpack("N", $r);
socket_set_nonblock($sock);
$len = $la[1];
$time = 0;
$payload = "";
while ($len > 0 && $time < 10) {
$data = socket_read($sock, $la[1]);
$tlen = strlen($data);
$payload .= $data;
$len -= $tlen;
if ($len == 0) {
break;
}
sleep(1);
$time++;
}
N.B. , , / , , . .
. HTTP, , Content-Length .
, , . , , . , .
, . (, ZeroMQ push- Apple - .) , , - , ?
private function get_packet_length($socket) {
$a = 0;
$b = 0;
while(true) {
$c = socket_read($socket, 1);
if (!$c) {
return 0;
}
$c = ord($c);
$a |= ($c & 0x7F) << $b++ * 7;
if ($b > 5) {
return false;
}
if (($c & 0x80) != 128) {
break;
}
}
return $a;
}
, , , :
$stream = "\x01";
$stream = "\x81\x80\x80\x00";
$stream = "\xff\x01";
$stream = "\x80\x82";
$stream = "\xff\xff\x01";
$stream = "\x80\x80\x02";
$stream = "\x0c\x00\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64\x21"
, , little-endian. ( big-endian), : . , . , , , , .
, bytestream - . bytestream. , bytestream ( ). , PPC ARM-, . , .
. , . . Rob Pike , , - - (, bytestream ).