Android MulticastSocket 隐式关闭 问题我尝试了什么什么有效

问题描述

Android 上的 MulticastSocket 似乎有一个小问题:编写与 SSDP 相关的应用程序。当我第一次设置所有东西时,套接字工作得很好,但是当我停止发现并尝试重新启动时,我只会得到一个 SocketException: Socket Closed。我没有关闭套接字,我只是停止负责在循环中调用 socket.receive() 的 Kotlin 协程。示例:

fun listenForPackets(): Flow<DatagramPacket> {
    return flow {
        multicastSocket.use {
            val incomingBuffer = ByteArray(MULTICAST_DATAGRAM_SIZE)
            while (true) {
                val incomingPacket = DatagramPacket(incomingBuffer,incomingBuffer.size)
                it.receive(incomingPacket)
                emit(incomingPacket)
                incomingPacket.length = incomingBuffer.size
            }
        }
    }
}

问题

所以问题是当我再次尝试调用该函数时,我得到一个 SocketException: Socket Closed。套接字初始化代码运行一次,这意味着打开/关闭发现将多次使用同一个套接字;以下代码在整个应用程序中运行一次:

multicastSocket = MulticastSocket(MULTICAST_PORT)
multicastSocket.reuseAddress = true
multicastSocket.joinGroup(multicastGroup)
multicastLock.acquire()

我尝试了什么

我的第一个想法是我没有正确取消 Kotlin 协程。结果,我转而使用典型的 Java 线程,但无济于事。第一次启动线程有效,但是,重新启动发现会产生同样的问题。我也试过不离开组,并保持多播锁获得 - 同样的问题。

什么有效

每次我需要开始扫描时都运行初始化代码(我在其中分配套接字、加入组和获取锁)。在扫描结束时,我重置了所有变量(离开组、释放锁、关闭套接字)。所以我的问题变成了 - 这是正确的方法吗?还是我只是做错了什么?

再次重申,我发现数据包很好,问题在于重新启动发现。在此先感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...