C 소켓과 PHP Socket 데이터 통신 - C 구조체 이용
컨텐츠 정보
- 40,268 조회
- 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
등록된 댓글이 없습니다.