본문 바로가기
개발/JAVA

자바와 MFC 소켓 프로그래밍 참고하세요

by ㅣ푸른하늘ㅣ 2018. 7. 24.
반응형

C와 자바로 소켓 통신을 하려고 한다면 다음과 같은 것을 지켜야 한다.


1. 와이어 샤크 같은 패킷분석기를 이용해서 오고가는 패킷을 분석해야한다. 이걸 이용해서 자바에서 쓰는 데이터를 C끼리 주고 받는 데이터 구조와 완전히 같게 만들어서 보내줬다.

2. 자바에서 C로 보낼시에 문자열 같은것은 상관없지만 int형 같은 Byte단위가 넘어가는 숫자는  반드시 LittleEndian으로 변환을 한 후에 보내줘야 한다. (왜냐하면 자바 : BidEndian 사용 ,   C : LittleEndian 사용 )

3. C에서는 struct,  자바에서는 class를 사용해서 데이터를 정의했다.

C 에서는 :

struct LoginModeData{

int type = 0;

int isLogin = 0;

char id[512]; 

char pwd[512];


자바 에서는 :

class LoginModeData{

public int type = 0;

public int is Login = 0;

public byte[] id = new byte[512];//왜냐하면 자바는 유니코드를 이용하므로 char의 크기가 2바이트이다.0

public byte[] pwd = new byte[512];

}


4. 자바와 C사이에서는 구조체를 이용해서 통신을 하려면 기본적은 데이터 형식밖에 이용할 수 밖에 없다. 즉, 자바 와 자바 사이에 객체를 Serializable을 이용해서 주고 받을 수 있지만 자바 와 C 사이에서는 그것이 불가능하다. 따라서 DataOutputStream 객체를 이용해서 통신을 주고받길 원하는 소켓에 연결을 하고 이것을 통해서 통신을 해야한다.

ex)

Socket socServer.....~~~~~~~~~~~~~~~~~~//어쩌구 저쩌구 해서 소켓을 ip와 포트 번호를 이용해서 생성을 했다고 치자

LoginModeData loginModeData = new LoginModeData();

DataOutputStream dos = new DataOutputStream(socServer.getOutputSteram());//이런식으로 소켓과 아웃풋 스트림을 연결을 한 후에

dos.write(loginModeData.속성);//이런식으로 구조체의 속성의 값을 따로따로 넣은 다음에

dos.flush();//C서버라면 서버로 보내준다.


이런식으로 구현을 하였다.


5. C에서의 배열구조는 char id[512]; 에 kimchi라는 문자열이 입력되었다고 치자 그러면 이배열의 구조는

107 105 109 99 104 105 0 254 254 254 254 254 254 254 254 254 254 .................

k     i    m   c   h    i    null  254 254 254 ~~~~~~~~~~~~~~~~~~~~~~ kimchi와 총합쳐 512번째까지

이런식으로 이루어져있다. 패킷 분석기로 분석해보면 된다  자바에서 이렇게 똑같이 데이터를 만들어서 보내줘서

아까본

DataOutputStream에 구조체 속성을 넣은 후에 flush();를 호출해서 서버에 데이터를 보냈다.






이런것들이 싫으시면 ndk를 이용하면 된다 ndk란 안드로이드에서 C 코드를 사용하게 할수 있게 도와주는 것이다.

이게 싫으시면 이렇게 일일히 만들어 보내주는수 밖에..............................

이글이 좀 도움이 되었으면 좋겠습니다.



출처: http://jongyoungcha.tistory.com/entry/자바와-MFC-소켓-프로그래밍 [Do it now]

반응형