2016年11月20日星期日

php sockets, pthreads, parse binary

sockets:

$fp = fsockopen('www,baidu.com', 80, $errno, $errstr, 30);
//$fp = stream_socket_client('tcp://www.baidu.com:80', $errno, $errstr);
if(!$fp) {
    echo "{$errno}, {$errstr}\n";
} else {

    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.baidu.com\r\n";
    $out .= "Connection: close\r\n\r\n";
    fwrite($fp, $out);

    $out = '';
    while(!feof($fp)) {
        $out .= fread($fp, 1024);
    }
    fclose($fp);
}

-----------------------------------------------------------------------
pthreads:

class T1 extends Thread {
    function run() {
        while(1) {
            echo "T1\n";
            sleep(1);
        }
    }
}
$t1 = new T1();
$t1->start();
$t1->join();
while(1) {
    echo "T2\n";
    sleep(1);
}

------------------------------------------------------------------------
parse binary

pack & unpack function
《PHP: 深入pack/unpack》
https://my.oschina.net/goal/blog/195749

$fp = fsockopen('1.1.1.1', 4661, $errno, $errstr, 30);
if(!$fp) {
    echo "{$errno}, {$errstr}\n";
} else {
   
    // login
    $protocol_type = pack('C', 0xE3);
    $message_type = pack('C', 0x01);
    $user_hash = md5('abc', true);
    $client_id = pack('V', 0);
    $tcp_port = pack('v', 4661);
    $tag_count = pack('V', 4);
    $tag_name = pack('CvCva20', 0x02, 1, 0x01, 20, 'http://www.amule.org');
    $tag_version = pack('CvCV', 0x03, 1, 0x11, 60);
    $tag_port = pack('CvCV', 0x03, 1, 0x20, 285);
    $tag_id = pack('CvCV', 0x03, 1, 0xfb, 50596992);
    $message_body = $message_type . $user_hash . $client_id . $tcp_port . $tag_count . $tag_name . $tag_version . $tag_port . $tag_id;
    $message_size = pack('V', strlen($message_body));
    $message_header = $protocol_type . $message_size;
    $message = $message_header . $message_body;
   
    fwrite($fp, $message);

    // server message
    $out = '';
    $out = fread($fp, 8);
    $l = strlen($out);
    $out = unpack('H2protocal_type/Vmessage_size/H2message_type/vstring_length', $out);
   
    $out = fread($fp, $out['string_length']);
   
    fclose($fp);
}

没有评论:

发表评论

注意:只有此博客的成员才能发布评论。