문제

C ++ 및 Java를 사용하여 클라이언트를 사용하여 서버가 개발되는 작은 TFTP 클라이언트 서버 앱을 만들고 있습니다.

여기에서 나는 "블록 수"값을 사용하고 있습니다. htons 변환.

그러나 클라이언트에서 원래 가치로 다시 변환 할 수 없습니다.

예를 들어 블록 수를 보내는 경우 ntohs(01) (2 바이트) 서버에서 클라이언트로. 클라이언트는 바이트로 읽고 있습니다. 내가받는 값은 바이트 0과 바이트 1입니다.

솔루션을 제공 할 수 있다면 제발.

도움이 되었습니까?

해결책

나는 당신이 당신이 사용한다는 것을 의미합니다 ntohs 에게 풀다 값은 네트워크에서 읽습니다 htons 에게 인코딩 네트워크를 통해 전송 된 값.

들여다보다 ByteBuffer#getShort() 함께 ByteBuffer#order(ByteOrder). 네트워크 바이트 순서 ~이다 빅 엔디언, 값을 사용하십시오 ByteOrder#BIG_ENDIAN 구성합니다 ByteBuffer 제대로. 주목하십시오 BIG_ENDIAN 기본 순서이지만이 경우 선호도를 명시 적으로 명시하는 것이 좋습니다.


Java에서 네트워크 커뮤니케이션에 사용하는 내용은 언급하지 않았습니다. 그것이 a java.net.Socket, 전화해도됩니다 Socket#getChannel() 얻기 위해 java.nio.channels.SocketChannel, 하위 유형 java.nio.channels.ByteChannel, 당신이 사용할 수있는 ByteBuffer 데이터를 읽고 쓰기 위해.

다른 팁

   private void somemethod(){

    byte[] fileDataFull = new byte[516];
    byte[] receivedCounter = new byte[2];

    readLength = in.read(fileDataFull);

    receivedCounter[0] = fileDataFull[2];
    receivedCounter[1] = fileDataFull[3];

   if (expectedPktCount == convertntohs(receivedCounter)){

   }

   byte[] b = converthtons((short) expectedPktCount);

}

    private short convertntohs(byte[] value) {
        ByteBuffer buf = ByteBuffer.wrap(value);
        return buf.getShort();
    }

    private byte[] converthtons(short sValue) {
        byte[] baValue = new byte[2];
        ByteBuffer buf = ByteBuffer.wrap(baValue);
        return buf.putShort(sValue).array();
    }

Java의 숫자는 내부적으로 항상 네트워크 바이트 순서, 기본 정수/복식이없는 시스템에서도 항상 네트워크 바이트 순서입니다. 즉, Java.io.datainput를 구현하는 이러한 종류의 변환을 수행하는 기본 입력 스트림으로 Java로 들어오는 숫자를 Java로 변환 할 수 있습니다. Java.nio.channel을 사용하는 경우 Bytebuffer도 작동하지만 엔디 언을 변경할 수 있습니다 (ByteBuffer.order()), 기본값은 네트워크 바이트 주문 및 Java 내부 스토리지에 맞습니다.

그건 그렇고, 나는 당신이 사용한다는 것을 의미한다고 생각합니다 htons 그러나 예에서 당신은 보여줍니다 ntohs. C ++에서 전송하면 변환하려고합니다 시간OST 주문 Network 주문. Java (또는 모든 클라이언트)로부터 수신하면 서버가 ntohs.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top