读取objective-c中的套接字数据-recv()时崩溃



我正在尝试从套接字中读取数据,它在大多数情况下都能正常工作。

当我长时间运行应用程序时——应用程序崩溃,crashlytics将崩溃指向readingSocket((——这个函数只从套接字读取原始数据。

以下是读取Socket((的代码

-(bool) readingSocket:(NSMutableData*)dataIn readBytes:(ssize_t)quantity error:(NSError **)error {
ssize_t readBytesNow = 0;
ssize_t grossRead= 0;
[dataIn setLength:0];
if (error != nil) {
*error = nil;
}
char *buffer = new char[6144];
do {
ssize_t readBytes = (quantity - grossRead);
readBytesNow = recv((int)raw_Socket, buffer, readBytes , MSG_DONTWAIT);
if (readBytesNow == 0) {
NSLog(@" read error");
delete[] buffer;
return false;
}
Else if (bytesRead < 0) {
if (errno == EAGAIN) {
[NSThread sleepForTimeInterval:0.5f];
NSLog(@" EAGAIN error");
continue;
}
else {
// if error != nil
delete[] buffer;
return false;
}
}
else if (readBytesNow > 0) {
grossRead += readBytesNow;
// doing some operations
}
} while (grossRead < quantity);

delete[] buffer;
return true;
}

在阅读后,我已经做了很多检查,但不确定崩溃或异常的可能原因在哪里??

在我上面的代码中,还有其他更好的方法来处理异常吗?

我不能在没有50信誉的情况下发表评论(这里是新用户(,所以下面是我的评论作为答案。

警告:我不知道你的代码是用什么语言编写的,但我是在用我作为C++程序员的直觉(可能是一个平庸的程序员(。

我首先注意到的是这段代码:

if (error != nil) {
*error = nil;
}

在C世界中,这类似于检查指针是否为null,但随后将null指定为其值。

第二件需要注意的是这个结构:

-(bool) readingSocket:(NSMutableData*)dataIn readBytes:(ssize_t)quantity error:(NSError **)error {
...
char *buffer = new char[6144];
...
ssize_t readBytes = (quantity - grossRead);

当数量>6144时,即偶尔,您的网络堆栈读取的字节可能超过6144,这将导致缓冲区溢出。

切向评论:

1( 我想你应该注意EAGAIN和EWOULDBLOCK可能是相同的值,但不能保证。如果你不确定你的平台是否与你想象的完全一样,你可能会考虑检查两者。

Linux文档的示例链接

2( 你的逻辑,

if (readBytesNow == 0) {
...
} Else if (bytesRead < 0) {
...
} else if (readBytesNow > 0) {
...
}

虽然冗长,但没有必要。你可以使用

if (readBytesNow == 0) {
...
} Else if (bytesRead < 0) {
...
} else {
...
}

以确保您不会得到额外的比较。无论如何,这种比较可能会得到优化,但这样写更有意义。我不得不再看一遍,看看"我是否遗漏了什么"。

希望这些帮助。

最新更新