socket_recvfrom
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_recvfrom — 接続しているかどうかによらず、ソケットからデータを受信する
説明
Socket
$socket
,string
&$data
,int
$length
,int
$flags
,string
&$address
,int
&$port
= null
): int|false
socket_recvfrom() 関数は、
ポート port
(AF_UNIX
型のソケットである場合を除く) 上の address
から受信した length
バイトのデータを
data
に格納します。
socket_recvfrom() は、
接続済みのソケットだけでなく接続していないソケットに対しても使用可能です。
さらに、フラグを指定することでこの関数の挙動を設定できます。
address
と port
は参照渡しとしなければなりません。接続していないソケットの場合は、
address
はリモートホストの IP アドレスか
UNIX ソケットへのパスとなります。接続済みのソケットの場合は、
address
は null
とします。
また、AF_INET
あるいは
AF_INET6
形式のまだ接続していないソケットの場合、
port
にはリモートホストのポート番号を指定します。
注意: この関数はバイナリデータに対応しています。
パラメータ
socket
-
socket
には、 socket_create() で作成した Socket クラスのインスタンスを指定します。 data
-
受信したデータが
data
に格納されます。 length
-
最大
length
バイトまでのデータをリモートホストから取得します。 flags
-
flags
の値は、以下のフラグの任意の組み合わせを 論理 OR 演算子 (|
) で連結したものとなります。flags
に使用できる値フラグ 説明 MSG_OOB
帯域外 (out-of-band) のデータを処理する。 MSG_PEEK
受信キューの先頭にあるデータを受信し、 そのデータをそのままキューに残しておく。 MSG_WAITALL
少なくとも length
バイト受信するまではブロックする。 しかし、もし何らかのシグナルを受信したりリモートホストとの接続が切断された場合は これより少ないバイト数を返す可能性がある。MSG_DONTWAIT
通常はブロックする場面であってもそのまま return する。 address
-
AF_UNIX
型のソケットの場合は、address
はファイルへのパスとなります。 それ以外の場合は、未接続のソケットの場合にはaddress
はリモートホストの IP アドレスとなります。 接続済みソケットの場合はnull
となります。 port
-
この引数は
AF_INET
型あるいはAF_INET6
型のソケットに対してのみ適用され、 データを受信するリモートホストのポートを指定します。 接続済みソケットの場合はport
はnull
となります。
戻り値
socket_recvfrom() は、受信したバイト数を返します。
あるいはエラー時には false
を返します。
エラーコードを取得するには socket_last_error()
をコールします。取得したエラーコードを
socket_strerror() に渡すと、
そのエラーについての説明を得ることができます。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 |
socket は、Socket クラスのインスタンスになりました。
これより前のバージョンでは、リソース型でした。
|
例
例1 socket_recvfrom() の例
<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 1223);
$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 12, 0, $from, $port);
echo "リモートアドレス $from のポート $port から $buf を受信しました" . PHP_EOL;
?>
この例は、127.0.0.1 のポート 1223 との UDP ソケットを確立し、受信したデータを最大 12 バイトまで表示します。
参考
- socket_recv() - 接続したソケットからデータを受信する
- socket_send() - 接続したソケットにデータを送信する
- socket_sendto() - 接続しているかどうかによらずソケットにメッセージを送信する
- socket_create() - ソケット(通信時の終端)を作成する
User Contributed Notes 4 notes
If you use socket_recvfrom on a UDP socket and combine it with the MSG_DONTWAIT flag, it will raise a PHP Warning if there is nothing to read. AFAIK, there is no way around that warning except suppressing it with @ (i.e. you cannot check if there is data before calling socket_recvfrom).
MSG_DONTWAIT doesn't seem to exist in windows sockets. However socket_set_nonblock() seems to do the trick.
Pay attention! On some PHP version the MSG_DONTWAIT flag is not defined (see https://bugs.php.net/bug.php?id=48326)
I'm confused about the rerturn value of socket_recvfrom(), it said -1 when failed, but when I call like this:
if (($len = @socket_recvfrom($sock, $result, 32, 0, $ip, $port)) == -1) {
if ($this->_debug) {
echo "socket_read() failed: " . socket_strerror(socket_last_error()) . "\n";
}
return false;
}
variable $len = false, when I change the buffer length from 32 to 4096, it becomes right.