현재 위치: > 최신 기사 목록> socket_cmsg_space를 사용하여 socket_recvmsg와 함께 메시지 공간을 계산하십시오.

socket_cmsg_space를 사용하여 socket_recvmsg와 함께 메시지 공간을 계산하십시오.

gitbox 2025-05-28

php에서 socket_recvmsgsocket_cmsg_space 함수는 일반적으로 기본 소켓 통신을 처리하는 데 사용됩니다. 네트워크와 관련된 메시지를 처리 ​​해야하는 경우 메시지 헤더, 데이터 및 관련 제어 정보를 처리해야합니다. socket_recvmsg 함수는 데이터를 수신하고 메시지 버퍼에 저장하는 데 사용할 수 있으며 제어 정보의 공간 크기는 socket_cmsg_space를 통해 계산할 수 있습니다. 이 기사는이 두 기능을 결합하여 메시지 공간을 효과적으로 계산하는 방법을 자세히 설명합니다.

1. Socket_RecvmsgSocket_cmsg_space를 소개합니다

socket_recvmsg 함수

socket_recvmsg 함수는 네트워크 메시지를 수신하기 위해 PHP의 기본 소켓 함수입니다. 데이터를 수신 할뿐만 아니라 메시지와 관련된 제어 정보를 처리 할 수 ​​있습니다. 기능 프로토 타입은 다음과 같습니다.

 socket_recvmsg($socket, $message, $flags);
  • $ 소켓 : 소켓이 데이터를 수신해야합니다.

  • $ 메시지 : 일반적으로 데이터 버퍼가 포함 된 스토어를 수신 한 데이터를 저장하는 배열.

  • $ 플래그 : 데이터를 수신하는 플래그, 일반적으로 정수 값은 msg_peek 등과 같은 다른 플래그로 설정할 수 있습니다.

socket_cmsg_space 함수

socket_cmsg_space 함수는 메시지를 수신 할 때 필요한 공간을 계산하는 데 사용됩니다. 이것은 일반적으로 제어 정보의 크기를 계산하는 데 사용되며, 수신 된 메시지에 충분한 공간을 할당하도록합니다. 프로토 타입은 다음과 같습니다.

 socket_cmsg_space($level, $type);
  • $ 레벨 : 메시지 제어 레벨, 일반적으로 Sol_Socket 과 같은 프로토콜 레벨에서.

  • $ 유형 : SO_RCVBUF 등과 같은 메시지 유형을 제어합니다.

2. Socket_recvmsgSocket_cmsg_space 와 함께 사용하십시오

이 두 함수를 조합하여 사용하는 경우 먼저 Socket_cmsg_space를 사용하여 예상 제어 메시지 공간을 계산해야합니다. 다음으로 Socket_RecVMSG를 통해 데이터를 수신하고 데이터를 저장하고 정보를 제어하기에 충분한 메모리가 할당되도록 할 수 있습니다.

2.1 샘플 코드

 <?php
// 소켓을 만듭니다
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

// 바인드 포트
socket_bind($socket, '0.0.0.0', 12345);

// 메시지의 제어 정보를 계산하는 데 필요한 공간
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$control_space = socket_cmsg_space($level, $type);

// 메시지를 수신하는 데 필요한 버퍼 공간을 계산하십시오
$buffer_size = 1024 + $control_space;

// 메시지 버퍼를 만듭니다
$message = socket_cmsg_space($level, $type);
$buffer = str_repeat("\0", $buffer_size);

// 사용 socket_recvmsg 데이터를 수신합니다
$bytes_received = socket_recvmsg($socket, $message, 0);

// 수신 된 데이터를 처리합니다
if ($bytes_received !== false) {
    echo "받았다 $bytes_received 바이트 데이터: " . bin2hex($message) . PHP_EOL;
} else {
    echo "데이터를 수신합니다失败: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}

// 소켓을 닫으십시오
socket_close($socket);
?>

2.2 설명

위의 예에서 먼저 UDP 소켓을 생성하고 포트를 바인딩합니다. 그런 다음 socket_cmsg_space 함수를 사용하여 제어 정보를 수신하는 데 필요한 공간을 계산 하고이 공간에 따라 총 버퍼 크기를 계산합니다. 마지막으로, socket_recvmsg 함수를 사용하여 데이터를 수신하고 $ 메시지 변수에 저장하십시오.

3. 요약

Socket_recvmsgSocket_cmsg_space 기능을 결합하면 네트워크 데이터를 수신 할 때 데이터 및 제어 정보를 저장할 수있는 충분한 공간이 있는지 확인할 수 있습니다. socket_cmsg_space 함수는 제어 정보에 할당 해야하는 공간을 계산하는 데 도움이되기 때문에 특히 유용하지만 Socket_recvmsg는 실제 메시지 수신에 사용됩니다. 이 두 기능은 결합하여 기본 네트워크 통신을보다 유연하고 효과적으로 관리 할 수 ​​있습니다.

기본 소켓 커뮤니케이션에 대한 요구가 더 높으면이 두 기능이 어떻게 더 나은 메시지를 받고 처리하는 데 도움이 될 수 있는지 이해합니다.