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
“무릇 물이란 지세를 따라 흐르되 작은 틈도 놓치지 않고 적시니 지혜를 갖춘 자와 같고, 움직이면서 아래로 흘러가니 예를 갖춘 자와 같으며, 어떤 깊은 곳도 머뭇거리지 않고 들어가니 용기를 가진 자와 같고 장애물이 막혀서 갇히면 고요히 맑아지니 천명을 아는 자와 같으며, 험한 곳을 거쳐 멀리 흐르지만 끝내 남을 허물어뜨리는 법이 없으니 덕을 가진 자와 같다. 천지는 이것으로 이루어지고, 만물은 이것으로 살아가며, 나라는 이것으로 안녕을 얻고, 만사는 이것으로 평안해지며, 만물은 이것으로 바르게 되는 것이다. 이것이 지혜로운 자가 물을 좋아하는 이유이다.” (한영, <<한시외전>>)