2012-03-16 4 views
4

PHP Sockets을 사용하여 네트워크 연결을 통해 PHP 스크립트에서 C#으로 JSON 메시지를 보내려고합니다.길이가 앞선 소켓 데이터 보내기

Usually, for binary protocols, 모든 메시지의 처음 4 바이트는 메시지의 길이 (몇 바이트)를 나타내는 정수 여야합니다.

는 C#에서 나는 다음과 같이 메시지의 길이를 알려주는 정수로 모든 메시지를 접두사 :

byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");    
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length); 
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length]; 
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length); 
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length); 

내가 알고있는 것처럼

, PHP에서 함수 socket_send는 문자열을 받아들입니다. 그렇다면 PHP 5.x에서 같은 접두사를 사용하려면 어떻게해야합니까?

업데이트 : 네트워크 소켓에서받은 경우 이러한 접두사가 붙은 데이터를 처리하는 방법에 대해 follow-up question 게시했습니다.

답변

5

PHP 문자열은 바이너리입니다.

n un 부호있는 정수를 4 진수 (4 옥텟 32 비트) 문자열로 이진 표현으로 인코딩해야합니다. pack 참조 :

# choose the right format according to your byte-order needs: 

l signed long (always 32 bit, machine byte order) 
L unsigned long (always 32 bit, machine byte order) 
N unsigned long (always 32 bit, big endian byte order) 
V unsigned long (always 32 bit, little endian byte order) 

$string = pack('l', $length); 
5

을 당신이 바이너리 문자열의 바이트 수를 변환하는 pack()을 사용할 수있는 것 같아요. 네트워크를 통해 데이터를 전송할 때 "N"(부호없는 long, 항상 32 비트, big endian 바이트 순서) 형식을 사용하여 변환해야 할 수도 있습니다.

$s="Hello World"; 
$length=pack("N",strlen($s)); 
socket_send($sock,$length.$s,4+strlen($s)); 
+2

것은 왜 "N"(빅 endian 바이트 순서)를 사용하는 : 여기

은 예입니다? – Mike

+2

@Mike : 여기에 해당 유형이있는 .Net 제품 설명서를 참조하십시오. 아마 32 비트 부호있는 정수, 엔디안은 컴퓨터에 따라 다릅니다. 또한 사용중인 프로토콜의 사양을 확인하십시오. 그래서'L','N'과'V'는 잘못 될 가능성이 있습니다. (제 대답에도 그것들을 사용하고있는 사양으로 다시 확인해야합니다). – hakre

+2

@hakre 귀하의 도움에 감사드립니다. C# 응용 프로그램이 리틀 엔디안을 사용하는 것 같습니다. 'V'가 가장 좋은 옵션이되어야합니다. 맞습니까? – Mike