Question

J'ai du mal à communiquer des coordonnées de position à un ensemble de moteurs que j'ai connectés sur le réseau.Je peux envoyer une ficelle juste bien et recevoir du texte du moteur, mais je n'arrive pas à l'envoyer une valeur INT.

Utilisation de NSLog J'ai déterminé que la valeur réelle que j'envoie est correcte, mais je soupçonne que ma méthode de l'envoi via le flux de sortie est fausse.Des idées?

Mon code pour envoyer une valeur INT de 64 bits:

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];

Était-ce utile?

La solution

Eh bien, vos codes sont un peu drôle.Quoi qu'il en soit, pour envoyer un entier binaire sur le réseau, vous devez connaître l'endianess: le récepteur s'attend à ce que peu ou de gros entiers endians.

Voici le code pour les deux:

uint64_t myInt = 42;

uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian
uint64_t netInt = CFSwapInt64HostToBig(myInt);    // use this for big endian

[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)];

Autres conseils

Vous voyez probablement un problème d'endansion.Les processeurs Intel sont Little-Endian , ce qui signifie que l'octet le moins important dans une valeur multi-octets est enregistré en premier, l'octet le plus important dernier.Lecture d'un numéro de 8 octets de la mémoire et de la mettre sur le réseau sans rien faire entraînera les octets de sortir dans cet ordre.

La plupart des protocoles de réseau (y compris tous les protocoles Internet) s'attendent à des données Big-Endian , l'octet le plus important apparaît d'abord sur le réseau et le dernier octet significatif dernier.Votre protocole de réseau s'attend-il à ce que?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top