2017-10-25 2 views
-1

나는 C++ SSH 소켓 서버 (32 비트 리눅스) & 자바 기반 SSL 클라이언트 (윈도우 64 비트)를 사용하고있다. SSL 핸드 셰이크가 성공했습니다. Java 클라이언트에서 C++ 서버로 문자열 데이터를 보내면 & 디스플레이를받을 수 있습니다. 내가 서버 C++ 자바 클라이언트에서 int 데이터를 보낼 때 , 다른 데이터는 내가openssl java to C++ read int issue

자바 소스 보내 수신하고 있습니다 :

DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
osw.writeInt(1000); 
osw.flush(); 

C++ readInt을 출처 :

unsigned int result =0; 
int byteRead = SSL_read(m_ssl, &result, sizeof(int)); 
unsigned int rxdInt = htonl(result); 

C++면, 내가 인쇄 할 때 바이트의 경우 1 바이트로 읽음 : 1

Expected: e8 03 00 00 
received : 00 00 00 00 
after htonl: 00 00 00 00 

Wi 코드 아래 일, 자사의 SSL 내의 writeInt없이

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(1000); 

DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
dos.write(bb.array()); 
dos.flush(); 

는 SSL 내의 writeInt가 작동 바이트로 SSL, 쓰기 INT와 작동하지 않습니다와 C++ 와 협력 C++ 작업, 바이트로 작성. 왜 SSLI의 경우 writeInt 동작이 다른가요?

+0

Google의 [프로토콜 버퍼] (https://developers.google.com/protocol-buffers/) 사용을 고려해보십시오. TLS로 메시지를 사용하는 것이 훨씬 쉽습니다. 유선 형식 및 프리젠 테이션에 대해 걱정할 필요가 없습니다. – jww

+0

의미를 파괴하는 코드가 더 이상 편집되지 않으므로. 'ByteBuffer'를 가진 변형은 무의미합니다. – EJP

답변

0

왜 바이너리 데이터에 Writer을 사용하고 있습니까? DataOutputStream.writeInt()을 사용해야합니다.

그리고 물론이 :

unsigned int rxdInt = htonl(result); 

이 있어야한다 :

unsigned int rxdInt = ntohl(result); 

그리고 당신은, -1 제로, 이하 수 있었다 SSL_read()에 의해 반환 된 값을 무시하고 4보다

+0

또한 DataOutputStream과 동일한 문제가 발생했습니다. DataOutputStream dos = new DataOutputStream (socket.getOutputStream()); \t \t \t dos.writeInt (1000); –