使用 GCDAsyncUdpSocket 的 iOS swift 应用程序

Posted

技术标签:

【中文标题】使用 GCDAsyncUdpSocket 的 iOS swift 应用程序【英文标题】:iOS swift application using GCDAsyncUdpSocket 【发布时间】:2015-04-16 16:25:09 【问题描述】:

我对构建 ios 应用非常陌生。

我正在尝试创建一个类来接收 udp 多播消息,但我根本无法让它工作...

class Discovery : GCDAsyncUdpSocketDelegate

    var udpSocket:GCDAsyncUdpSocket!;

    init() 
        udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())

        var e:NSErrorPointer = nil;

        //Binding to port
        if(!udpSocket.bindToPort(2025, error: e))
            println(e);
            return;
        

        //Joining multicast group
        if(!udpSocket.joinMulticastGroup("239.5.6.7", error: e))
            println(e);
            return;
        

        //Begin recieve
        if(!udpSocket.beginReceiving(e))
            println(e);
            return;
        

        println("UDP socket was opened!")

    

    func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) 

        println("Got data!");

    

谁能看出我哪里出错了?我得到 UDP 套接字已打开消息,但没有收到任何包。我知道它们正在被发送,因为我正在使用wireshark 捕获它们。

发现是从我的视图控制器调用的

class ViewController: UIViewController, CLLocationManagerDelegate 

    let peer = Peer(id: NSUUID.new())
    let uuid = NSUUID.new()

    let discovery:Discovery = Discovery()

    let locationManager = CLLocationManager()
    let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "8DEEFBB9-F738-4297-8040-96668BB44281"), identifier: "Roximity")
    let com = OconCom()

    override func viewDidLoad() 
        super.viewDidLoad()


        locationManager.delegate = self;
        if (CLLocationManager.authorizationStatus() != CLAuthorizationStatus.AuthorizedAlways) 
            locationManager.requestAlwaysAuthorization()
        

        locationManager.startMonitoringForRegion(region)        //Background
        locationManager.startRangingBeaconsInRegion(region)     //Foreground


    

任何建议都会有所帮助。

【问题讨论】:

尝试实现udpSocketDidClose委托方法以确保您的套接字没有关闭。 我不是为什么它起作用,但是当我将代码移动到已经存在的 ViewController 时它起作用了。委托必须是实际运行的视图控制器才能工作吗? 委托只需驻留在内存中即可接收回调。也许您还没有初始化Discovery 的实例?如果您发布更多上下文代码,我可以尝试解释得更好。 @Ralfonso - 如果发布了我称之为发现的 sn-p。谢谢! :-) 我必须承认,即使有附加代码,我乍一看也看不出有什么问题。稍后我会尝试复制它,看看我是否能找出问题所在。有趣的错误! 【参考方案1】:

您的接收器与广播公司是否在同一网络上。通常,多播具有较低的 TTL,除非您的数据包遍历的路由器配置为允许它,否则它不会太远。

【讨论】:

是的,并且包裹已交付,只是没有调用委托【参考方案2】:

我在自定义课程中遇到了同样的问题。只需将 @obj public 添加到您的委托函数中。现在代理将被正确调用。

【讨论】:

以上是关于使用 GCDAsyncUdpSocket 的 iOS swift 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

GCDAsyncUdpSocket 在发送到 IPv6 地址时立即关闭

如何使用GCDAsyncUdpSocket连续发送udp数据包

通过所有可用的网络接口使用 GCDAsyncUdpSocket 进行 UDP 广播

为 GCDAsyncUdpSocket 设置最大数据包大小

GCDAsyncUdpSocket,“不能多次绑定套接字”

GCDAsyncUdpSocket接收数据时抛出malloc错误