[완료] C와 Java간 Socket통신 질문

jazzsir의 이미지

C로 프로그래밍된 서버와 자바로 프로그래밍된 클라이언트간 Socket통신을 하려고 하는데
문제는 C Struct형식으로 데이터를 주고 받아야 합니다.
일단, 서버(C로 구현된)에서 Struct형식의 데이터를 클라이언트(java)받아서 처리하는건 가능합니다.
근데 문제는 보내는 부분 즉, C Struct형식으로 자바에서 만들어서 보내는 부분(java -> c)이 문제입니다.

아래 C 구조체에서 unsigned char타입은 16진수로 만들어서 1Byte씩 보내는 부분은 가능한데...
문제는 char배열 항목에서 문제인것 같습니다.
C 구조체입니다.
typedef struct Plus_req {
unsigned char service_type; // 이부분은 java에서 16진수로 해서 1byte씩 보내므로 가능
unsigned char seq_id; // 이부분은 java에서 16진수로 해서 1byte씩 보내므로 가능
unsigned char service_key; // 이부분은 java에서 16진수로 해서 1byte씩 보내므로 가능
char my_tel[20];
char mac_address[20];
char recipient_tel[20];
char callback_tel[20];
} Plus_req_t;

그리고 제가 C 구조체 형식으로 java에서 만든 방법은 아래와 같습니다.
int형이나 double형이 없기 때문에 endian은 신경안썼습니다.

byte[] tmpArr = null;
tmpArr = new byte[83];
for(int i = 0; i<83 ; i++)
tmpArr[i] = 0x00;

tmpArr[0] = 0x03; //이부분은 서버에서 인식합니다.
tmpArr[1] = 0x09; //이부분은 서버에서 인식합니다.
tmpArr[2] = 0x02; //이부분은 서버에서 인식합니다.

System.arraycopy(myTel.getBytes(), 0, tmpArr, 3, myTel.getBytes().length);
System.arraycopy(mac.getBytes(), 0, tmpArr, 23, mac.getBytes().length);
System.arraycopy(recipTel.getBytes(), 0, tmpArr, 43, recipTel.getBytes().length);
System.arraycopy(recipTel.getBytes(), 0, tmpArr, 63, recipTel.getBytes().length);

참고로 string에는 한글이 들어갈 수도 있습니다.

제가 자바에서 코딩한 부분에서 잘못된 부분을 지적해 주시면 대단히 감사하겠습니다.

lovian의 이미지

겉보기에는 큰 문제가 없어보이는데요?

완전 특이한 플랫폼이 아닌이상 데이터 길이도 정확한 것으로 보이는데요.

무슨 문제가 있으신거에요?
-----------------
한글을 사랑합니다.

-----------------
한글을 사랑합니다.

jazzsir의 이미지

1byte씩 보내는 16진수는 제대로 서버에서 받아 지는데 String은 항목은 오류를 일으키고 있습니다.
어떤 오류인지 어떻게 날라가는지를 서버에서 확인할 수 있으면 좋은데 그러지 못하는 상황이구요.
제가 알 수 있는건 서버에서 보내오는 response에 string항목에 대한 오류 여부밖에 확인할 수가 없습니다.
그래서 제 코드상에 문제가 있나 해서 여쭤본거구요~
리플 감사합니다~ ^^

madman93의 이미지

\r \n 문제일 수도 있을 것 같습니다.
서버 코드를 볼 수 있는 상황이라면 금방 알 수 있는 내용일것 같은데 말이죠!!
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

jazzsir의 이미지

개행문자는 없는걸로 확인했습니다.
감사합니다~

cleol의 이미지

그냥 "문제입니다" 라고 하시지 말고 무슨 문제가 발생하는 지를 구체적으로 알려주셔야지요 :)
혹시 서버측 코드를 바꾸실 수 있다면, 구조체를 그대로 읽고 쓰고 말고 적당한 프로토콜을 정해서 serialize 한 데이터를 가지고 통신하는 것이 낫습니다.
구조체가 메모리에 저장되는 레이아웃은 컴파일러마다, 기계마다 달라질 수 있으니까요.
그게 가장 깔끔한 해결 방법이고, 그럴 수가 없다면 구조체가 메모리에 저장되는 레이아웃을 정확히 파악하는 것이 먼저일 것 같습니다.
구조체 멤버 사이에 패딩이 들어갈 수 있으니까요.

jazzsir의 이미지

리플 감사합니다.^^
서버쪽에서 어떻게 받아지는지는 현재 확인이 불가합니다.
확인 할 수 있는건 서버쪽에서 보내오는 오류코드를 포함한 response 뿐입니다.
response를 보면 16진수 1byte를 보낸것에 대한건 제대로 응답이 왔구요.
근데 string을 붙여서 보낸것에 대한건 해석을 못햇는지 오류코드로 왔더라구요.
그래서 제가 c struct형식을 자바에서 잘못 만든게 아닌가 해서 문의 드린것입니다.
제가 자세히 상황을 설명 안했네요~ ^^;;

cleol의 이미지

"오류 코드" 가 어떤 오류인지에 대해서는 혹시 알려주지 않는지요.
구조체 레이아웃에 패딩이 없다고 가정하면, 문자열 인코딩 문제일 수도 있습니다.
서버측과 클라이언트측이 사용하는 문자열 인코딩을 확인해보시면 어떨런지요.

jazzsir의 이미지

구체적으로 알려주지 않고 오류여부만 알려줍니다. --;; 아이고~

근데 C로 클라이언트를 만들어서 구조체로 보내면 응답이 제대로 옵니다.
구조체를 만들때 별도로 패딩같은건 넣지 않았구요.
그럼 패딩은 사용하지 않는것이겠죠?

그리고 솔직히 C 구조체 레이아웃에 패딩을 넣는다는게 어떤건지 몰라서 그러는데요...
코드상으로 설명해주시면 감사하겠습니다.~ ^^

madman93의 이미지

http://blog.daum.net/_blog/BlogTypeView.do?blogid=03MR6&articleno=12982378#ajax_history_home

http://kldp.org/node/112747

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

jazzsir의 이미지

감사합니다.~
근데 이건 받는 부분이네요~ ^^;;

mirheekl의 이미지

(Sorry for writing in English.)

Why don't you use sniffers or something? There are a bunch of utilities to do capture TCP/IP streams.
Just run sniffers during testing, compare the packets byte-to-byte and you'll find the difference and problem very easily.

If you can't use sniffers by some reasons, it's also possible to make another application which runs as a "proxy". ie, if the current situation is "Client <------> Server", you can put your proxy application like this: "Client <------- PROXY -------> Server". The proxy should bypass everything in order not to make programs know of the existence of the proxy. And... probably you can find problems via this kinda proxy because you can see every data.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

jazzsir의 이미지

Thank you for your advice.

As you informed, I checked TCP streams using Ethereal.
then, I could realize that my code had no problem.
The problem was only the data I proccesed.

Thank you~

jos77의 이미지

getBytes() 가 아니라 getBytes("UTF-8") 같이 인코딩 타잎 지정가능한 걸로 압니다.
특히 개행문자만이 아니라 어딘가에서 java 에서 byte 처리가 잘 안되는 경우가 있어서 한꺼번에 버퍼로 잡은 후 변환해서 썼던 기억이 있네요... 확인해보시는게 어떨지...

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

jazzsir의 이미지

다행히 문자 인코딩방식에는 문제가 없었습니다.
감사합니다.~

익명 사용자의 이미지

typedef struct Plus_req {
unsigned char service_type;
unsigned char seq_id;
unsigned char service_key;
char my_tel[20];
char mac_address[20];
char recipient_tel[20];
char callback_tel[20];
} Plus_req_t;

구조체의 멤버에 offset을 확인해보셔야할것같습니다.
offset이
0
1
2
3
23
43
63
이길 바라고 코딩했으나 실제로
0
1
2
4
24
44
64

가 될수도 있어요

익명 사용자의 이미지

일단 구조체의 크기를 구하신후에 83바이트가 맞는지 확인부터 해보시죠

익명 사용자의 이미지

#pragma pack(push,1)

구조체 선언

#pragma pack(pop)

댓글 달기

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