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

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
자신을 불행한 존재라고 생각하는 사람은 아직도 더 불행해질 여지가 남아있다. 아주 작은 일에도 큰 기쁨을 느끼는 사람에게는 그 어떤 불행도 위력을 상실해 버리고 만다. 그러나 아주 작은 일에도 기쁨을 느낄 수 있는 경지에 이르기까지는 어차피 여러 가지 형태의 불행을 감내하지 않을 수가 없다. 불행이란 알고 보면 행복이라는 이름의 나무 밑에 드리워진 행복만한 크기의 나무그늘 같은 것이다. (이외수 "흐린 세상 건너기" 中에서)