socket_atmark

ソケットに帯域外マークが付けられているかを調べる

説明

bool socket_atmark(Socket $socket)

socket に帯域外マークが付けられているかを調べます。

パラメータ

socket

socket_create で作成した Socket のインスタンス。

戻り値

成功した場合に true を、失敗した場合に false を返します。

例1 ソケットが帯域外データを読み取る準備ができているかを調べるために socket_atmark を使う例

<?php
$socketServer = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_set_option( $socketServer, SOL_SOCKET, SO_REUSEADDR, 1 );
socket_bind( $socketServer, '127.0.0.1' );
socket_listen( $socketServer );

$socketClient = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_getsockname( $socketServer, $stAddr, $uPort );
socket_connect( $socketClient, $stAddr, $uPort );

$socket = socket_accept( $socketServer );
socket_shutdown( $socket, 1 );

$st = 'This is normal data.';
socket_send( $socketClient, $st, strlen( $st ), 0 );
$st = '!'; # TCP では緊急データは 1 バイトしか送れません。
socket_send( $socketClient, $st, strlen( $st ), MSG_OOB );
$st = 'Not so urgent.';
socket_send( $socketClient, $st, strlen( $st ), 0 );
socket_shutdown( $socketClient );

do {
    if ( socket_atmark( $socket ) ) {
        $rc = socket_recv( $socket, $st, 65536, MSG_OOB );
        echo "Received urgent data: ({$rc}) {$st}\n";
    } else {
        $rc = socket_recv( $socket, $st, 1024, 0 );
        echo "Received normal data: ({$rc}) {$st}\n";
    }
} while ( $rc > 0 );
socket_close( $socketServer );
socket_close( $socketClient );
socket_close( $socket );
?>

上の例の出力は以下となります。

Received normal data: (20) This is normal data.
Received urgent data: (1) !
Received normal data: (14) Not so urgent.
Received normal data: (0)

参考

  • socket_connect
  • socket_create