|
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.
|