Objective c SIGABRT发生在该函数的末尾

Objective c SIGABRT发生在该函数的末尾,objective-c,Objective C,在以下函数的末尾(只调用一次),我收到一个SIGABRT,它是uu堆栈_chk_失败的结果。我认为这意味着堆栈已损坏?为什么会导致流产 代码应该向我的服务器发送一个文件,为此,它将文件分成256字节的块,并分别发送。我这样做的原因是写[writeSock write:[buf bytes]]只会导致30-40%的数据被发送 - (BOOL) sendFile:(NSData*)buf { CFReadStreamRef readStream; CFWriteStreamRef w

在以下函数的末尾(只调用一次),我收到一个SIGABRT,它是uu堆栈_chk_失败的结果。我认为这意味着堆栈已损坏?为什么会导致流产

代码应该向我的服务器发送一个文件,为此,它将文件分成256字节的块,并分别发送。我这样做的原因是写
[writeSock write:[buf bytes]]
只会导致30-40%的数据被发送

- (BOOL) sendFile:(NSData*)buf
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)(@"servername"), 999, &readStream, &writeStream);

    NSInputStream * readSock = (__bridge NSInputStream*)(readStream);
    [readSock setDelegate:self];
    NSOutputStream * writeSock = (__bridge NSOutputStream * )(writeStream);
    [writeSock setDelegate:self];


    [readSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [writeSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    NSLog(@"Open socket");
    [readSock open];
    [writeSock open];

    [writeSock write:(uint8_t*)("submit\0\0\0\0") maxLength:10];

    NSLog(@"Data length: %d", [buf length]);

    // Write length to server
    uint32_t length = (uint32_t)([buf length]);
    [writeSock write:(uint8_t *)&length maxLength:4];
    // Write data to server
    Byte smallBuf[256];
    uint32_t amountTransfered = 0;
    while (amountTransfered < length) {
        NSRange r;
        r.location = amountTransfered;
        r.length = MIN(amountTransfered + 256, length - amountTransfered);
        [buf getBytes:smallBuf range:r];
        [writeSock write:smallBuf maxLength:r.length];
        amountTransfered += r.length;
    }

    NSLog(@"Done writing");
    /*uint8_t inBuf[128];
    [readSock read:inBuf maxLength:128];

    if (strcmp((char*)inBuf, "success") != 0) {
        NSLog(@"Couldn't submit file: %s", (char*)inBuf);
    }*/

    NSLog(@"Close socket");
    return YES;
}
-(BOOL)sendFile:(NSData*)buf
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL,(CFStringRef)(@“servername”)、999、&readStream和&writeStream);
NSInputStream*readSock=(桥NSInputStream*)(readStream);
[readSock setDelegate:self];
NSOutputStream*writeSock=(u桥NSOutputStream*)(writeStream);
[writeSock setDelegate:self];
[readSock ScheduleRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
[writeSock ScheduleUnloop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
NSLog(@“开放式套接字”);
[readSock打开];
[写回打开];
[writeSock write:(uint8_t*)(“提交\0\0\0\0”)最大长度:10];
NSLog(@“数据长度:%d”,[buf长度]);
//对服务器的写入长度
uint32_t长度=(uint32_t)([buf长度]);
[writeSock write:(uint8_t*)&长度maxLength:4];
//将数据写入服务器
字节smallBuf[256];
uint32_t amountTransfered=0;
while(传输的数量<长度){
NSRange;
r、 位置=转移的数量;
r、 长度=最小值(amountTransfered+256,长度-amountTransfered);
[buf getBytes:smallBuf range:r];
[写回写入:smallBuf maxLength:r.length];
转移数量+=r.长度;
}
NSLog(“完成编写”);
/*uint8_t inBuf[128];
[readSock read:inBuf maxLength:128];
if(strcmp((char*)inBuf,“success”)!=0){
NSLog(@“无法提交文件:%s”,(char*)inBuf);
}*/
NSLog(“闭合插座”);
返回YES;
}
您写道:

r.length=MIN(amountTransfered+256,length-amountTransfered)

你是说:

r.length=MIN(256,length-amountTransfered)


您应该始终检查
[NSOutputStream write:maxLength:][/code>的结果,如果它返回-1,您不应该继续在
writeSock
上写入。好的,谢谢您的提示。我想我有时会设法将其与“end”而不是“length”混淆,但有时会正确。