2011-08-01 6 views
0

네트워킹에 익숙하지 않기 때문에 제 문제를 설명 할 수있게 될 것입니다.java 클라이언트가 TCP 연결을 통해 C++ 서버와 통신합니다.

내 상사가 최근에 내 응용 프로그램의 네트워킹을 테스트하기 위해 더미 서버를 만들었고 java to C++와 관련하여 문제가 발생했습니다. 그의 서버는 C++로 작성하고 실행할 때, 그것은 ++ 데이터가 전달 될 "RemoteMsgStruct"라는 구조체 특정 C의 대기 및 수신되었습니다

typedef struct 
{ 
unsigned int Length; 
unsigned int BoardType; 
unsigned int MsgType; 
unsigned char Msg[MAX_MSG_SIZE]; 
} RemoteMsgStruct; 

문제점 내 프로그램은 자바로 작성되어 있다는 사실에있다. 어떻게하면 서버에서 처리 할 자바를 통해 비슷한 메시지를 전달할 수 있습니까?

도움을 주셔서 미리 감사드립니다. 아무 것도 잘 설명되지 않거나 누락 된 것으로 보이는 경우 알려주십시오. 내가 말했듯이, 나는 네트워킹과 stackoverflow 모두에 새로운거야 :)

+0

에 C를 고려하고있다 소켓에 의해 처리된다. 응용 프로그램에서 데이터를 인코딩하는 방법은 서버 측에서 디코딩해야합니다. 먼저 프로토콜을 정하고 인코딩 디코딩 기법을 사용하십시오.예 : 원시 바이트 형식/XML/JSON/프로토콜 버퍼 등 – Arunmu

+0

@Juan EBOSSHASNOCLUE – Alnitak

답변

0

에 오신 것을 환영합니다.

질문과 관련하여 XML 및 JSON과 같은 메시징 형식이 널리 사용되는 이유가 있습니다. 이러한 문제는 이와 같은 문제를 해결합니다. 서명되지 않은 int를 보내고 문자 인코딩과 엔디안에 대해 걱정할 필요가 있습니다. 서버 측에서 형식을 변경할 수 없다면 ByteBuffer을 살펴 보는 것이 좋습니다. 당신은 여전히 ​​약간의 마사지를해야하지만 적어도 그것은 고통의 일부를 덜어 줄 것입니다.

1

상사의 테스트 프로그램이 예상 한 데이터를 상사에게 수정하지 않고도 정확하게 전달할 수 있습니다. 자바 측면에서

, 당신은 다음과 같은 여러 가지 방법을 통해 C++ 구조체에 의해 정의 된 레이아웃에 데이터를 기록 할 수 있습니다 : * java.io.DataOutputStream의 * 된 java.nio.ByteBuffer 및 java.nio.channels.SocketChannel.

필드 정렬 및 바이트 순서 문제가 발생할 수 있습니다. * C 구조체의 일부 필드는 단어 경계와 맞추기 위해 채우기 후에 시작할 수 있습니다. * Java는 기본적으로 네트워크 바이트 순서 (빅 엔디안)를 작성합니다. Java 측에서는 ByteBuffer가 다른 순서를 선택할 수 있습니다.

0

앤디의 대답은 정확합니다. 그러나 상사의 프로그램을 다시 작성해야한다고 말해야합니다.

  1. 하드웨어 바이트 순서
  2. 는 컴파일러의 : 네트워크를 통해 직접 C 구조체를 전달하면 다른 쪽 끝이 기술은 양쪽에서 같은 인 다음에 의존 C로 작성도 것은 좋은 방법이 아닙니다 충전 및 포장 규칙
  3. 주변 #pragmas

따라서

  1. 컴파일 R 업체
  2. 컴파일러 버전

이 (불완전) 목록이 너무 오래 이미 지금까지, 우리는 여전히 당신은 TCP 소켓에서 데이터가 어떻게 모양을 가질 필요가 C.

+0

"재 작성해야 할 필요성"은 우리가 가지고있는 제한된 정보를 고려할 때 다소 강하다. # 1은 ntohl 등을 통해 주소 지정 될 수 있습니다. 여러 컴파일러가 필요한 경우 # 2/# 3이 중요합니다. –

+0

@Andy Thomas-Cramer 나는 동의하지 않는다. 나는 그것이 충분히 강하다고는 생각하지 않는다. * 이런 종류의 일은 가능한 한 가장 강력하게 사용되지 않을 것이다. 와이어 프로토콜은 호스트 언어와 독립적으로 정의되어야하며이 스레드는 충분한 증거입니다. – EJP

관련 문제