C언어와 자바간 통신(구조체전송)에 관하여..
글쓴이: nbsaver / 작성시간: 수, 2011/11/23 - 2:25오전
안녕하세요? 현재...
서버(우분투에서 C로 작성), 클라이언트(윈도우 안드로이드 자바로 작성)
서로간에 TCP 통신을 구현하는 중인데요.
값이나 문장같은 한줄 단위는 서로 송수신이 됩니다.
그런데 문제가 서버쪽에서 구조체를 전송할 때 인데요, 엄청 어렵더라구요. 한줄씩 보낼려고해도 클라이언트 쪽에서는 입력버퍼에 계속 쌓이니까 자료 구분도 힘들고
그렇다고 서버쪽에선 클라이언트쪽 입력버퍼를 검사할 수도 없는 노릇이고,,
그래서 좀더 알아보니까 구조체를 통째로 전송할 수 있는 것 같더라구요.. 받는쪽에서는 ObjectInputStream과 ObjectOutputStream을 이용해서요.
struct room_info {
int room_num;
char name[20];
};
대략 이런 구조체가 있다면 위의 방법이 맞다면 자세히 설명 좀 해주시고, 아니면 서버쪽과 클라이언트 쪽에선 어떻게 작업을 해줘야 할까요?
Forums:
구조체 전송에 관한 토의가 이뤄졌던 스레드가 있습니다.
http://kldp.org/node/59971
에 보시면 네트워크 상에서 구조체 전송에 관한 토의가 이뤄졌었네요.
보통 통신에서 다른 기종간의 데이터 교환을 위해 통신 규격을 정합니다.
가령 string 으로 아이디와 패스워드를 보낸다 했을 때, 1~10 바이트는 아이디, 11~20 바이트는 패스워드 로 하며 아이디와 패스워드는 10바이트를 넘지 않는다. 20바이트 단위로 패킷을 보내며 20바이트 이후부터는 다른 패킷으로 간주한다.
뭐 이런 간단한 규격부터 xml 등 형식화 된 규격까지 여러개의 규칙이 있겟죠.
구조체의 경우 통신보다는 서로 다른 기종 사이에 개발환경의 차이로 구조체의 바이트 사이즈가 다르게 설정되는 경우가 있기 때문에, 직접 보내는건 좀 위험하다고 생각됩니다.
물론 프로그래머가 이를 인식하고 제어 할 수 있다면 상관없죠.
이부분에 관해선 선배님들이 제가 걸어논 링크에서 토의가 있었네요.
ObjectInputStream 이나
ObjectInputStream 이나 ObjectOutputStream 은 C struct를 주고받을 수 없습니다.
자바 객체를 주고받을 수 있을 뿐입니다.
위 분 말씀처럼 프로토콜을 정해서 직접 marshalling, unmarshalling해 주어야합니다.
구조체에 pragma pack(1) 해주시고 바이너리
구조체에 pragma pack(1) 해주시고 바이너리 통신 하시는게 좋을듯
언어독립적인 프로토콜
윗분 말씀처럼 언어독립적인 프로토콜을 이용하셔야 합니다.
performance 가 극단적으로 중요해서 데이터를 한정된 패킷 안에 구겨넣어야 하는게 아니면, xml 이나 json 같은걸 이용해서 http 에 싸서 보내시면 편합니다.
json, serialization/deserialization, marshalling/unmarshalling 이런 키워드로 검색해 보시면 언어에 맞는 라이브러리가 이미 있을 것입니다.
댓글 달기