From: <sgv...@us...> - 2009-06-15 14:22:15
|
Revision: 67 http://simspark.svn.sourceforge.net/simspark/?rev=67&view=rev Author: sgvandijk Date: 2009-06-15 13:33:46 +0000 (Mon, 15 Jun 2009) Log Message: ----------- - Make reading client messages a bit more fail-safe by making sure the full message is read Modified Paths: -------------- trunk/spark/ChangeLog trunk/spark/lib/oxygen/simulationserver/netcontrol.cpp Modified: trunk/spark/ChangeLog =================================================================== --- trunk/spark/ChangeLog 2009-05-27 15:31:10 UTC (rev 66) +++ trunk/spark/ChangeLog 2009-06-15 13:33:46 UTC (rev 67) @@ -1,3 +1,8 @@ +2009-06-15 Sander van Dijk <sgv...@gm...> + + * lib/oxygen/simulationserver/netcontrol.cpp + - Make reading client messages a bit more fail-safe by making sure the full message is read + 2009-04-15 Hedayat Vatankhah <he...@gr...> * plugin/CMakeLists.txt: @@ -242,4 +247,4 @@ * configure.ac: - fixed an issue with out of source builds, now it is possible to build - simspark in a separate directory. \ No newline at end of file + simspark in a separate directory. Modified: trunk/spark/lib/oxygen/simulationserver/netcontrol.cpp =================================================================== --- trunk/spark/lib/oxygen/simulationserver/netcontrol.cpp 2009-05-27 15:31:10 UTC (rev 66) +++ trunk/spark/lib/oxygen/simulationserver/netcontrol.cpp 2009-06-15 13:33:46 UTC (rev 67) @@ -627,14 +627,30 @@ // read a fragment shared_ptr<Client>& client = (*iter).second; - int rval = client->socket->recv(mBuffer.get(),mBufferSize); + + const unsigned int preSz = sizeof(unsigned int); + int nRead = 0; + int retval = 1; + while (nRead < preSz && retval > 0) + { + retval = client->socket->recv(mBuffer.get() + nRead, preSz - nRead); + nRead += retval; + } + + unsigned int len = ntohl(reinterpret_cast<unsigned int*>(mBuffer.get())[0]); - if (rval > 0) + while (nRead < preSz + len && retval > 0) + { + retval = client->socket->recv(mBuffer.get() + nRead, preSz + len - nRead); + nRead += retval; + } + + if (retval > 0) { - StoreFragment(client->addr,rval); + StoreFragment(client->addr,nRead); } else { - if (rval <= 0) + if (retval <= 0) { GetLog()->Error() << "(NetControl) ERROR: '" << GetName() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |