我应该如何真正使用QLocalSocket和QLocalServer?

时间:2017-05-09 16:52:51

标签: qt ipc named-pipes

关于在IPC上使用QLocalSocket / QLocalServer的Qt示例并不是那么清楚。

我已经到了(经过很多假设的想法之后)到下一个结论:

  1. 用于Windows命名管道的套接字旨在一次传递一条消息。它不能连续用于永无止境的数据流,因为管道存储内部发送的所有数据,无论是否它被读取或没有造成巨大的内存浪费。所以基本的用例看起来像:接收器连接到管道 - >发件人发送一帧数据 - >他们中的某人关闭插座hanlde直到接收者想要更多(并且必须再次建立新连接)

  2. QLocalSocket无法保存为实例。这令人困惑。第一次连接完美。我用QLocalSocket创建了一个接收器类。我将此套接字连接到命名管道并读取数据。我关闭套接字(在发送方)并再次连接到管道以读取下一个数据帧。服务器看到了新连接,但是一旦我尝试写入 - " Socket正在关闭"出现错误。看起来一些数据仍然存在(可能是HANDLE从前一个连接保存到Windows套接字)。 使用Process Explorer,我发现socket只在我的函数内部连接(只有`connectToServer'函数的插槽),但是一旦控制返回到Qt事件循环 - 在命令管道连接到服务器之前消失写入它的可能性。再次:如果套接字曾被关闭,这只会发生第二次。如果我删除套接字并创建一个新的(在堆上) - 它就像它应该的那样。

  3. 如果QLocalSocket有效且一方意外关闭,则检测存在一些问题。 当我在建立连接后强制关闭接收器可执行文件时会发生这种情况服务器已经存储了指向套接字的指针,但它不再有效。看起来像isValid()或来自QLocalSocket的其他方法可以帮助我,但它们也失败了。实际上当客户端被强制关闭时,发送方的QLocalSocket实例仍然存在,但是搞乱了私有实现:在qiodevice.cpp : 1607中执行CHECK_WRITABLE(write, qint64(-1)); d_ptr不再是有效指针而且有类似的东西0xafafafaf。看起来私有实现是在Qt事件循环之外控制的,导致这种情况发生。

  4. 因此。毕竟说了。看起来我做错了什么。那么,当客户端必须尽快接收数据时,QLocalSocket如何真正用于永无止境的数据流?

    UPD:请找代码示例here。另请注意socket_by_instance分支以了解我的第二个音符。

    关于代码的一些注意事项:假设我有一些数据流每10毫秒传入一次,我必须在发送方(无论如何)处理并将其发送给接收方(如果它)(他们存在。

    在此代码中我不喜欢的是,在接收方,我需要为每个套接字连接(每秒100次)执行new / deleteLater。知道接收器总是有一个连接,它总是打开并始终连接到同一个插座 - 我认为这里浪费时间new / delete。请查看socket_by_instance分支,看看我尝试避免此问题。

0 个答案:

没有答案