C 소켓과 PHP Socket 데이터 통신 - C 구조체 이용
컨텐츠 정보
- 43,102 조회
- 0 추천
- 목록
본문
소켓 서버(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
등록된 댓글이 없습니다.