Ios 在GCDAsyncSocket中通过TCP传输文件 我正在编写一个游戏,我打算把一个.CAF声音文件从iPhone转移到我的C++服务器。现在,当我向sendGameUpdateWithFile函数发送消息时,我得到了一个EXC\u BAD\u访问权限,我真的不知道为什么
虽然这与任何大学作业无关,但请记住,我是一名计算机科学专业的学生,还不是一名专业的网络程序员,所以请在此后判断我的代码 下面是我用来将数据传输到服务器的代码(服务器现在崩溃):Ios 在GCDAsyncSocket中通过TCP传输文件 我正在编写一个游戏,我打算把一个.CAF声音文件从iPhone转移到我的C++服务器。现在,当我向sendGameUpdateWithFile函数发送消息时,我得到了一个EXC\u BAD\u访问权限,我真的不知道为什么,ios,objective-c,tcp,file-transfer,gcdasyncsocket,Ios,Objective C,Tcp,File Transfer,Gcdasyncsocket,虽然这与任何大学作业无关,但请记住,我是一名计算机科学专业的学生,还不是一名专业的网络程序员,所以请在此后判断我的代码 下面是我用来将数据传输到服务器的代码(服务器现在崩溃): 服务器需要给定的msgtypes——问题在于客户端。您能发布崩溃日志吗?错误访问发生在哪条线路上。此外,您的第一行还会造成内存泄漏。NSMutableData*数据=[[NSMutableData alloc]init];创建一个alloc'd对象,然后您将丢失对该对象的引用,该对象的数据=[NSMutableData
服务器需要给定的msgtypes——问题在于客户端。您能发布崩溃日志吗?错误访问发生在哪条线路上。此外,您的第一行还会造成内存泄漏。NSMutableData*数据=[[NSMutableData alloc]init];创建一个alloc'd对象,然后您将丢失对该对象的引用,该对象的数据=[NSMutableData dataWithContentsOfFile:filePath];这将创建一个自动释放的对象Hey Bergasms。我很想发布一个崩溃日志,但终端只是简单地声明(lldb),我在代码中得到一个箭头,在该函数的最后一行有文本Thread1:EXEC\u BAD\u ACCES(code=1,address=0xfffffff0)。关于memleak:我的程序中有ARC。由于在函数返回后,指向数据的指针超出范围,我假设数据字段被ARC释放?请不要生气。。。您是否放置了断点和nslog来检查信息?完成了多少次迭代?他们的号码正确吗?处理后的值和结果值在预期范围内?我一点也不生气!我在过去的一个小时里使用了断点,看来for循环就是问题所在。对于我正在测试的数据,我得到以下数据包=16,这是有意义的。for循环运行一次,第二次输入时,它在strncpy调用中崩溃。在此之前一切正常,但调用strncpy后,所有指针都变为nil,所有值都变为0。然后我得到了坏的东西。对我来说似乎很奇怪。你每次迭代都在增加这个范围。长度-不应该保持1024吗?其次,在第一个循环的最后一次迭代中,对
getBytes:range:
的调用可能会呕吐,因为您试图准确地读取thisRange.length
字节,而数据的字节可能仍然存在。最后,如果要复制二进制数据(可能包含空值),则应使用memcpy()
而不是strncpy()
。
- (void) sendGameUpdateWithFile:(NSString*)filePath gameID:(NSInteger)gameID {
NSMutableData* data = [[NSMutableData alloc] init];
data = [NSMutableData dataWithContentsOfFile:filePath];
fileheadPacket head;
head.msgtype = 0x12;
strncpy(head.data1, [myUsername cStringUsingEncoding:NSASCIIStringEncoding], [myUsername length]);
int followingPackets = (([data length] % 1024 == 0) || ([data length] < 1024))? ([data length]/1024) : ([data length]/1024)+1;
head.following = followingPackets;
head.fileid = gameID;
head.size = sizeof(packet);
[mySock writeData:[NSData dataWithBytes:&head length:sizeof(packet)] withTimeout:-1 tag:7];
filePacket sendPackets[followingPackets];
for(int i = 0; i < followingPackets; i++){
NSRange thisRange;
thisRange.location = i*1024;
thisRange.length = (i+1)*1024;
filePacket tmp;
tmp.msgtype = 0x13;
tmp.size = sizeof(filePacket);
memset(tmp.data1, 0, sizeof(tmp.data1));
[data getBytes:tmp.fileBuffer range:thisRange];
strncpy((char*)&sendPackets[i], (char*)&tmp, sizeof(tmp));
}
for(int i = 0; i < followingPackets; i++){
[mySock writeData:[NSData dataWithBytes:&sendPackets[i] length:sizeof(filePacket)] withTimeout:-1 tag:3];
}
}
typedef struct file_packet {
int msgtype:8;
int size:16;
int nul:8;
int following:24;
int emp:8;
char data1[64];
char fileBuffer[1024];
} filePacket;
typedef struct filehead_packet {
int msgtype:8;
int size:16;
int nul:8;
int following:24;
int emp:8;
char data1[64];
int fileid;
char rest[60];
} fileheadPacket;