通过 AsyncUDPSocket 发送时崩溃

Posted

技术标签:

【中文标题】通过 AsyncUDPSocket 发送时崩溃【英文标题】:Crash when sending via AsyncUDPSocket 【发布时间】:2012-09-20 04:18:41 【问题描述】:

我正在尝试通过 UDP 进行广播。我包含了 CFNetworking 框架并将 AsyncUDPSocket 添加到我的项目中。

#import "AsyncUdpSocket.h"

然后我创建了一个套接字:

    broadcastSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];

我发送数据为:

[self.broadcastSocket enableBroadcast:YES error:&error];
[self.broadcastSocket sendData:[@"hello" dataUsingEncoding:NSASCIIStringEncoding] toHost:@"255.255.255.255" port:5538 withTimeout:10 tag:1];

但是当我发送数据时,AsyncUdpSocket 崩溃并出现 EXC_BAD_ACCESS

- (CFSocketRef)socketForPacket:(AsyncSendPacket *)packet

具体在

return ([packet->address length] == sizeof(struct sockaddr_in)) ? theSocket4 : theSocket6;

或者它有时也会崩溃:

- (void)doSend:(CFSocketRef)theSocket

const void *buf  = [theCurrentSend->buffer bytes];

我的插座有什么问题吗?

【问题讨论】:

【参考方案1】:

啊,我明白了。我更新到最新版本的 AsyncUDPSocket,它需要 ARC。有一个警告,它发出的问题没有在我的调试器中弹出,这是另一个问题。但是,查看源代码时,它在第 11 行。Doh!

添加了 ARC 标志 (-fobjc-arc),它运行良好!

【讨论】:

非常感谢,您节省了我的时间。我总是在这一行得到错误 'const void *buf = [theCurrentSend->buffer bytes];'【参考方案2】:

您创建了套接字,但您是否创建了packet

【讨论】:

你应该可以简单地使用AsyncUdpSocket的sendData函数来发送一个数据包。不需要手动构建。 代码 sn-p 不完整,所以不清楚当你引用packet 时它实际上已经被初始化了。如果它没有被初始化,或者它已经被释放,那将导致崩溃。 我正在使用 AsyncUdpSocket 的一个实例。您不需要手动构建数据包。

以上是关于通过 AsyncUDPSocket 发送时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

应用程序崩溃时未删除 Unix 域套接字文件

IOS4 - 在 Wifi 上使用 UDP 套接字发送数据

ios开发UDP协议发送广播寻找设备

使用 GameKit 崩溃通过蓝牙发送数据

通过意图传递对象时应用程序崩溃

表情符号在上传到 Bigquery 时崩溃