【问题标题】:ReadyRead Signal on QUdpSocket only emitted if bind method called first仅当首先调用绑定方法时才会发出 QUdpSocket 上的 ReadyRead 信号
【发布时间】:2020-04-20 10:09:34
【问题描述】:

使用 PyQt4 和 Qt4.1,Python 3.7.2,最新的 PyInstaller

我有两个应用程序(c++ 和 python),它们通过 udp localhost、端口 2340 和端口 2341 进行通信) 在这两个应用程序上,我都用

绑定端口
self.SocketIn.bind(QtNetwork.QHostAddress.LocalHost, 2340, QtNetwork.QUdpSocket.ReuseAddressHint)
self.SocketIn.readyRead.connect(lambda: print("Hallo")

和(在 c++ 方面)

SocketOut->bind(QHostAddress::LocalHost, 2340, QUdpSocket::ReuseAddressHint);

两个应用程序都返回 true,并且状态也是“4”,这意味着它们处于 BoundState。

现在的问题: 如果我首先启动它正在运行的 python 应用程序。 c++应用在2341端口接收消息,在2340端口发送消息。python应用在2340端口接收消息,在2341端口发送消息。 如果我先启动 c++ 应用程序,python 应用程序将不再触发端口 2340 上的 readyRead 信号。就像我说的所有boundStates都在那里(python应用程序,c++应用程序,->端口2340、2341)并且消息实际上是从c++应用程序发送的(在wireshark中看到)

这里的线索是什么?

编辑: 现在我意识到反过来也是同样的行为。 看来必须先初始化接收方才能工作!

【问题讨论】:

  • 不确定我是否理解这里的问题。显示的代码同时具有绑定到端口 2340 的 python c++ 示例。
  • 对了,两者都必须绑定2340,否则python应用无法理解c++端的消息
  • 来到这里希望能找到 MWE。请关闭它,因为对其他人无用

标签: qt pyqt qudpsocket


【解决方案1】:

我遇到了类似的问题。 QUdpSocket 文档说明

如果你只是想发送数据报,你不需要调用 bind()。

当我从发送端移除绑定时,我可以按任意顺序启动和停止发送者和接收者,并且它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多