현재 위치: > 최신 기사 목록> socket_create, socket_bind 및 socket_set_block을 결합하는 방법

socket_create, socket_bind 및 socket_set_block을 결합하는 방법

gitbox 2025-05-28

PHP의 소켓 프로그래밍에서 Socket_set_block () 함수는 소켓을 차단 모드로 설정하는 데 사용됩니다. 차단 모드에서는 socket_accept () 또는 socket_read ( )와 같은 I/O 작업이 데이터를 사용할 수 있거나 연결이 완료 될 때까지 대기합니다. 이는 클라이언트 요청을 동기화 해야하는 서버 프로그램에서 특히 중요합니다.

이 기사는 Socket_create ()Socket_bind ()를 결합하여 차단 모드를 기반으로 소켓 서버를 만드는 방법을 보여줍니다.

1. socket_set_block 소개

socket_set_block (Resource $ 소켓) : bool

이 함수는 지정된 소켓을 차단 모드로 설정하고 반환 값은 부울으로 설정이 성공했는지 여부를 나타냅니다.

차단 모드는 기본 동작이지만 socket_set_nonblock () 호출 한 경우 socket_set_block ()을 사용하여 복원해야합니다.

2. 차단 모드 연결 구현의 완전한 예

아래는 socket_create () , socket_bind () , socket_listen ()socket_accept () 와 같은 함수를 사용하여 완전한 PHP 서버 예제이며 명시 적으로 차단 모드를 설정합니다.

<code> & lt;? php // 생성 tcp socket $ socket = socket_create (af_inet, sock_stream, sol_tcp); if ($ socket === false) {die ( "socket_create () 실패 :". socket_strerror (socket_last_error ()). "\ n"); }

// 차단 모드로 설정합니다
if (! socket_set_block ($ socket)) {
die ( "차단 모드로 설정할 수 없습니다 :". socket_strerror (socket_last_error ($ socket)). "\ n");
}

// 바인드 IP 및 포트
$ host = '0.0.0.0';
$ port = 12345;
if (! socket_bind ($ socket, $ host, $ port)) {
die ( "socket_bind () 실패 :". socket_strerror (socket_last_error ($ socket)). "\ n");
}

// 연결을 듣습니다
if (! socket_listen ($ socket, 5)) {
die ( "socket_listen () 실패 :". socket_strerror (socket_last_error ($ socket)). "\ n");
}

echo "서버가 시작되고 {$ host} : {$ port} ... \ n"에서 듣습니다.

while (true) {
Echo "클라이언트 연결 대기 ... \ n";
$ client = socket_accept ($ socket);
if ($ client === false) {
echo "socket_accept () 실패 :". socket_strerror (socket_last_error ($ socket)). "\N";
계속하다;
}

 echo "클라이언트가 연결되어 있습니다,읽기 데이터...\n";

// 클라이언트 메시지를 읽으십시오(데이터가 수신 될 때까지 차단하십시오)
$input = socket_read($client, 1024);
echo "메시지를 받았습니다: " . trim($input) . "\n";

$response = "서버에 연결하는 데 오신 것을 환영합니다!당신은 보냈습니다:" . trim($input);
socket_write($client, $response, strlen($response));

socket_close($client);

}

// 메인 소켓을 닫습니다
socket_close ($ socket);
</코드>

3. 클라이언트 테스트 방법

Telnet 도구를 사용하여 서버에 연결할 수 있습니다.

 telnet 127.0.0.1 12345

텍스트를 입력하면 서버가 보낸 내용에 응답합니다.

4. 실제 응용 시나리오

차단 모드는 다음 시나리오에 적합합니다.

  • 간단한 직렬 서버 모델

  • 한 번에 하나의 클라이언트 연결 만 처리됩니다

  • 실시간이 거의 필요한 서비스

그러나 동시 응용 분야의 경우 일반적으로 다중 프로세스 또는 비동기 방법과 함께 비 블로킹 모드를 사용하는 것이 좋습니다.

5. 팁

디버깅 및 배포시 Error_Log 또는 로그 파일과 함께 소켓 오류 정보를 출력하여 문제를 신속하게 찾는 것이 좋습니다. 예를 들어, 오류는 파일에 쓸 수 있습니다.

 error_log("socket_error: " . socket_strerror(socket_last_error()), 3, "/var/log/php_socket_error.log");

6. 요약

socket_set_block () 을 통해 소켓의 I/O 동작을 유연하게 제어 할 수 있습니다. 경우에 따라 차단 모드를 명시 적으로 설정하면 기본 동작 수정으로 인해 예외 문제를 피할 수 있습니다. socket_create ()socket_bind () 와 결합하면 논리 순서가 올바른지 확인하고, 즉, 먼저 생성, 바인딩 한 다음 청취 및 차단 모드를 설정하여 안정적인 소켓 서버 프로그램을 구축 할 수 있습니다.

위의 예에서는 서버에 배포하면 브라우저 또는 API 요청 (실제로 IP 및 포트 구성에 따라)을 통해 연결 테스트를 http://gitbox.net:12345 로 보낼 수 있습니다.

이 기사가 socket_set_block () 의 ​​사용법을 이해하는 데 도움이되기를 바랍니다.