2009-11-26 23 views
3

Je crée un petit client TFTP application serveur où le serveur est développé en utilisant C++ et le client en utilisant java.C++ serveur htons à java ntohs conversion client

Ici, j'envoie la valeur "nombre de blocs" en utilisant la conversion htons.

Mais je ne suis pas en mesure de le reconvertir à sa valeur d'origine chez le client.

Par exemple, si j'envoie le nombre de blocs ntohs(01) (2 octets) du serveur au client . Le client lit en octets. La valeur que je reçois est octet 0 et octet 1.

S'il vous plaît si n'importe qui peut fournir une solution .

Répondre

3

Je suppose que vous signifie que vous utilisez ntohs à decode les valeurs lues à partir du réseau, et htons à encode les valeurs envoyées sur le réseau.

Regardez dans ByteBuffer#getShort() de concert avec ByteBuffer#order(ByteOrder). L'ordre des octets du réseau est big endian, utilisez donc la valeur ByteOrder#BIG_ENDIAN pour configurer correctement votre ByteBuffer. Notez que BIG_ENDIAN est l'ordre par défaut, mais dans ce cas, il serait bon d'indiquer explicitement votre préférence. Vous n'avez pas mentionné ce que vous utilisez pour les communications réseau en Java. Si c'est un java.net.Socket, vous pouvez appeler Socket#getChannel() pour obtenir un java.nio.channels.SocketChannel, un sous-type de java.nio.channels.ByteChannel, avec lequel vous pouvez utiliser ByteBuffer pour lire et écrire des données.

0

Les nombres de Java en interne sont toujours dans l'ordre des octets du réseau, même sur les systèmes où les entiers/doubles natifs ne le sont pas. Cela signifie que vous pouvez convertir n'importe quel nombre entrant dans Java avec l'un des flux d'entrée de base qui effectuent ce type de conversion - qui implémentent java.io.DataInput. ByteBuffer fonctionne également si vous utilisez java.nio.Channel mais vous pouvez y changer l'endianness (ByteBuffer.order()), bien que la valeur par défaut soit correcte pour l'ordre des octets réseau et le stockage interne Java. Soit dit en passant, je pense que vous voulez utiliser htons mais dans l'exemple, vous montre ntohs. Envoi de C++ vous voulez convertir h ost commander n etwork. Réception de Java (ou de tout client) que votre serveur convertirait en utilisant ntohs.

1
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(); 
    }