PHP & Others

C 소켓과 PHP Socket 데이터 통신 - C 구조체 이용

페이지 정보

본문

소켓 서버(C/C++ 작성) 와 PHP Socket 간의 데이터 송수신을 구조체를 이용할때
 C로 작성된 부분에서 받은 데이터를 memcpy로 구조체 메모리 영역에 복사 할 경우 
PHP 에서 작성된 데이터를 넘기는 방식은 PHP 표준 함수 중에 pack 를 이용하면 된다.

PHP -> C

PHP Socket 에서 C Socket 으로 데이터를 구조체 형식으로 넘겨줄때

PHP

   1. $nNumber = 1234;  
   2. $strMsg = '안녕하세요';  
   3.   
   4. $strMsg = pack("i", $nNumber);      
// pack : PHP 변수 $nNumber 를 플랫폼에 종속적인 크기와 바이트 오더로 변경시켜 리턴한다.   
   5. $strMsg .= $strMsg . str_replace("\0", 30 - strlen($strMsg)); 
// C 에서 받을 구조체 내부의 변수 strMsg[30]에 메세지 길이 이외의 부분은 \0 로 넘겨준다.   
   6.   
   7. // 소켓 연결 및 기타 부분 생략  
   8.   
   9. socket_write($sock, $strMsg, strlen($strMsg)); 
// socket write 를 이용해 메세지를 보낸다.   

	$nNumber = 1234;
	$strMsg = '안녕하세요';
	
	$strMsg = pack("i", $nNumber);		
// pack : PHP 변수 $nNumber 를 플랫폼에 종속적인 크기와 바이트 오더로 변경시켜 리턴한다. 
	$strMsg .= $strMsg . str_replace("\0", 30 - strlen($strMsg)); 
// C 에서 받을 구조체 내부의 변수 strMsg[30]에 메세지 길이 이외의 부분은 \0 로 넘겨준다. 
	
	// 소켓 연결 및 기타 부분 생략
	
	socket_write($sock, $strMsg, strlen($strMsg)); 
// socket write 를 이용해 메세지를 보낸다. 


C

   1. /* 구조체 형식 */  
   2. typedef struct {  
   3.     int nNumber1;  
   4.     char strMsg[30];  
   5. } stTest  
   6.   
   7. char szGetData[100];    // 데이터를 받을 변수   
   8.   
   9. // 소켓 연결 및 기타 부분 생략  
  10.   
  11. // 소켓으로 받은 데이터를 szGetData 에 넣는다.   
  12. recv(sock, szGetData, sizeof(szGetData), 0);  
  13.   
  14. // 받은 데이터를 szTest 구조체 에 복사를 한다.   
  15. memcpy((char*)&stTest, szGetData, sizeof(struct stTest));  

	/* 구조체 형식 */
	typedef struct {
		int nNumber1;
		char strMsg[30];
	} stTest
	
	char szGetData[100];	// 데이터를 받을 변수 
	
	// 소켓 연결 및 기타 부분 생략
	
	// 소켓으로 받은 데이터를 szGetData 에 넣는다. 
	recv(sock, szGetData, sizeof(szGetData), 0);
	
	// 받은 데이터를 szTest 구조체 에 복사를 한다. 
	memcpy((char*)&stTest, szGetData, sizeof(struct stTest));


위와 같이 사용을 할 수 있다.  
만약 구조체에 다른 형의 변수가 있다면 아래 pack 함수에서 사용할 수 있는 포멧 캐릭터를 이용하면 된다.

PHP 의 pack 함수의 사용방법
string pack ( string $format [, mixed $args [, mixed $... ]] )

a 	NUL-padded string
A 	SPACE-padded string
h 	Hex string, low nibble first
H 	Hex string, high nibble first
c 	signed char
C 	unsigned char
s 	signed short (always 16 bit, machine byte order)
S 	unsigned short (always 16 bit, machine byte order)
n 	unsigned short (always 16 bit, big endian byte order)
v 	unsigned short (always 16 bit, little endian byte order)
i 	signed integer (machine dependent size and byte order)
I 	unsigned integer (machine dependent size and byte order)
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)
f 	float (machine dependent size and representation)
d 	double (machine dependent size and representation)
x 	NUL byte
X 	Back up one byte
@ 	NUL-fill to absolute position

관련자료

등록된 댓글이 없습니다.
Today's proverb
유쾌한 사람은 자기 일에만 몰두하는 사람이 아니다. 때론 자신의 일을 전부 제쳐놓고 타인의 문제에 전력을 쏟는 열정이 있는 사람이다. 타인에게 자신의 힘을 나누어주고 마음을 열어주는 것은 자신의 삶을 행복하게 만드는 방법이다.