Я пытаюсь отправить некоторые NSData
через Bluetooth
через GameKit
.
Пока у меня установлен GameKit
вверх и могут отправлять небольшие сообщения,Теперь я хотел бы развернуть и отправить по всем файлам.
Я читал, что вам нужно разбить большие файлы на пакеты, прежде чем отправлять их по отдельности.
Поэтому я решил создать struct
, чтобы упростить декодирование пакетов, когда они получены на другом конце:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Однако для небольших файлов (8 КБ и меньше) я думал, что одного пакета будет достаточно.
Итак, для одного пакета я думал, что смогу создать file_packet, установить его свойства и отправить его через -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]);
}
Однако я не думаю, что что-то правильное установление fileData - и error
ничего не отображает .
Когда файл получен, я делаю следующее:
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
Однако вывод на консоль packetNumber = 0
, даже когда я установил packetNumber равным 1.
Я упускаю очевидное?
Я мало что знаю о NSData
или GameKit
.
Итак, мой вопрос - могу ли я добавить file_packet
в NSData
, и если да, то как мне это сделать успешно - и как разделить файлы на несколько пакетов?