소켓 서버(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 $... ]] )
| 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" 카테고리의 다른 글
- PHP 표준입력 (Scanf) (댓글 0개 / 트랙백 0개) 2009/02/26
- 검색 엔진 최적화 (SEO) 에 대한 검색엔진별 검색 결과 분석 (댓글 0개 / 트랙백 0개) 2010/05/19
- PHP MSSQL 프로시져 사용 (댓글 0개 / 트랙백 0개) 2009/06/11
- ImageMagick 을 이용한 PDF 이미지 변환 (댓글 0개 / 트랙백 0개) 2010/07/29
- PHP XML 다루기 - Document Object Model (댓글 1개 / 트랙백 0개) 2009/07/28
- MySQL - mysqli 를 사용할 수 없을때 멀티쿼리 및 MYSQL 내부 변수 선... (댓글 1개 / 트랙백 0개) 2010/02/05
- 웹 로그 분석 하기 (댓글 0개 / 트랙백 0개) 2010/05/19
- PHP FreeTDS 사용 (댓글 0개 / 트랙백 0개) 2009/06/12
- DTD란? (댓글 0개 / 트랙백 0개) 2009/03/31
- 검색엔진 최적화 : SEO (Search Engine Optimization) (댓글 2개 / 트랙백 0개) 2010/05/19
