gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:20:28 27 4
gpt4 key购买 nike

我正在尝试从套接字读取数据,并且在大多数情况下都可以正常工作。

当我长时间运行应用程序时-应用程序崩溃并且crashlytics将崩溃指向readingSocket()-此函数仅从套接字读取原始数据。

下面是readingSocket()的代码

-(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可能是相同的值,但不能保证。如果不确定平台的行为是否完全符合您的想法,则可以考虑同时检查它们。

An example link to Linux documentation

2)您的逻辑,
if (readBytesNow == 0) {
...
} Else if (bytesRead < 0) {
...
} else if (readBytesNow > 0) {
...
}

尽管冗长,但这是不必要的。您可以使用
if (readBytesNow == 0) {
...
} Else if (bytesRead < 0) {
...
} else {
...
}

以确保您没有得到更多的比较。无论如何,这种比较可能会得到优化,但是以这种方式编写会更有意义。我不得不再次看一看“如果我缺少什么”。

希望这些帮助。

关于ios - 在读取套接字数据时崩溃-recv()-在objective-c中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61269520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com