JAVA와 C간의 UDP 통신?

익명 사용자의 이미지

C쪽의 기기는

구조체를 전송받으면 내용을 분석해
적합 하다면 다시 그에 맞는 정보를 보내도록 코딩이 되어있습니다. (건드릴 수 없습니다)

JAVA쪽에서 해당 타입에 맞는 구조체를 전송하고
구조체를 받아 파싱하여 사용하려고 구상중입니다

C언어로 작성된 기기는 다음주 쯤에야 받아볼 수 있어 미리 JAVA로 소프트웨어를 설계중에 있습니다

다행히 C_Server와 C_Client로 작성된 서버의 기능 일부분 자바로 바꾸는 작업이라서

먼저 C끼리의 통신을 와이어샤크 등으로 패킷을 보면서 프로토콜을 맞추어
일부기능을 빼내 JAVA로 제작할 생각입니다

(가정 1)
1. 받는쪽의 구조체가 구조체 안의 구조체 또 그 안의 구조체로 되어있다면
Struct Final{
a; <----------- Struct a{
b; d
c; e
} }

이런식으로 구조체 안의 구조체가 들어있다면 자바로는 어떠한 방식으로 구조체를 짜 받아야 할까요?

이럴 경우에 a구조체의 값이 필요치 않다면, Struct a의 총 바이트 수 만큼 a를 공백으로 채워넣어도 작동 할까요?
(해당 응답을 해주는 소프트웨어 작성에는 d,e의 변수의 값은 의미가 없을 때의 경우입니ㅣ다)

(가정 2)
2. C와 JAVA의 UDP통신 시 제가 생각하는 JAVA와 JAVA의 UDP통신같은 레파토리로 흘러 가는가요?
ex) 클라이언트에서 서버 IP와 포트로 브로드캐스트 방송 시
서버에서 인지하고 잡아채어 해당 IP Address와 정해진 Port로 Recv해주는 방식 ?

C에 지식이 없어 질문이 너무 두서 없었습니다.

이럴경우 어떻게 해결 해야 되는지 용기내어 여쭤봅니다

익명 사용자의 이미지

우선 UDP는 프로그래밍 언어와는 무관한 프로토콜입니다. C로 작성하던 자바로 작성하던 뭘로 작성하던 프로토콜 자체는 달라지는 것이 없습니다.

네트워크는 TCP든 UDP든 "구조체"라는 것을 모릅니다. 네트워크를 통해서 받은 데이터는 그냥 byte sequence일 뿐입니다. 그리고 자바에는 구조체가 없습니다. 구조체를 짜서 받는다는 것 자체가 말이 안되지요. 그냥 이번 4 바이트는 int로 다음 8 바이트는 double로, 그 다음 몇 바이트는 특정 인코딩의 문자열로 ... 같은 식으로 (byte order에 유의해서) 해석하는 수 밖에는 없습니다. C도 마찬가지 입니다. C는 언어의 특성상 버퍼의 내용을 그대로 특정 구조체에 대응시킬 수도 있기는 하지만 원칙적으로는 자바의 경우와 마찬가지 입니다. 버퍼에 저장된 바이트열의 각 부분을 특정한 타입의 데이터로 해석할 뿐입니다. 그냥 어떤 바이너리 파일을 읽는 것과 다를 것 없다고 생각하시면 됩니다.

질문자의 이미지

아 구조체가 일렬로 이어져 온다는 말씀이시군요

C 로 짜여진 기기에서 오는 데이터는
전부 다 HEX로 이루어진 53 1C 00 F0 22 .. 이런식의 1바이트 짜리의 데이터들의 집합으로 해석 됩니다

= 이럴 경우 C와 자바에서의 통신이 해당 헤더,데이터의 파티션(바이트단위로 구분)에따라 파싱해서
Endian식만 주의하고 서로 데이터를 보낼때 trim()등을 사용하고 ~~ 등등의 기본적인 검색해서 나오는
C와 JAVA의 소켓통신 형식만 맞춰준다면

JAVA와 JAVA와의 UDP통신처럼
(listen 서버) 클라이언트가 서버에 요청을 하고, 서버는 응답을 하고 다시 대기로 돌아가고
response를 돌려받은 클라이언트는 해당 데이터를 파싱해 뿌려주고
.. 이런식으로 마찬가지로 작성을 하면

C와 자바의 UDP통신이 이루어 질 수 있다는 뜻인가요?

결론 : 구조체는 일렬로 온다 ? 이걸 자바에서 스플릿 해서 구조체로 인식한다 이 말씀이신거 맞죠?

답변 감사합니다

질문자의 이미지

아 그렇다면 반대로

C기기의 Listen 중인 서버가
구조체를 받아들인다면

자바에서는 똑같이 일렬로 보낸다면
어짜피 통신은 Byte sequence니까
C기기에서도 알아서 짤라 구조체로 인식한다는 말씀이시군요

질문자의 이미지

하지만 생각 해 보니 C의 Struct는
초기에 크기를 지정하지 않는데
그렇다면 공백같은 파싱문자가 존재하여 구분짓는 방식이 되는가요?
이건 쉬운 내용이니 개인적으로 검색해 공부 해 놓도록 하겠습니다

답변 다시한번 감사합니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.