我正在尝试在 Beaglebone Black 上运行MOOS-IvP
在尝试运行 MOOS 数据库时,它会不断抛出异常
“侦听循环中抛出异常:侦听套接字时出错。不支持操作”
该软件在树莓派上运行
任何想法可能是什么问题?
我正在尝试在 Beaglebone Black 上运行MOOS-IvP
在尝试运行 MOOS 数据库时,它会不断抛出异常
“侦听循环中抛出异常:侦听套接字时出错。不支持操作”
该软件在树莓派上运行
任何想法可能是什么问题?
我发现了问题并修复了它。
创建套接字时,它需要是 TCP。但是,当在 XPCGetProtocol 类中调用 getprotobyname(_sName) 以在 /etc/protocols 中查找正确的协议号时,它会返回上一次调用的值,即设置 UDP 套接字时的值。
为了解决这个问题,我简单地调用了该函数两次,第二次返回正确的值。
我不知道为什么它第一次返回不正确,但这有效!
在使用运行 Ubuntu 14.04 的 BeagleBone Black 时,我也遇到了这个错误。但是,两次运行请求的解决方案不起作用。更多故障排除使我确定应该是 TCP 套接字的那个是在另一个进程打开 UDP 套接字之后打开的。返回的结构getprotobyname()
是指向静态位置的指针,该位置不会因调用而改变,但会随着协议详细信息而更新(尽管对于另一个 Unix 操作系统,请参见此处)。因此,另一个进程的第二次调用会覆盖原来的细节。
然后在 的构造函数中创建套接字期间对其进行测试XPCSocket
,并导致创建一个应该是 TCP 套接字的 UDP 套接字。这可能可以通过向该函数添加锁来解决,但我采用非阻塞方法来初始化请求的协议,使用构造函数调用的字符串 ( _sProtocol
) 而不是socketProtocol
结构中返回的字符串。此外,我修改了XPCGetProtocol
类以将协议号存储在成员变量中,该成员变量在后续调用getprotobyname()
.
我的修改可以在这里找到。