Objective c SIGABRT发生在该函数的末尾
在以下函数的末尾(只调用一次),我收到一个SIGABRT,它是uu堆栈_chk_失败的结果。我认为这意味着堆栈已损坏?为什么会导致流产 代码应该向我的服务器发送一个文件,为此,它将文件分成256字节的块,并分别发送。我这样做的原因是写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
[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”混淆,但有时会正确。