현재 위치: > 최신 기사 목록> 소켓 통신의 팩 () 응용 프로그램 예제

소켓 통신의 팩 () 응용 프로그램 예제

M66 2025-06-03

PHP에서 소켓 통신을 수행 할 때 특히 특정 이진 형식으로 데이터를 전송 해야하는 경우 패키지 (캡슐화) 및 데이터를 풀어야하는 상황이 종종 발생합니다. 팩 () 함수는이 문제를 해결하는 무기입니다. 이 기사는 간단한 예제를 결합하여 소켓 통신에서 Pack () 함수의 특정 사용법을 설명합니다.


pack () 함수는 무엇입니까?

Pack () 는 PHP의 내장 기능으로 지정된 형식에 따라 데이터를 이진 문자열로 패키지 할 수 있습니다. 이러한 방식으로, 처리 된 데이터는 더 작고 네트워크에서 전송하기에 편리합니다.

기본 구문은 다음과 같습니다.

 string pack ( string $format , mixed $args [, mixed $... ] )
  • $ 형식은 정수, 문자, 부동 소수점 등과 같은 포장 규칙을 정의하는 형식 문자열입니다.

  • 후속 매개 변수는 해당 형식의 데이터입니다.


소켓 통신에 팩 ()이 필요한 이유는 무엇입니까?

소켓 통신 중에 데이터는 바이트 스트림으로 전송됩니다. 다른 기계의 엔지니어는 다를 수 있으며 텍스트 또는 일반 데이터를 직접 보내면 수신기가 구문 분석 오류가 발생할 수 있습니다.

Pack ()를 사용하여 :

  • 전송 및 수신 종료의 형식이 일관되도록하기 위해 고정 형식으로 데이터를 인코딩합니다.

  • Endianness 문제를 처리합니다 (Big Endian, Little Endian).

  • 쉽게 전송 및 구문 분석을 위해 고정 된 길이의 이진 데이터를 생성합니다.


예제와 소켓 커뮤니케이션에서 Pack ()의 ​​적용을 설명하십시오.

TCP 소켓을 통해 데이터 패킷을 보내려고한다고 가정하면 형식은 다음과 같습니다.

전지 유형 설명
패키지 길이 서명되지 않은 짧은 (2 바이트) 패키지 길이 필드 자체를 제외하고 패키지 길이
명령 번호 서명되지 않은 짧은 (2 바이트) 명령 ID
데이터 특정 콘텐츠

코드 예제를 보내십시오

 <?php
// 보낸 데이터 시뮬레이션
$command = 1001;
$data = "Hello, socket communication!";

// 데이터 길이를 계산하십시오
$dataLen = strlen($data);

// 패키지의 길이는 명령 번호 길이입니다. + 데이터 길이 (2 + $dataLen)
$packetLen = 2 + $dataLen;

// 사용 pack 패키지 길이 및 명령 번호(사용网络字节序,빅 엔디언)
$header = pack('n', $packetLen) . pack('n', $command);

// 완전한 패키지 스 플라이 싱
$packet = $header . $data;

// 그것이 확립되었다고 가정합니다 socket 연결하다,socket_write 데이터를 보냅니다
// socket_write($socket, $packet, strlen($packet));

echo "发送的二进制데이터 길이: " . strlen($packet) . "\n";
echo "이진 데이터16카테고리 표현: " . bin2hex($packet) . "\n";
?>

분석 지침

  • pack ( 'n', $ packetlen)은 서명되지 않은 짧은 정수 (2 바이트) 및 네트워크 엔지니어 (Big Endian)에 $ packetlen을 포장하는 것을 의미합니다.

  • 팩 ( 'n', $ command) 마찬가지로 명령 번호를 포장하십시오.

  • 스 플라이 싱 후 패키지는 데이터 컨텐츠를 따릅니다.

수신기 구문 분석 예

데이터를 수신 한 후에는 다음과 같이 구문 분석 할 수 있습니다.

 <?php
// 가정 $recvData 예 socket 이진 데이터를 읽으십시오
// 예를 들어: $recvData = socket_read($socket, 1024);

// 먼저 패키지 길이와 명령 번호를 구문 분석합니다
$header = substr($recvData, 0, 4);
list($packetLen, $command) = array_values(unpack('npacketLen/command', $header));

// 데이터 내용을 추출하십시오
$data = substr($recvData, 4, $packetLen - 2);

echo "패키지 길이: $packetLen\n";
echo "명령 번호: $command\n";
echo "데이터 컨텐츠: $data\n";
?>

요약

  • PACK () 기능은 이진 데이터 포장을위한 강력한 도구이며 다양한 네트워크 프로토콜 및 이진 파일 작업에 적합합니다.

  • 소켓 통신에서 Pack () 의 ​​합리적인 사용은 일관된 데이터 형식과 안정적인 통신을 보장 할 수 있습니다.

  • Unpack () 함수와 결합하여 이진 데이터 구문 분석을 쉽게 수행 할 수 있습니다.

  • Endianness 문제에 특별한주의를 기울이십시오. 네트워크 커뮤니케이션은 일반적으로 네트워크 엔지니어 (Big Endianness)를 채택하며 'N' 형식을 사용하여 짧은 정수를 포장하는 것이 가장 일반적입니다.

이진 프로토콜을 기반으로 네트워크 통신을 수행하는 경우 Pack ()Unpack ()를 더 연습하는 것이 좋습니다. 이는 패킷을 처리하는 능력을 크게 향상시킬 수 있습니다.