"소켓 프로그래밍"에 해당되는 글 1건

  1. 2009/05/19 C 소켓과 PHP Socket 데이터 통신 - C 구조체 이용 (1)

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

PHP -> C

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

PHP

	$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
/* 구조체 형식 */ 
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 $... ]] )

format characters>$2
Code Description
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

"Tip" 카테고리의 다른 글