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 이런 키워드로 검색해 보시면 언어에 맞는 라이브러리가 이미 있을 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.