キー押下のコマンドを送信

  • 認証のロジックが理解できなかったので認証なし(-SecurityTypes None)でサーバを起動
  • U16/U32型はとりあえず適当に処理
<?php
// vim: set et ts=4 sw=4 sts=4:

$fp = fsockopen('***.***.***.***', 5901, $errno, $errstr, 10);
if ($fp === false) {
    exit("connect error: {$errno} {$errstr}\n");
}

// ProtocolVersion
$buf = fread($fp, 12);

// v3.3指定
$rc = fwrite($fp, "RFB 003.003\n");

// security-type
$buf = fread($fp, 4);
$st = ord($buf[3]);
if ($st != 1) { // 1:None限定
    fclose($fp);
    exit("not support\n");
}

// ClientInit(1:share)
$rc = fwrite($fp, chr(1));  // shared-flag

// ServerInit
$buf = fread($fp, 2);   // framebuffer-width
$buf = fread($fp, 2);   // framebuffer-height
$buf = fread($fp, 16);  // server-pixel-format
$buf = fread($fp, 4);   // name-length
$buf = fread($fp, ord($buf[3]));    // name-string

// キー入力
sendString('Hello');

fclose($fp);

function sendString($s)
{
    for ($i = 0; $i < strlen($s); $i++) {
        sendKey($s[$i]);
    }
}

function sendKey($c)
{
    global $fp;
    $rc = fwrite($fp, chr(4));  // message-type(4:KeyEvent)
    $rc = fwrite($fp, chr(1));  // down-flag(1:down)
    $rc = fwrite($fp, '  ');    // padding
    $rc = fwrite($fp, chr(0) . chr(0) . chr(0) . $c);   // key
}

参考


  • Next