C언어와 자바간 통신(구조체전송)에 관하여..

nbsaver의 이미지

안녕하세요? 현재...

서버(우분투에서 C로 작성), 클라이언트(윈도우 안드로이드 자바로 작성)

서로간에 TCP 통신을 구현하는 중인데요.

값이나 문장같은 한줄 단위는 서로 송수신이 됩니다.

그런데 문제가 서버쪽에서 구조체를 전송할 때 인데요, 엄청 어렵더라구요. 한줄씩 보낼려고해도 클라이언트 쪽에서는 입력버퍼에 계속 쌓이니까 자료 구분도 힘들고

그렇다고 서버쪽에선 클라이언트쪽 입력버퍼를 검사할 수도 없는 노릇이고,,

그래서 좀더 알아보니까 구조체를 통째로 전송할 수 있는 것 같더라구요.. 받는쪽에서는 ObjectInputStream과 ObjectOutputStream을 이용해서요.

struct room_info {
int room_num;
char name[20];
};

대략 이런 구조체가 있다면 위의 방법이 맞다면 자세히 설명 좀 해주시고, 아니면 서버쪽과 클라이언트 쪽에선 어떻게 작업을 해줘야 할까요?

harion01의 이미지

http://kldp.org/node/59971

에 보시면 네트워크 상에서 구조체 전송에 관한 토의가 이뤄졌었네요.

보통 통신에서 다른 기종간의 데이터 교환을 위해 통신 규격을 정합니다.

가령 string 으로 아이디와 패스워드를 보낸다 했을 때, 1~10 바이트는 아이디, 11~20 바이트는 패스워드 로 하며 아이디와 패스워드는 10바이트를 넘지 않는다. 20바이트 단위로 패킷을 보내며 20바이트 이후부터는 다른 패킷으로 간주한다.

뭐 이런 간단한 규격부터 xml 등 형식화 된 규격까지 여러개의 규칙이 있겟죠.

구조체의 경우 통신보다는 서로 다른 기종 사이에 개발환경의 차이로 구조체의 바이트 사이즈가 다르게 설정되는 경우가 있기 때문에, 직접 보내는건 좀 위험하다고 생각됩니다.

물론 프로그래머가 이를 인식하고 제어 할 수 있다면 상관없죠.

이부분에 관해선 선배님들이 제가 걸어논 링크에서 토의가 있었네요.

익명 사용자의 이미지

ObjectInputStream 이나 ObjectOutputStream 은 C struct를 주고받을 수 없습니다.
자바 객체를 주고받을 수 있을 뿐입니다.
위 분 말씀처럼 프로토콜을 정해서 직접 marshalling, unmarshalling해 주어야합니다.

익명 사용자의 이미지

구조체에 pragma pack(1) 해주시고 바이너리 통신 하시는게 좋을듯

sblade의 이미지

윗분 말씀처럼 언어독립적인 프로토콜을 이용하셔야 합니다.

performance 가 극단적으로 중요해서 데이터를 한정된 패킷 안에 구겨넣어야 하는게 아니면, xml 이나 json 같은걸 이용해서 http 에 싸서 보내시면 편합니다.

json, serialization/deserialization, marshalling/unmarshalling 이런 키워드로 검색해 보시면 언어에 맞는 라이브러리가 이미 있을 것입니다.