Próbuję wysłać niektóre NSData
przez Bluetooth
do GameKit
.Wysyłaj i odbieraj dane NSData za pośrednictwem GameKit
Podczas gdy mam GameKit
skonfigurować i są w stanie wysyłać małe wiadomości przez, teraz chciałbym rozwinąć i wysłać na całe pliki.
Czytałem, że musisz podzielić duże pliki na pakiety przed wysłaniem ich pojedynczo.
Więc postanowiłem stworzyć struct
aby ułatwić dekodowanie pakietów, gdy są one otrzymane na drugim końcu:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Jednak dla małych plików (8KB i mniej) Myślałem jeden pakiet to wystarczy.
Więc dla jednego pakietu, myślałem, że będę w stanie stworzyć file_packet ustawić jego właściwości, i wysłać go poprzez -sendDataToAllPeers: withDataMode: błąd:
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]);
}
Jednak nie sądzę, że coś jest prawidłowe ustawienie fileData - i error
nic nie wyświetla.
Gdy plik otrzymali, mam następujące:
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
Jednak wyjście na konsoli jest packetNumber = 0
, nawet kiedy ustawić packetNumber do 1.
jestem brakuje oczywiste? Niewiele wiem o NSData
lub GameKit
.
Moje pytanie brzmi - czy mogę dodać file_packet
w NSData
, a jeśli tak, to jak mam to zrobić - i jak podzielić pliki na wiele pakietów?
Dziękuję za odpowiedź, jednak po przetestowaniu wydaje się, że zawiesił się (EXC_BAD_ACCESS). Nie wiem, jak to zaimplementować, ponieważ sposób, w jaki to robię, nie działa. –
Po przeczytaniu Twojego komentarza znalazłem złe użycie autoreleased obiektu. Możesz spróbować jeszcze raz. Ogólnie rzecz biorąc, EXC_BAD_ACCESS często "wchodzi w interakcje z deallokowanym obiektem". Możesz użyć profilu Przydziałów Instrumentów, z włączonymi Zombiesami, aby polować na nich. Jest nieoceniony! – ipmcc
Po kilku zmianach kod działa idealnie. Dzięki. –