2013-08-29 1 views
1

내 C++ 클라이언트 응용 프로그램과 Java 서버가 있습니다. 클라이언트 응용 프로그램이 연결되어 서버에 데이터를 보냅니다.C++ 중고 클라이언트 : 길이가없는 버퍼를 보내는 방법?

boost::shared_ptr<TSocket> socket(new TSocket(hostMS, portMS)); 
    boost::shared_ptr<TFramedTransport> transport(new TFramedTransport(socket)); 
    boost::shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport)); 

transport->open(); 
protocol->writeI32(0xCA12EEAA); 
transport->writeEnd(); 
transport->flush(); 

서버 측 코드는 다음과 같습니다 :

int nMagic =0; 
// int nLen = in.readInt(); <------------here is I read the length 
int ch1 = in.read(); 
       int ch2 = in.read(); 
       int ch3 = in.read(); 
       int ch4 = in.read(); 
       if ((ch1 | ch2 | ch3 | ch4) < 0) 
        throw new EOFException(); 
      nMagic = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 

질문은 : 나는 (내 의견을 참조) 작동 하나 개 더 읽기 정수를 추가 를 예를 들어

나는 정수 값을 전송 승인. 우선, 길이 (4 바이트)와 데이터 - 정수를 읽습니다.

그것은 클라이언트 길이 (INT) 데이터 (INT)

를 전송하지만, 서버는 단지 데이터를 읽는 것을 의미한다.

어떻게 데이터를 보낼 수 있습니까? 다른 중고품 운송이나 프로토콜을 사용하거나 비 절약 라이브러리를 사용할 수 있습니다 ...

+0

어떻게 다른 쪽은 길이 속성없이 얼마나 많은 데이터를 읽을 알 것 TFramededTransport를 사용해야합니다? –

+0

음 ... 사실. 서버가 그것을 읽지 않습니다. 전에 기본 Java 클래스에서 읽었을 수 있습니다. 내가 hav 다른 실험 emade : 소켓 테스트 유틸리티 헤라클레스 (www.hw - group.com)를 실행하고 서버에 연결 후 16 진수 값을 보냈습니다 - 서버가 성공적으로 그것을 받았습니다. – Oleg

답변

0

TFramedTransport가 버퍼 앞에 (!) 길이를 추가하기 때문에 TBimeredTransport 대신 TBufferedTransport를 사용하십시오.

+0

흥미로운 것 같습니다. 나는 모든 중고품 플랫폼 (파이썬, 노드)에 적용되는 것 같아요. 유가 어떻게이 질문에 왔습니까? 왜 대답이 필요한가요? – ducin

3

클라이언트 쪽 Thrift 프로토콜/전송 스택이 서버 쪽과 일치해야합니다. 그렇지 않으면 문제가 발생할 가능성이 큽니다.

예. 서버가 바이너리 프로토콜, 프레임 및 멀티 플렉스 전송을 사용하는 경우 클라이언트는 정확히 동일해야합니다.

1

하지만 비 블록 단절을 사용하는 경우, 당신은

관련 문제