C ++ сервер Хтонс в Java Java Ntohs клиента преобразования - PullRequest
3 голосов
/ 26 ноября 2009

Я создаю небольшой клиент TFTP серверное приложение, где разрабатывается сервер используя c ++ и клиент используя java.

Здесь я посылаю значение "количество блоков" используя htons преобразование.

Но я не могу преобразовать его обратно к первоначальному значению у клиента.

Например, если я посылаю счетчик блоков ntohs(01) (2 байта) с сервера на клиент. Клиент читает в байтах. Значение, которое я получаю, является байтом 0 и байт 1.

Пожалуйста, если кто-нибудь может предоставить решение.

Ответы [ 3 ]

3 голосов
/ 26 ноября 2009

Я так понимаю, вы имели в виду, что вы используете от ntohs до декодирования значения, считанные из сети, и от htons до кодирования значения, отправленные по сети.

Посмотрите на ByteBuffer#getShort() вместе с ByteBuffer#order(ByteOrder). Порядок сетевых байтов равен big endian , поэтому используйте значение ByteOrder#BIG_ENDIAN для правильной настройки ByteBuffer. Обратите внимание, что BIG_ENDIAN является порядком по умолчанию, но в этом случае было бы целесообразно явно указать ваши предпочтения.


Вы не упомянули, что вы используете для сетевых коммуникаций в Java. Если это java.net.Socket, вы можете позвонить Socket#getChannel(), чтобы получить java.nio.channels.SocketChannel, подтип java.nio.channels.ByteChannel, с помощью которого вы можете использовать ByteBuffer для чтения и записи данных.

1 голос
/ 01 декабря 2009
   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();
    }
0 голосов
/ 27 ноября 2009

Внутренние числа Java всегда располагаются в сетевом байтовом порядке, даже в системах, где собственные целые / двойные числа отсутствуют. Это означает, что вы можете преобразовать любое число, поступающее в Java, с помощью любого из базовых потоков ввода, которые выполняют преобразование такого типа - которые реализуют java.io.DataInput. ByteBuffer также работает, если вы используете java.nio.Channel, но там вы можете изменить порядковый номер (ByteBuffer.order()), хотя по умолчанию это правильно для сетевого порядка байтов и внутреннего хранилища Java.

Кстати, я думаю, вы хотите использовать htons, но в примере вы показываете ntohs. При отправке из C ++ вы хотите конвертировать h ost заказ в n и т.д. При получении с Java (или любого клиента) ваш сервер конвертируется обратно, используя ntohs.

...