2009-09-15 1 views
0

Ok Voici le problème. J'essaie d'envoyer à travers une structure ou quelque chose à travers le code de paquet de réseau d'Apple bluetooth. Le code est d'envoyer ci-dessousJ'ai jeté un sort sur les paquets de données pour 36 heures maintenant, aidez s'il vous plaît!

-(void)sendMessagePacket:(GKSession *)session packetID:(int)packetID withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend { 

static unsigned char networkPacket[maxPacketSize]; 
const unsigned int packetHeaderSize = 2 * sizeof(int); // we have two "ints" for our header 

if(length < (maxPacketSize - packetHeaderSize)) { // our networkPacket buffer size minus the size of the header info 
    int *pIntData = (int *)&networkPacket[0]; 
    // header info 
    pIntData[0] = 10; 
    pIntData[1] = packetID; 

    // copy data in after the header 
    memcpy(&networkPacket[packetHeaderSize], data, length); 

    NSData *packet = [NSData dataWithBytes: networkPacket length: (length+8)]; 

    if(howtosend == YES) { 
     [session sendDataToAllPeers:packet withDataMode:GKSendDataReliable error:nil]; 
    } else { 
     [session sendDataToAllPeers:packet withDataMode:GKSendDataUnreliable error:nil]; 
    } 
} 

}

Si quelqu'un pouvait passer par ce avec un peigne et d'expliquer ce qui se passe qui serait grandement apprécié. Ensuite, le code de réception.

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context { 
// Caller whenever data is received from the session 
unsigned char *incomingPacket = (unsigned char *)[data bytes]; 

//EXPECTS THAT WHAT IS IN INCOMING PACKET [0] TO BE OF DATA TYPE INTEGER 
int *pIntData = (int *)&incomingPacket[0]; 

int packetTime = pIntData[0]; 

int packetID = pIntData[1]; 

static int lastPacketTime = -1; 

    switch (packetID) { 
    case NETWORK_COINTOSS: 
     //DO SOMETHING 
     break; 

     case NETWORK_TEXT_EVENT: 

      NSString *fewMore = (NSString *)&incomingPacket[8]; 

      fewThings *bitMore = &fewMore[peer]; 

      //NSLog(@"Trace Bit More: %@",fewMore); 
      break; 
    default: 
     break; 
} 


NSInteger lengthBytes = [data length]; 
NSLog(@"Length of data : %i", lengthBytes); 

}

Ce que je me bats pour understnad être un Newcome à c objectif est de savoir comment tout cela fonctionne, comment puis-je accéder à la chaîne que je l'ai envoyer comme tous les efforts pour LOGGUE que le Programme crash.

Ci-dessous est le code utilisé pour démarrer l'envoi:

NSString *bigWord = @"BigWordBigWord"; 
NSInteger len = [bigWord length]; 
[self sendMessagePacket:gameSession packetID:NETWORK_TEXT_EVENT withData:bigWord ofLength:(len) reliable:YES]; 

Toute aide serait si apprécié. Je vous remercie.

Répondre

1

Vous devez vraiment remplacer l'objet NSString par une représentation UTF8 à envoyer, ou l'archiver en tant qu'objet NSData que vous envoyez avec toute la longueur. Vous ne pouvez pas simplement transformer un NSString en chaîne C (que ce soit pour envoyer ou recevoir !!!).

Vous pouvez obtenir une version chaîne C de NSString en utilisant:

const char * sendString = [bigWord cStringUsingEncoding: NSUTF8StringEncoding]

Et puis sortir de votre objet NSData entrant avec

NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
0

Ce gars envoie et reçoit la chaîne sur le réseau très bien. Mais, je reçois toujours des erreurs à la réception.

http://discussions.apple.com/thread.jspa?messageID=10215848

enfin obtenu. GKTank transfère les données en utilisant struct, donc j'ai placé ma chaîne dans la structure et le reste est l'historique.

typedef struct { 
    NSString *strInfo; 
} myInfo; 
Questions connexes