我想通过GameKit
发送一些NSData
而不是Bluetooth
。通过GameKit发送和接收NSData
虽然我设置了GameKit
并且能够发送小消息,但我现在想要扩展并发送整个文件。
我一直在阅读,你必须将大文件拆分成数据包,然后再单独发送它们。
所以我决定创建一个struct
,使其更容易对数据包进行解码,当他们在另一端会根据收到:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
然而,对于小文件(8KB和更小)我想一个包就足够了。
因此,对于一个包,我想我应该能够创建一个file_packet,设置其属性,并通过-sendDataToAllPeers发送:withDataMode:错误:
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
,甚至当我设置包编号为1
我缺少明显的? 我对NSData
或GameKit
了解不多。
所以我的问题是 - 我可以在NSData
中添加一个file_packet
,如果是这样,我该如何成功 - 以及如何将文件分成多个数据包?
感谢您的回答,但是在测试之后,它似乎崩溃了(EXC_BAD_ACCESS)。不知道如何实现它,因为我这样做的方式不起作用 – 2011-01-30 08:58:19