Estoy tratando de enviar algunos NSData
a través de Bluetooth
a través de GameKit
.Enviar y recibir NSData a través de GameKit
Mientras tengo configurado GameKit
y puedo enviar mensajes pequeños, ahora me gustaría expandir y enviar archivos completos.
He estado leyendo que debe dividir archivos grandes en paquetes antes de enviarlos de forma individual.
así que decidí crear un struct
para que sea más fácil de decodificar los paquetes cuando son recibidos en el otro extremo:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Sin embargo, para archivos pequeños (de 8 KB y menos) pensé un paquete será suficiente.
Así que para un paquete, pensé que iba a ser capaz de crear un file_packet, establecer sus propiedades, y enviarlo por -sendDataToAllPeers: withDataMode: Error:
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]);
}
Sin embargo, no creo que algo anda la configuración correcta fileData - y error
no muestra nada.
Cuando ha recibido, hago lo siguiente en un archivo:
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
Sin embargo, la salida de la consola es packetNumber = 0
, incluso cuando me puse a packetNumber 1.
Me estoy perdiendo lo obvio? No sé mucho sobre NSData
o GameKit
.
Así que mi pregunta es: ¿Puedo agregar un file_packet
en NSData
? De ser así, ¿cómo lo hago con éxito? ¿Cómo se dividen los archivos en múltiples paquetes?
Gracias por su respuesta, sin embargo, después de probarlo, parece bloquearse (EXC_BAD_ACCESS). No estoy seguro de cómo implementarlo porque la forma en que lo estoy haciendo no funciona –
Después de leer su comentario, encontré un mal uso de un objeto liberado automáticamente. Es posible que desee intentarlo de nuevo. Pero en general, EXC_BAD_ACCESS a menudo "interactúa con un objeto desasignado". Puedes usar el perfil de Asignaciones de Instrumentos, con Zombies activados, para cazarlos. ¡Es invaluable! – ipmcc
Después de algunos ajustes, el código funciona perfectamente. Gracias. –