php에서 socket_getsockname 및 socket_cmsg_space는 소켓을 사용하여 네트워크를 프로그래밍 할 때 일반적으로 사용되는 두 가지 기능입니다. 그들은 개발자가 특히 네트워크 통신을 처리 할 때 소켓에 대한 자세한 정보를 얻도록 도와줍니다. 이 기사는이 두 기능을 결합하여 소켓 정보를 얻는 방법을 소개합니다.
Socket_getSockName 함수는 연결된 소켓과 관련된 로컬 주소 정보를 얻는 데 사용됩니다. 이것은 현재 호스트와 원격 호스트 사이의 연결 상태를 얻는 데 매우 중요합니다. 함수는 다음과 같이 정의됩니다.
int socket_getsockname ( int $socket , string &$address , int &$port )
$ socket : 유효한 소켓 자원입니다.
$ 주소 : 소켓의 로컬 주소를 반환합니다.
$ 포트 : 소켓의 포트 번호를 반환합니다.
socket_cmsg_space 함수는 현재 메시지 제어 데이터 (CMSG)에 필요한 공간을 반환하는 데 사용됩니다. 그 목적은 제어 메시지에 대한 공간을 올바르게 할당하기 위해 특정 프로토콜에 대한 메시지 제어 데이터의 크기를 계산하는 것입니다.
int socket_cmsg_space ( int $level , int $type )
$ 레벨 : 프로토콜 계층, 일반적으로 sol_socket을 지정합니다.
$ 유형 : SO_RCVBUF 와 같은 메시지 유형을 제어합니다.
이 두 기능을 조합하여 어떻게 사용하는지 더 잘 이해하기 위해 소켓 정보를 얻기 위해 socket_getsockname 및 socket_cmsg_space를 사용하는 방법을 보여주는 간단한 PHP 샘플 코드가 있습니다.
<?php
// a TCP 소켓
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "소켓创建失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 绑定소켓
$address = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $address, $port) === false) {
echo "소켓绑定失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 获取소켓的本地地址和端口
if (socket_getsockname($socket, $localAddress, $localPort) === false) {
echo "获取소켓信息失败: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "소켓本地地址: $localAddress\n";
echo "소켓本地端口: $localPort\n";
}
// 제어 메시지 공간을 얻으십시오
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$space = socket_cmsg_space($level, $type);
echo "메시지 공간 크기를 제어하십시오: $space\n";
// 关闭소켓
socket_close($socket);
?>
소켓 생성 : 먼저 Socket_create를 통해 TCP 소켓을 만듭니다. AF_INET은 IPv4 프로토콜을 사용하는 것을 의미하며, SOCK_STREAM은 스트림 소켓을 사용하는 수단이며 SOL_TCP는 전송 계층 프로토콜입니다.
바운드 소켓 : Socket_를 사용하여 소켓을 특정 로컬 주소 및 포트에 바인딩합니다 (이 예에서는 주소는 127.0.0.1 이고 포트는 8080 입니다).
소켓 정보 가져 오기 : 소켓의 로컬 주소를 가져 와서 socket_getsockname 함수를 통해 포트를 가져 와서 출력하십시오.
제어 메시지 공간 크기 계산 : Socket_CMSG_SPACE 필요한 제어 메시지 공간을 계산하고 크기를 출력합니다. 여기서 우리는 SO_RCVBUF를 사용하여 수신 버퍼의 제어 메시지 크기를 얻습니다.
소켓 닫기 : Socket_close 기능을 사용하여 소켓을 닫습니다.
Socket_getSockName 과 Socket_CMSG_SPACE 의이 조합은 특히 다음 시나리오에서 네트워크 프로그래밍의 소켓에 대한 자세한 정보를 유연하게 얻을 수 있습니다.
네트워크 디버깅 : 소켓 연결을 디버그하고 로컬 주소 및 포트를 얻고 연결 문제를 해결하는 데 사용할 수 있습니다.
데이터 흐름 제어 : 제어 메시지의 공간 크기를 계산하여 개발자는 수신 및 전송 버퍼를 효과적으로 관리하여 데이터 전송의 효율성과 안정성을 보장 할 수 있습니다.
socket_getSockName을 사용하는 경우 소켓이 성공적으로 바인딩되었는지 확인하십시오. 그렇지 않으면 함수가 오류를 반환합니다.
제어 메시지 공간을 계산할 때 다른 프로토콜 및 제어 메시지 유형에 따라 다른 공간 크기가 필요할 수 있으므로 올바른 레벨 및 유형 매개 변수를 사용해야합니다.