네트워크 프로그래밍에서 때로는 원격 바이너리 데이터를 원격 서버로 보내야합니다. 특히 특정 프로토콜을 구현할 때. PHP는 지정된 형식의 이진 문자열로 데이터를 패키지 할 수있는 매우 강력한 기능 팩 ()을 제공합니다. Stream_Socket_client () 와 결합 하여이 원시 데이터를 TCP 또는 UDP 연결로 쉽게 보낼 수 있습니다.
이 기사는 PHP의 Pack () 함수를 사용하여 데이터를 패키지 데이터를 사용하여 Stream_Socket_Client () 를 통해 지정된 서버로 전송하는 방법을 자세히 소개합니다.
팩 () 함수는 데이터를 이진 문자열로 변환하는 데 사용됩니다. 첫 번째 매개 변수는 형식 문자열이며, 후속 매개 변수는 패키지화 할 데이터입니다. 형식 문자열에는 다음과 같은 다양한 형식 코드가 포함됩니다.
C - 서명되지 않은 문자 (1 바이트)
n - 서명되지 않은 짧은 정수 (2 바이트, 큰 엔디 언)
n - 서명되지 않은 긴 (4 바이트, Big Endian)
A - NUL 캐릭터가 채워진 문자열
A - 공간에 채워진 문자열
예를 들어:
$data = pack('Cnn', 0x01, 300, 400);
여기서 0x01 은 바이트이며 300 과 400은 둘 다 서명되지 않은 2 바이트 정수입니다.
Stream_Socket_Client () 는 클라이언트를위한 네트워크 연결을 만드는 데 사용되며 TCP, UDP 및 기타 프로토콜을 지원할 수 있습니다. 일반적인 구문은 다음과 같습니다.
$socket = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
첫 번째 매개 변수는 주소이며 형식은 tcp : // 도메인 이름 : 포트입니다.
연결은 리소스를 성공적으로 반환하고 실패는 False를 반환합니다.
$ errno 및 $ errstr는 오류 코드 및 오류 메시지를 반환합니다.
마지막 매개 변수는 시간 초과 시간 (초)입니다.
이 연결을 통해 fwrite ()를 사용하여 데이터를 보내고 fread ()를 보내 데이터를 수신 할 수 있습니다.
프로토콜 패킷을 서버로 보내야한다고 가정하면 형식은 다음과 같습니다.
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);
Pack ()를 사용하면 다양한 데이터 유형을 이진 데이터로 쉽게 변환하여 네트워크 전송에 적합 할 수 있습니다.
Stream_Socket_Client ()는 네트워크 연결을 생성하는 데 사용되며 여러 프로토콜을 지원합니다.
이진 데이터를 보낼 때 양 당사자가 프로토콜 형식, 특히 데이터 길이 및 바이트 순서를 지속적으로 이해하도록하십시오.
데이터를 읽을 때 Unpack ()을 사용하여 원래 이진 데이터를 구문 분석해야합니다.