현재 위치: > 최신 기사 목록> Pack ()를 사용하여 네트워크 프로토콜을위한 이진 데이터 패킷을 만듭니다.

Pack ()를 사용하여 네트워크 프로토콜을위한 이진 데이터 패킷을 만듭니다.

M66 2025-05-29

PHP 네트워크 커뮤니케이션 프로그램을 작성할 때 종종 특정 프로토콜 형식을 준수하는 이진 데이터 패킷을 구축해야합니다. 이 경우 Pack () 함수는 필수 도구입니다. PHP 변수를 지정된 형식의 이진 문자열로 포장 할 수 있으므로 기본 네트워크 또는 하드웨어와의 통신에 편리합니다.

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

Pack () 는 PHP의 내장 기능이며 기본 구문은 다음과 같습니다.

 string pack(string $format, mixed ...$values)
  • $ 형식은 후속 데이터를 패키지하는 방법을 지정하는 데 사용되는 형식 문자열입니다.

  • $ 값은 포장 해야하는 값입니다.

Pack () 을 통해 생성 된 데이터는 일반적으로 TCP/IP 프로토콜의 요청 메시지, 게임 서버의 클라이언트 메시지, 사물 인터넷 센서에서보고 한 데이터 등과 같은 특정 통신 프로토콜 형식을 준수하는 이진 구조를 구축하는 데 사용됩니다.

2. 일반적인 형식 문자 설명

다음은 몇 가지 일반적인 형식 문자와 그 의미입니다.

형식 문자 설명하다 점유 된 바이트 수
기음 서명되지 않은 숯 (8 비트) 1
N 서명되지 않은 짧은 (16 비트, 네트워크 엔디언) 2
N 서명되지 않은 긴 (32 비트, 네트워크 엔지니어) 4
에이 NUL 완성 된 문자열 (지정된 길이) 변하기 쉬운
에이 공백이 채워진 문자열 (지정된 길이) 변하기 쉬운
시간 16 진수 문자열 (높은 비트 우선 순위) 두 바이트마다
엑스 바이트 채우기 (하나의 바이트 건너 뛰기) 1

네트워크 프로토콜에서 NN은 "네트워크 엔디언"(Big-Endian Endian)이며 크로스 플랫폼 커뮤니케이션에 적합하기 때문에 특히 일반적입니다.

3. 간단한 이진 프로토콜을 구성하십시오

프로토콜 패킷을 구성해야한다고 가정하면 구조는 다음과 같습니다.

  • 1 바이트 : 버전 번호 (서명되지 않은 8 비트)

  • 2 바이트 : 메시지 유형 (부호없는 16 비트)

  • 4 바이트 : 사용자 ID (서명되지 않은 32 비트)

  • 10 바이트 : 사용자 이름 (ASCII, 공간 충전)

우리는 다음과 같은 방법으로 pack ()를 사용할 수 있습니다.

 <?php
$version = 1;          // 1 바이트
$type = 100;           // 2 바이트
$userId = 123456789;   // 4 바이트
$username = 'Alice';   // 최대 10 바이트,완전한 공간

$packet = pack('CnNA10', $version, $type, $userId, $username);

echo bin2hex($packet); // 포장 된 16 진수 결과를 봅니다
?>

이 코드에서 생성 된 $ 패킷은 프로토콜 형식을 준수하며 소켓 또는 스트림을 통해 원격 서비스로 직접 전송 될 수있는 이진 데이터입니다.

4. 서버와의 통신의 예

원격 서버 주소가 M66.net 이고 포트가 9000 이라고 가정하면 TCP 연결을 통해 위에 생성 된 이진 데이터를 보낼 수 있습니다.

 <?php
$fp = stream_socket_client("tcp://m66.net:9000", $errno, $errstr, 5);
if (!$fp) {
    die("연결이 실패했습니다: $errstr ($errno)");
}

// 데이터 패킷 구성
$packet = pack('CnNA10', 1, 100, 123456789, 'Alice');

// 데이터를 보냅니다
fwrite($fp, $packet);

// 응답을 받으십시오
$response = fread($fp, 1024);

// 연결을 닫으십시오
fclose($fp);

echo "서버 응답: " . bin2hex($response);
?>

이것은 pack () 가있는 이진 패키지를 구축하고 원격 서버 (예 : M66.net )로 전송하는 완전한 기본 프로세스입니다.

5. 디버깅 기술

  • Bin2Hex () 또는 포장을 사용하여 포장 된 데이터가 기대치를 충족하는지 확인하고 확인하십시오.

  • Wireshark와 같은 네트워크 패킷 캡처 도구를 사용하여 전송 된 데이터를 분석합니다.

  • 엔지니어에주의를 기울이십시오. 대부분의 네트워크 프로토콜은 네트워크 바이트 주문 형식을 사용합니다.

결론

Pack () 는 기본 바이너리 프로토콜을 처리하기위한 PHP의 강력한 도구입니다. 마스터 링을 사용하면 C/C ++ 서버와 효율적으로 통신하는 데 도움이 될뿐만 아니라 다양한 맞춤형 프로토콜 설계를 구현하는 데 도움이됩니다. 게임 개발, 사물 인터넷 커뮤니케이션 또는 자신의 애플리케이션 계층 프로토콜 구축에 관계없이 Pack ()는 심층적 인 이해와 응용에 가치가있는 기능입니다.