네트워크 프로그래밍에서 데이터 전송은 프로토콜 형식을 엄격하게 따라 보내야합니다. PHP의 Pack () 함수는 지정된 형식의 이진 문자열로 데이터를 패키지하는 데 도움이 될 수 있으며 Socket_Sendto () 는 UDP 프로토콜을 통해 지정된 주소로 데이터를 보내는 데 사용됩니다. 이 기사에서는이 두 기능을 조합하여 데이터의 포장 및 전송을 실현하는 방법을 설명합니다.
Pack () 함수는 지정된 형식 코드를 기반으로 PHP 변수를 이진 문자열로 변환합니다. 예를 들어:
$data = pack("Nn", 12345, 80);
여기서 "NN"은 다음 을 의미합니다.
N : 서명되지 않은 긴 정수 (32 비트, 네트워크 엔지니어, 즉 큰 엔지니어)
N : 서명되지 않은 짧은 정수 (16 비트, 네트워크 엔디언)
패키지 12345 및 80 을 네트워크를 쉽게 전송할 수 있도록 이진 문자열로 정수.
socket_sendto () 는 주로 UDP에 데이터를 보내는 데 사용되며 함수 서명은 다음과 같습니다.
int socket_sendto(resource $socket, string $buf, int $len, int $flags, string $addr, int $port)
$ socket : socket_create () 를 통해 생성 된 소켓 리소스
$ BUF : 전송 될 데이터
$ len : 전송 된 데이터의 길이
$ 플래그 : 플래그, 일반적으로 0으로 설정됩니다
$ addr : 대상 IP 주소
$ 포트 : 대상 포트
"메시지 ID"및 "상태 코드"가 포함 된 패킷을 보내야한다고 가정하면 메시지 ID는 4 바이트 정수로 사용되며 상태 코드는 2 바이트 정수로 사용됩니다.
<?php
// 만들다 UDP Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// 데이터 준비:정보ID상태 코드
$messageId = 1001; // 4 바이트 정수
$statusCode = 200; // 2 바이트 정수
// 사용 pack() 기능 포장 데이터,네트워크 바이트 순서(빅 엔디언)
$data = pack("Nn", $messageId, $statusCode);
// 목적지 주소 및 포트
$ip = "m66.net";
$port = 12345;
// 데이터를 보냅니다
$sent = socket_sendto($socket, $data, strlen($data), 0, $ip, $port);
if ($sent === false) {
echo "socket_sendto() failed: " . socket_strerror(socket_last_error($socket));
} else {
echo "성공적으로 보냈습니다 {$sent} 바이트 데이터 {$ip}:{$port}\n";
}
// 폐쇄 socket
socket_close($socket);
?>
팩 () 함수를 통해 네트워크 프로토콜의 요구 사항을 충족하는 다양한 유형의 데이터를 이진 형식으로 유연하게 인코딩 할 수 있습니다. Socket_sendto () 와 결합하여 패키지 데이터는 UDP 프로토콜을 통해 지정된 서버로 전송되어 효율적인 네트워크 통신을 달성 할 수 있습니다.