Qt 我应该如何真正使用QLocalSocket和QLocalServer?
关于在IPC中使用QLocalSocket/QLocalServer的Qt示例并不像应该的那样清晰 我(在考虑了很多假设后)得出了下一个结论:Qt 我应该如何真正使用QLocalSocket和QLocalServer?,qt,ipc,named-pipes,Qt,Ipc,Named Pipes,关于在IPC中使用QLocalSocket/QLocalServer的Qt示例并不像应该的那样清晰 我(在考虑了很多假设后)得出了下一个结论: 用于windows命名管道的套接字设计为一次传递一条消息。它不能连续用于永无止境的数据流,因为管道存储内部发送的所有数据,而不管这些数据是否已读取或未造成巨大的内存浪费。所以基本用例看起来是这样的:接收者连接到管道->发送者发送一帧数据->他们中的某个人关闭套接字hanlde,直到接收者想要更多(并且必须再次建立新的连接) QLocalSocket无法另
HANDLE
)。
在Process Explorer中,我发现套接字只在类内的函数中连接(插槽中只有“connectToServer”函数),但一旦控制返回到Qt事件循环,到命名管道的连接就会在服务器有可能写入之前消失。再次:如果套接字曾经关闭过,这种情况只会发生第二次。如果我删除套接字并(在堆上)创建一个新的套接字,它就会正常工作isValid()
或QLocalSocket中的其他方法可以帮助我,但它们也失败了。在实践中,当客户端被强制关闭时,发送方端的QLocalSocket实例仍然存在,但已经打乱了私有实现:在qiodevice.cpp:1607
whereCHECK_WRITABLE(write,qint64(-1))代码>已执行d_ptr
不再是有效指针,并具有类似0xAFAF的内容。看起来私有实现是在Qt事件循环之外控制的,导致了这种情况的发生
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对不起,我弄错了术语。我的意思是套接字“通过实例保存”,而不是“保存在堆栈上”。我更新了我的问题,让它更清楚。