【发布时间】:2023-03-17 12:17:01
【问题描述】:
我正在尝试通过GameKit 向Bluetooth 发送一些NSData。
虽然我已经设置了 GameKit 并且能够发送小消息,但我现在想扩展并发送整个文件。
我一直在读到您必须将大文件拆分为数据包,然后再单独发送。
所以我决定创建一个struct,以便在另一端收到数据包时更轻松地对其进行解码:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
但是,对于小文件(8KB 及以下),我认为一个数据包就足够了。
所以对于一个数据包,我想我可以创建一个 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 设置为 1,控制台上的输出也是 packetNumber = 0。
我错过了显而易见的事情吗?
我不太了解NSData 或GameKit。
所以我的问题是——我可以在NSData 中添加一个file_packet,如果可以,我如何成功地做到这一点——以及如何将文件拆分为多个数据包?
【问题讨论】:
标签: iphone objective-c data-structures nsdata gamekit