Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 我应该如何真正使用QLocalSocket和QLocalServer?_Qt_Ipc_Named Pipes - Fatal编程技术网

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

Qt 我应该如何真正使用QLocalSocket和QLocalServer?,qt,ipc,named-pipes,Qt,Ipc,Named Pipes,关于在IPC中使用QLocalSocket/QLocalServer的Qt示例并不像应该的那样清晰 我(在考虑了很多假设后)得出了下一个结论: 用于windows命名管道的套接字设计为一次传递一条消息。它不能连续用于永无止境的数据流,因为管道存储内部发送的所有数据,而不管这些数据是否已读取或未造成巨大的内存浪费。所以基本用例看起来是这样的:接收者连接到管道->发送者发送一帧数据->他们中的某个人关闭套接字hanlde,直到接收者想要更多(并且必须再次建立新的连接) QLocalSocket无法另

关于在IPC中使用QLocalSocket/QLocalServer的Qt示例并不像应该的那样清晰

我(在考虑了很多假设后)得出了下一个结论:

  • 用于windows命名管道的套接字设计为一次传递一条消息。它不能连续用于永无止境的数据流,因为管道存储内部发送的所有数据,而不管这些数据是否已读取或未造成巨大的内存浪费。所以基本用例看起来是这样的:接收者连接到管道->发送者发送一帧数据->他们中的某个人关闭套接字hanlde,直到接收者想要更多(并且必须再次建立新的连接)

  • QLocalSocket无法另存为实例。这令人困惑。第一次连接完成得很好。我在其中创建了一个带有QLocalSocket的receiver类。我将此套接字连接到命名管道并读取数据。我关闭套接字(在发送方一侧),然后将其再次连接到管道以读取下一个数据帧。服务器看到了新的连接,但一旦我尝试写入,就会出现“套接字正在关闭”错误。看起来仍有一些数据(可能是从以前的连接保存到windows套接字的
    HANDLE
    )。 在Process Explorer中,我发现套接字只在类内的函数中连接(插槽中只有“connectToServer”函数),但一旦控制返回到Qt事件循环,到命名管道的连接就会在服务器有可能写入之前消失。再次:如果套接字曾经关闭过,这种情况只会发生第二次。如果我删除套接字并(在堆上)创建一个新的套接字,它就会正常工作

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

  • 所以。毕竟我说过。看来我做错了什么。那么,当客户端必须在数据存在时立即接收数据时,QLocalSocket应该如何真正用于永无止境的数据流呢

    UPD:请查找代码示例。还要注意
    socket\u按\u实例
    分支来理解我的第二个注释

    关于代码的一些注意事项:假设我有一些数据流每10毫秒传入一次,我必须在发送方进行处理(在任何情况下),并将其发送给接收方(如果存在)


    这段代码中我不喜欢的是,在接收器端,我需要对每个套接字连接执行
    new
    /
    deleteLater
    (每秒100次)。知道接收器总是有一个连接,并且它总是打开并且总是连接到同一个插座-我认为在这里做
    new
    /
    delete
    是浪费时间。请查看
    socket\u by\u instance
    分支以了解我试图避免此问题的方法。

    如果您显示代码而不是描述代码,将更容易帮助您。我关闭套接字并再次连接…-为什么要这样做,为什么要在堆栈上使用套接字(异步机制)?@G.M.请参阅我的UPD to问题。我添加了一些代码example@TheDarkKnight对不起,我弄错了术语。我的意思是套接字“通过实例保存”,而不是“保存在堆栈上”。我已经更新了我的问题以使其更清晰。如果您显示代码而不是描述代码,则会更容易帮助您。我关闭套接字并再次连接它…-为什么要这样做,为什么要在堆栈上使用套接字(异步机制)?@G.M.请参阅我的UPD to问题。我添加了一些代码example@TheDarkKnight对不起,我弄错了术语。我的意思是套接字“通过实例保存”,而不是“保存在堆栈上”。我更新了我的问题,让它更清楚。