Sockets socket_recv

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recv — 연결된 소켓에서 데이터 수신


설명

socket_recv(
    Socket $socket,
    ?string &$data,
    int $length,
    int $flags
): int|false
                

socket_recv() 함수는 socket에서 data의 데이터 length 바이트를 받습니다. socket_recv()는 연결된 소켓에서 데이터를 수집하는 데 사용할 수 있습니다. 또한 함수의 동작을 수정하기 위해 하나 이상의 플래그를 지정할 수 있습니다.

data는 참조로 전달되므로 인수 목록에서 변수로 지정해야 합니다. socket_recv()에 의해 socket에서 읽은 데이터는 data로 반환됩니다.


매개변수

socket
소켓은 socket_create()에 의해 이전에 생성된 Socket 인스턴스여야 합니다.
data
수신된 데이터는 data로 지정된 변수로 페치됩니다. 오류가 발생하거나 연결이 재설정되거나 사용 가능한 데이터가 없으면 datanull로 설정됩니다.
length
원격 호스트에서 최대 length 바이트를 가져옵니다.
flags
flags 값은 이진 OR(|) 연산자와 결합된 다음 플래그의 조합일 수 있습니다.

flags에 가능한 값

Flag 설명
MSG_OOB 대역 외 데이터를 처리합니다.
MSG_PEEK 큐에서 데이터를 제거하지 않고 수신 큐의 시작 부분에서 데이터를 수신합니다.
MSG_WAITALL 적어도 length가 수신될 때까지 차단합니다. 그러나 신호가 포착되거나 원격 호스트의 연결이 끊어지면 함수가 더 적은 데이터를 반환할 수 있습니다.
MSG_DONTWAIT 이 플래그를 설정하면 일반적으로 차단된 경우에도 함수가 반환됩니다.

반환 값

socket_recv()는 수신된 바이트 수를 반환하거나 오류가 있으면 false를 반환합니다. 실제 오류 코드는 socket_last_error()를 호출하여 검색할 수 있습니다. 이 오류 코드는 오류에 대한 텍스트 설명을 얻기 위해 socket_strerror()에 전달될 수 있습니다.


변경 로그

버전 설명
8.0.0 socket은 이제 Socket 인스턴스를 반환합니다. 이전에는 리소스가 필요했습니다.

Examples

예제 #1 socket_recv() 예제

이 예제는 socket_recv()를 사용하기 위해 예제의 첫 번째 예제를 간단히 다시 작성한 것입니다.

                  
<?php
error_reporting(E_ALL);

echo "<h2>TCP/IP Connection</h2>\n";

/* Get the port for the WWW service. */
$service_port = getservbyname('www', 'tcp');

/* Get the IP address for the target host. */
$address = gethostbyname('www.example.com');

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Reading response:\n\n";
$buf = 'This is my buffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
    echo "Read $bytes bytes from socket_recv(). Closing socket...";
} else {
    echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

echo $buf . "\n";
echo "OK.\n\n";
?>
                  
                

위의 예는 다음과 같은 것을 생성할 것입니다:

<h2>TCP/IP Connection</h2>
OK.
Attempting to connect to '208.77.188.166' on port '80'...OK.
Sending HTTP HEAD request...OK.
Reading response:

Read 123 bytes from socket_recv(). Closing socket...HTTP/1.1 200 OK
Date: Mon, 14 Sep 2009 08:56:36 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
ETag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8

OK.