NSData
을 Bluetooth
에서 GameKit
까지 보내려고합니다.GameKit을 통해 NSData를 보내고 받으십시오.
GameKit
을 설정하고 작은 메시지를 보낼 수 있지만 이제 전체 파일을 확장하여 보내고 싶습니다.
커다란 파일을 개별적으로 전송하기 전에 패킷으로 분할해야한다고 읽었습니다. 나는 하나 개의 패킷을 생각 작은 파일 (8킬로바이트 및 이하)에 대한
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
그러나 :
그래서 나는 그들이 다른 끝에서 수신 할 때 쉽게 패킷을 디코딩 할 수 있도록하기 위해struct
을 만들기로 결정 충분할거야. 뭔가가 생각하지 않습니다,
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]);
}
그러나 : withDataMode : 오류를
그래서 하나 개의 패킷을 위해, 나는 그것의 속성을 설정하는 file_packet을 만들 수 및 -sendDataToAllPeers로 보내 줄 알았는데 파일 데이터를 올바르게 설정하면 error
에 아무 것도 표시되지 않습니다.
때 파일의 수신, 나는 다음을 수행하십시오
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
그러나, 콘솔의 출력은 내가 1
나는 분명 실종에 packetNumber을 설정 한 경우에도, packetNumber = 0
입니까? NSData
또는 GameKit
에 대해 많이 알지 못합니다.
제 질문은 - NSData
에 file_packet
을 추가 할 수 있습니까? 그렇다면 어떻게해야합니까? - 파일을 여러 개의 패킷으로 어떻게 분할합니까?
그러나 답변을 주셔서 감사합니다. 테스트를 마친 후 충돌 (EXC_BAD_ACCESS)이 발생했습니다. 내가 그것을하는 방식으로 작동하지 않기 때문에 그것을 구현하는 방법을 모르겠다 –
귀하의 의견을 읽은 후, 나는 autoreleased 개체의 나쁜 사용을 발견했습니다. 다시 시도하고 싶을 수도 있습니다. 그러나 일반적으로 EXC_BAD_ACCESS는 "할당 취소 된 객체와 상호 작용합니다." 악기를 사냥하기 위해 좀비가 켜져있는 Instruments의 Allocations 프로파일을 사용할 수 있습니다. 그것은 매우 귀중합니다! – ipmcc
몇 가지 조정을하면 코드가 완벽하게 작동합니다. 감사. –