메뉴 건너뛰기

Dev tips

http://blog.naver.com/roadkh/42316061

이번에 소켓으로 서버측 데몬과 통신해서 값을 가져오는 부분을 구현하게 되었다.

PHP 한 일년 손에서 놨더니 이젠 substr 의 함수이름도 까먹어서 찾는 상황이 되었지만..

어쨌건 구현을 하게 되었다.

초반에 시작할때는 socket library 를 이용해서 non-blocking 모듈로 구현을 해 보려는 시도를 했으나, 곧 귀차니즘과 기술의 부족함으로 인하여 결국 그냥 포기!!!

fsockopen을 이용하게 되었다.

fsockopen을 이용하면 소켓 통신이 굉장히 단순하게 구현되는데.. 물론 단점이 있으니까 실력있는 사람이라면 socket library를 이용하는게 좋겠다. 난 허접해서리..

암튼 간단하게 구현을 마치고...

이제 전문만 맞추면 되는데, 전문에 들어가있는 header 부분과  body를 구성하기 시작했다.

대략 대부분 character 타입으로 구성되어있어서 맞추는데 어려움이 없었는데... (여기서 chr() 함수를 많이 쓰긴 했다)

문제가 발생... 4바이트와 2바이트 int 값이 있는데 이걸 어떻게 맞출 것인가...

잠시 예전에 썼던 무언가가 있는데, 어떤거였지를 고민하다가 결국 다시 찾았다. (이제 잊어버리지 않기 위해 블로그에 남기는 중인데..)

pack과 unpack 함수!!!

pack과 unpack은 꼭 네트워크 통신에서만 사용하는건 아니다. 암호화 알고리즘을 만들고 싶을때도 쓸수 있고, 그 밖에도 binary string으로 변환했다가 다시 변환해 와야 하는 경우라면 모두 쓸 수 있다. 다만, 이번에는 네트워크 통신에서 사용을 했다는것뿐이니 오해 없길....

우선 pack 부터 알아보자.

pack은 데이터를 binary string으로 바꿔주는 역할을 하는 함수라고 메뉴얼 중 함수 definition 부분에 써있다.

pack의 함수 prototype은

string pack ( string $format [, mixed $args [, mixed $...]] )
이다.

주어진 argument 들을 format에 따라 binary string으로 변환을 해 주는거다.

format에 들어가는 내용은 무엇이 있는지 아래를 참고바란다.

 pack() format characters

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


위의 포맷을 이용해서 네트워크의 전문을 맞춰주면 되는거다. 여기서 한가지!! 전문을 맞출때는 서버측 byte order가 어떤것인지를 꼭 체크해야 한다. C에서 사용하는 ntohl 같은거 사용한 경우 big endian byte order 를 사용하면 되는듯 하다. 또 한가지는 unsigned 인지 signed 인지를 잘 구별해서 맞춰줘야만 한다. 이 부분만 맞춘다면 손쉽게 전문을 맞출 수 있다.

 

자. 이제 unpack을 알아보자.

뭐 이름에서도 느껴지듯이 unpack의 pack의 반대. 즉, binary string을 주어진 포맷에 맞춰서 원하는 데잍터로 바꿔주는 함수이다. 함수 prototype 은

array unpack ( string $format, string $data )

이다.

여기서 주목해야 할 부분은 return이 array라는 것이다.

이 함수의 $format은 pack과 동일하니 위의 표를 참고하고, 사용법은 간단하니까 더이상 설명은 하지 않겠다.

 

데이터 포맷을 맞추는건 해본바에 의하면 java 보다는 편하다는 생각이 든다. 특히 DWORD 라던가 하는 데이터 타입을 맞추려할때 java에서는 좀 힘들었던거 같은데.. 게다가 java는 기본 데이터 타입이 다 signed 라서리.. 여러가지 어려움이 있었던것도 같고... (역시 오래되서 기억이 가물가물)

 

암튼 생각보다 단순하게 구현되어지는 php는 역시 개발자를 편하게 해주는듯...

 

pack과 unpack 많이 쓸일은 없는 함수임에는 분명하지만 그런만큼 잊어버리기도 잘 잊어버리는 함수지만 필요할때 유용하게 쓸수 있으므로 기억하자.


번호 제목 글쓴이 날짜 조회 수
474 유용한 함수 pack, unpack, ip2long, long2ip taknim 2009.01.13 33386
473 해커들을 위한 CMD 툴 모음 file taknim 2008.05.22 32577
472 [js & php] 비밀번호 유효성 체크 - 연속 문자, 같은 문자 taknim 2011.11.09 28590
471 [Oracle] ORA-00600, ORA-06544, ORA-06553 오류 발생시 taknim 2009.06.09 23847
470 리눅스 콘솔 단축키 taknim 2009.07.06 21956
469 리눅스 split | 파일 사이즈, 라인 단위 자르기 taknim 2008.06.19 20595
468 mcrypt 암호화/복호화 AES/CBC/PKCS5/PKCS7/PADDING [1] taknim 2010.03.19 19475
467 최고의 웹디자인용 작은 아이콘 다운로드 사이트 모음 : Best Small Icon Sites taknim 2007.07.11 18946
466 [mysql] 동적 쿼리 생성시 변수를 대입하거나 값을 받아오기 taknim 2009.08.17 17210
465 [MSSQL] MS-SQL 동적쿼리 이용하기 taknim 2009.12.28 16989
464 [google map api] 구글 맵스 API 로 지도 가져오기 taknim 2012.02.09 16950
463 [C/C++] prnitf 역슬래쉬 문자 taknim 2008.11.28 16251
462 EUC-KR <-> UTF-8 상호변환 하기 (문자셋charset 변환) taknim 2008.05.27 16114
461 [oracle] isqlplus 에서 특수문자(&) 입력하는 방법 taknim 2012.08.10 16073
460 [mysql] mysqlbinlog 실행시 캐릭터셋(utf8) 오류 taknim 2009.08.25 15773
459 [Oracle] DBNEWID Utility - DBNAME,DBID변경하기 taknim 2009.07.06 15576
458 inode 개념 taknim 2008.07.08 15366
457 UTF-8 을 이용해서 다국어버젼 웹사이트 개발시 고려사항 taknim 2008.10.17 15339
» 누구나 다 아는 네트워크(소켓) 통신시의 함수 pack과 unpack taknim 2008.05.17 14611
455 Postfix SMTP 서버를 이용한 IPv6 메일(SMTP) 서버 구성 taknim 2008.02.15 14443