<div dir="ltr"><div>I posted a bug report for it in Qt's system: <a href="https://bugreports.qt.io/browse/QTBUG-61097">https://bugreports.qt.io/browse/QTBUG-61097</a><br></div><div><br></div><div>I guess we can see more information when they respond (and whether or not it is some fault on my end)...<br><br></div><div>You can try downloading the .zip file in that bug report and compile the test I made if you'd like. You just need to have two terminals open: one running the server, and then another to run the client. If you try it, let me know if you get the same issue (two packets being received instead of one).<br><br></div><div>I also wrote a tutorial for using the avogadro2 rpc features in a program (I have a C++ example and a Python example) in the <a href="http://avogadro-rpc-tutorial.md">avogadro-rpc-tutorial.md</a> file here: <a href="https://github.com/psavery/avogadro2-rpc-test">https://github.com/psavery/avogadro2-rpc-test</a><br><br></div><div>The examples are in that repository also.<br><br>Let me know if you think that is good for other people to use. I only showed an example of receiving messages back in C++, but it should be pretty similar in Python...<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 29, 2017 at 12:08 PM, Marcus D. Hanwell <span dir="ltr"><<a href="mailto:marcus.hanwell@kitware.com" target="_blank">marcus.hanwell@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sat, May 27, 2017 at 8:24 PM, Patrick Avery <<a href="mailto:psavery@buffalo.edu">psavery@buffalo.edu</a>> wrote:<br>
> I spent a good amount of time working through the Windows problem today, and<br>
> I think it might actually be a bug with Qt on Windows. I've also figured out<br>
> a work-around.<br>
><br>
> Here is the problem. It has to do with operator<<(QDataStream &out, const<br>
> QByteArray &ba).<br>
><br>
> <a href="https://code.woboq.org/qt5/qtbase/src/corelib/tools/qbytearray.cpp.html#_ZlsR11QDataStreamRK10QByteArray" rel="noreferrer" target="_blank">https://code.woboq.org/qt5/<wbr>qtbase/src/corelib/tools/<wbr>qbytearray.cpp.html#_<wbr>ZlsR11QDataStreamRK10QByteArra<wbr>y</a><br>
><br>
> <a href="https://github.com/OpenChemistry/molequeue/blob/master/molequeue/servercore/localsocketconnection.cpp#L153" rel="noreferrer" target="_blank">https://github.com/<wbr>OpenChemistry/molequeue/blob/<wbr>master/molequeue/servercore/<wbr>localsocketconnection.cpp#L153</a><br>
><br>
> It is supposed to work with QLocalSocket by creating a packet where the<br>
> first few bytes are a quint32 (which represents the size) and the rest of<br>
> the bytes are the actual data, and then send this packet. On Linux and Mac<br>
> this seems to work just fine. But on Windows, it creates two packets: the<br>
> first packet is the quint32 size and the second packet is the data. I don't<br>
> think it is supposed to create two packets, because the reading operator on<br>
> the other end of the communication (operator>>(QDataStream &in, QByteArray<br>
> &ba)) assumes it is one packet and fails to read it correctly.<br>
<br>
</span>That is weird, we tested this out on Windows, but that was years ago,<br>
and I haven't done much testing recently. This would likely break<br>
MoleQueue there too.<br>
<span class="">><br>
> My current work-around is to avoid using operator<<(QDataStream &out, const<br>
> QByteArray &ba) to send that data via two packets by creating the single<br>
> packet myself and sending it manually. It is done like so:<br>
><br>
>   // the Json file we are wanting to send is the QByteArray, jsonData<br>
><br>
>   QByteArray byteArray;<br>
>   QDataStream tmpStream(&byteArray, QIODevice::WriteOnly);<br>
>   tmpStream << jsonData;<br>
>   socketDataStream.writeRawData(<wbr>byteArray, byteArray.size());<br>
><br>
> This still uses operator<<(QDataStream &out, const QByteArray &ba), but it<br>
> only uses it to write to byteArray (instead of writing it directly to the<br>
> socket). We then write to the socket manually by using writeRawData().<br>
><br>
> This worked perfectly for me, and the messages are received just as they<br>
> should be. I'll document this in my how-to markdown file I write.<br>
><br>
> The return messages in the RPC server have the same problem. Perhaps I<br>
> should implement my work-around in them so that Windows clients can receive<br>
> correct messages back (instead of the two-packet problem).<br>
<br>
</span>Sound like a plan, is there an open bug report for Qt anywhere? This<br>
seems like something that would hit more people, and it would be great<br>
to resolve it upstream. The workaround mentioned seems reasonable, I<br>
would like to test it, and it sounds like this same approach should<br>
work on macOS and Linux too.<br>
</blockquote></div><br></div>