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;