Sto cercando di inviare alcune NSData
oltre Bluetooth
attraverso GameKit
.Inviare e ricevere NSData via GameKit
Mentre ho impostato GameKit
e sono in grado di inviare messaggi di piccole dimensioni, ora mi piacerebbe espandere e inviare su interi file.
Ho letto che si deve dividere file di grandi dimensioni in pacchetti prima di inviarli attraverso singolarmente.
Così ho deciso di creare un struct
per rendere più facile per decodificare i pacchetti quando sono ricevuti all'altro capo:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Tuttavia, per file di piccole dimensioni (8 KB e meno) ho pensato un pacchetto sarà abbastanza
Così, per un pacchetto, ho pensato di essere in grado di creare un file_packet, impostarne le proprietà, e inviarlo via -sendDataToAllPeers: withDataMode: errore:
NSData *fileData;
file_packet *packet = (file_packet *)malloc(sizeof(file_packet));
packet->fileName = [filename cStringUsingEncoding:NSASCIIStringEncoding];
packet->contents = [NSData dataWithContentsOfFile:selectedFilePath];
packet->packetnumber = 1;
packet->totalpackets = 1;
packet->fileType = 56; //txt document
fileData = [NSData dataWithBytes:(const void *)packet length:sizeof(file_packet)];
free(packet);
NSError *error = nil;
[self.connectionSession sendDataToAllPeers:fileData withDataMode:GKSendDataReliable error:&error];
if (error) {
NSLog(@"An error occurred: %@", [error localizedDescription]);
}
Tuttavia, non credo che c'è qualcosa che non right setting fileData - e error
non visualizza nulla.
Quando di ricevuta, faccio il seguente file:
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
Tuttavia, l'output sulla console è packetNumber = 0
, anche quando ho impostato packetNumber a 1.
Mi sto perdendo l'ovvio? Non so molto su NSData
o GameKit
.
Quindi la mia domanda è - Posso aggiungere uno file_packet
in NSData
e, in caso affermativo, Come faccio a farlo con successo - e Come dividi i file in più pacchetti?
Grazie per la risposta, tuttavia, dopo averlo testato, sembra bloccarsi (EXC_BAD_ACCESS). Non so come implementarlo perché il modo in cui sto facendo non funziona –
Dopo aver letto il tuo commento, ho trovato un cattivo uso di un oggetto autoreleased. Puoi provare di nuovo. Ma in generale, EXC_BAD_ACCESS è spesso "interagito con un oggetto dealloced". Puoi usare il profilo di Allocations di Strumenti, con gli Zombi accesi, per cacciare quelli verso il basso. È inestimabile! – ipmcc
Dopo alcune regolazioni il codice funziona perfettamente. Grazie. –