현재 위치: > 최신 기사 목록> pack ()를 사용하여 stream_socket_client ()와 함께 원시 데이터를 보냅니다.

pack ()를 사용하여 stream_socket_client ()와 함께 원시 데이터를 보냅니다.

M66 2025-06-04

네트워크 프로그래밍에서 때로는 원격 바이너리 데이터를 원격 서버로 보내야합니다. 특히 특정 프로토콜을 구현할 때. PHP는 지정된 형식의 이진 문자열로 데이터를 패키지 할 수있는 매우 강력한 기능 팩 ()을 제공합니다. Stream_Socket_client () 와 결합 하여이 원시 데이터를 TCP 또는 UDP 연결로 쉽게 보낼 수 있습니다.

이 기사는 PHP의 Pack () 함수를 사용하여 데이터를 패키지 데이터를 사용하여 Stream_Socket_Client () 를 통해 지정된 서버로 전송하는 방법을 자세히 소개합니다.


1. pack () 함수 소개

팩 () 함수는 데이터를 이진 문자열로 변환하는 데 사용됩니다. 첫 번째 매개 변수는 형식 문자열이며, 후속 매개 변수는 패키지화 할 데이터입니다. 형식 문자열에는 다음과 같은 다양한 형식 코드가 포함됩니다.

  • C - 서명되지 않은 문자 (1 바이트)

  • n - 서명되지 않은 짧은 정수 (2 바이트, 큰 엔디 언)

  • n - 서명되지 않은 긴 (4 바이트, Big Endian)

  • A - NUL 캐릭터가 채워진 문자열

  • A - 공간에 채워진 문자열

예를 들어:

 $data = pack('Cnn', 0x01, 300, 400);

여기서 0x01 은 바이트이며 300400은 둘 다 서명되지 않은 2 바이트 정수입니다.


2. stream_socket_client () 소개

Stream_Socket_Client () 는 클라이언트를위한 네트워크 연결을 만드는 데 사용되며 TCP, UDP 및 기타 프로토콜을 지원할 수 있습니다. 일반적인 구문은 다음과 같습니다.

 $socket = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
  • 첫 번째 매개 변수는 주소이며 형식은 tcp : // 도메인 이름 : 포트입니다.

  • 연결은 리소스를 성공적으로 반환하고 실패는 False를 반환합니다.

  • $ errno$ errstr는 오류 코드 및 오류 메시지를 반환합니다.

  • 마지막 매개 변수는 시간 초과 시간 (초)입니다.

이 연결을 통해 fwrite ()를 사용하여 데이터를 보내고 fread ()를 보내 데이터를 수신 할 수 있습니다.


3. 예 : Pack () 및 Send가있는 패키지 데이터

프로토콜 패킷을 서버로 보내야한다고 가정하면 형식은 다음과 같습니다.

  • 1 바이트 명령 코드, 0x10 에 수정되었습니다

  • 2 바이트의 사용자 ID, Big Endian

  • 4 바이트 타임 스탬프, Big Endian

  • 8 바이트 스트링 (8 바이트 미만, 우주 패딩)

PHP 코드 예 :

 <?php

// 대상 서버 정보
$host = "m66.net";
$port = 12345;

// 만들다 TCP 연결하다
$socket = stream_socket_client("tcp://$host:$port", $errno, $errstr, 10);
if (!$socket) {
    die("연결하다失败: $errstr ($errno)\n");
}

// 데이터 준비
$command = 0x10;
$userId = 1025;
$timestamp = time();
$username = "user123";

// 포장 데이터
// C - 1바이트 부호없는 정수
// n - 2조정되지 않은 짧은 정수(빅 엔디언)
// N - 4조정되지 않은 긴 정수(빅 엔디언)
// A8 - 길이는입니다8끈,우주 충전
$packedData = pack('CnNA8', $command, $userId, $timestamp, $username);

// 데이터를 보냅니다
fwrite($socket, $packedData);

// 서버 응답을 읽습니다(서버가 돌아올 것이라고 가정합니다 4 바이트 응답 코드)
$response = fread($socket, 4);
if ($response !== false) {
    $responseCode = unpack('N', $response)[1];
    echo "서버 응답 코드: $responseCode\n";
} else {
    echo "서버 응답이 수신되지 않았습니다\n";
}

fclose($socket);

4. 주요 포인트 요약

  • Pack ()를 사용하면 다양한 데이터 유형을 이진 데이터로 쉽게 변환하여 네트워크 전송에 적합 할 수 있습니다.

  • Stream_Socket_Client ()는 네트워크 연결을 생성하는 데 사용되며 여러 프로토콜을 지원합니다.

  • 이진 데이터를 보낼 때 양 당사자가 프로토콜 형식, 특히 데이터 길이 및 바이트 순서를 지속적으로 이해하도록하십시오.

  • 데이터를 읽을 때 Unpack ()을 사용하여 원래 이진 데이터를 구문 분석해야합니다.