2011-06-17 5 views
0
final byte LOGIN_REQUEST = 1; 
    long deviceId = 123456789; 
    String nickname = "testid"; 

    Socket mSocket = new Socket("localhost", 12021); 
    ByteBuffer bBuffer = ByteBuffer.allocate(1); 
    bBuffer.order(ByteOrder.LITTLE_ENDIAN); 

    //1 
    bBuffer.put(LOGIN_REQUEST); 

    //8 
    bBuffer.putLong(deviceId); 

    byte[] bString = nickname.getBytes(); 
    int sLength = bString.length; 

    //4 
    bBuffer.putInt(sLength); 
    bBuffer.put(bString); 

J'envoie des données d'octets comme ça et je veux analyser sur mon serveur linux en utilisant C++Comment analyser les données en C++

en C++, je lis

char *pdata = new char[BUF_SIZE]; 
int dataLength = read(m_events[i].data.fd, pdata, BUF_SIZE); 

et pousser le pdata dans la file d'attente de pthread. Je pense que je dois lire le premier octet pour voir le type du paquet et lire la prochaine 8byte pour obtenir l'identifiant de l'appareil et ainsi de suite .. S'il vous plaît me donner quelques références ou tutoriel pour faire en C++ code ..

Merci d'avance ..

Répondre

1

Le code ci-dessous va effectivement faire l'affaire. Je suppose une java int est 32bit

#include <inttypes.h> 

// Declare variables 
unsigned char login_req; 
int64_t  device_id; 
uint32_t  name_len; 
char*   name_str; 

// Populate variables; 
login_req = pdata[0]; 
memcpy(&device_id, pdata+1, 8); 
memcpy(&name_len, pdata+9, 4); 
name_str = (char*)malloc(name_len + 1); 
memcpy(name_str, pdata+13, name_len); 
name_str[name_len] = '\0'; 

Note: Je dissimulons des choses, à savoir

  • ne gère pas quand BUF_SIZE est petite
  • ne gère pas lorsque la machine du programme C Ce n'est pas un petit ENDIAN. S'il est grand endian alors vous avez besoin de changer les octets après la memcpy pour device_id et name_len
  • Ne pas taper cast sur memcpy appelle à éviter les avertissements possibles du compilateur

Cette solution est C pure, fonctionnera en C++ aussi

+0

Merci pour votre réponse. Je regarde en ligne et j'ai trouvé un code utilisant fstream et iostream. Est-ce la même chose en utilisant ceci et en utilisant memcpy? Pourriez-vous s'il vous plaît fournir des tutoriels ou des exemples en utilisant ces fstream et iostream? Merci d'avance.. – user800799

0

Si vous avez le contrôle sur le code Java, et qu'il n'y a pas de protocole réseau standard à implémenter, alors je recommanderais une approche différente. Au lieu de pousser des octets à ce niveau, vous pouvez utiliser une bibliothèque de sérialisation de niveau supérieur, telle que Google Protocol Buffers. Il y a C++ tutorials et Java tutorials, ce qui devrait vous aider à démarrer.

0

Utilisation de la bibliothèque iostream est à peu près la même chose que vous auriez pu faire à l'aide de lecture de base et écrire sans le tampon intermédiaire dans C ie

#include <inttypes.h> 
#include <iostream> 

void readData(std::istream input) 
{ 
    // Declare variables 
    unsigned char login_req; 
    int64_t  device_id; 
    uint32_t  name_len; 
    char*   name_str; 

    // Populate variables; 
    input.read(&login_req, 1); 
    input.read(&device_id, 8); 
    input.read(&name_len, 4); 
    name_str = (char*)malloc(name_len + 1); 
    input.read(name_str, name_len); 
    name_str[name_len] = '\0'; 
} 

Encore une fois je suis erreur de ne pas vérifier sur le istream :: lire des appels, s'inquiéter des problèmes d'endian, ou mettre dans les moulages de type. Essayer de rester simple.