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
로 지정된 변수로 페치됩니다. 오류가 발생하거나 연결이 재설정되거나 사용 가능한 데이터가 없으면data
가null
로 설정됩니다. 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.