diff options
Diffstat (limited to '')
-rw-r--r-- | src/connection.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/connection.cpp b/src/connection.cpp index c68c519..3b90329 100644 --- a/src/connection.cpp +++ b/src/connection.cpp | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <unistd.h> | 6 | #include <unistd.h> |
7 | #include <sys/types.h> | 7 | #include <sys/types.h> |
8 | #include <sys/socket.h> | 8 | #include <sys/socket.h> |
9 | #include <sys/time.h> | ||
9 | #include <netinet/in.h> | 10 | #include <netinet/in.h> |
10 | #include <netdb.h> | 11 | #include <netdb.h> |
11 | #include <arpa/inet.h> | 12 | #include <arpa/inet.h> |
@@ -238,20 +239,21 @@ int Connection::readInput() | |||
238 | bool Connection::readInput( int nSec, int nUSec, int *pnSecBack, int *pnUSecBack ) | 239 | bool Connection::readInput( int nSec, int nUSec, int *pnSecBack, int *pnUSecBack ) |
239 | { | 240 | { |
240 | fd_set rfds; | 241 | fd_set rfds; |
241 | struct timeval tv; | 242 | struct timeval tv, start, end; |
243 | struct timezone tz; | ||
242 | int retval; | 244 | int retval; |
243 | 245 | ||
246 | gettimeofday( &start, &tz ); | ||
247 | |||
244 | FD_ZERO(&rfds); | 248 | FD_ZERO(&rfds); |
245 | FD_SET(nSocket, &rfds); | 249 | FD_SET(nSocket, &rfds); |
246 | 250 | ||
247 | tv.tv_sec = nSec; | 251 | tv.tv_sec = nSec; |
248 | tv.tv_usec = nUSec; | 252 | tv.tv_usec = nUSec; |
249 | 253 | ||
254 | //printf("Starting at %d %d\n", nSec, nUSec ); | ||
250 | retval = select( nSocket+1, &rfds, NULL, NULL, &tv ); | 255 | retval = select( nSocket+1, &rfds, NULL, NULL, &tv ); |
251 | 256 | ||
252 | if( pnSecBack ) (*pnSecBack) = tv.tv_sec; | ||
253 | if( pnUSecBack ) (*pnUSecBack) = tv.tv_usec; | ||
254 | |||
255 | if( retval == -1 ) | 257 | if( retval == -1 ) |
256 | { | 258 | { |
257 | // Oh my god!!! some kind of horrible problem!!!! | 259 | // Oh my god!!! some kind of horrible problem!!!! |
@@ -260,7 +262,7 @@ bool Connection::readInput( int nSec, int nUSec, int *pnSecBack, int *pnUSecBack | |||
260 | } | 262 | } |
261 | else if( retval ) | 263 | else if( retval ) |
262 | { | 264 | { |
263 | printf("retval=%d, nSocket=%d,%d, sec=%d, usec=%d\n", retval, nSocket, FD_ISSET( nSocket, &rfds ), tv.tv_sec, tv.tv_usec ); | 265 | //printf("retval=%d, nSocket=%d,%d, sec=%d, usec=%d\n", retval, nSocket, FD_ISSET( nSocket, &rfds ), tv.tv_sec, tv.tv_usec ); |
264 | // None of them have data, but the connection is still active. | 266 | // None of them have data, but the connection is still active. |
265 | if( readInput() == 0 ) | 267 | if( readInput() == 0 ) |
266 | { | 268 | { |
@@ -268,10 +270,32 @@ bool Connection::readInput( int nSec, int nUSec, int *pnSecBack, int *pnUSecBack | |||
268 | throw ConnectionException( excodeConnectionClosed, "Connection closed"); | 270 | throw ConnectionException( excodeConnectionClosed, "Connection closed"); |
269 | } | 271 | } |
270 | } | 272 | } |
273 | |||
274 | gettimeofday( &end, &tz ); | ||
275 | |||
276 | int st, ust; | ||
277 | st = nSec - ( end.tv_sec - start.tv_sec ); | ||
278 | if( ( end.tv_usec - start.tv_usec ) > nUSec ) | ||
279 | { | ||
280 | (st)--; | ||
281 | ust = 1000000 - (end.tv_usec - start.tv_usec); | ||
282 | } | ||
271 | else | 283 | else |
272 | { | 284 | { |
273 | return true; | 285 | ust = nUSec - (end.tv_usec - start.tv_usec); |
274 | } | 286 | } |
287 | |||
288 | if( st < 0 ) | ||
289 | { | ||
290 | st = ust = 0; | ||
291 | } | ||
292 | |||
293 | *pnSecBack = st; | ||
294 | *pnUSecBack = ust; | ||
295 | |||
296 | //printf("New time: %d %d\n", *pnSecBack, *pnUSecBack ); | ||
297 | |||
298 | return true; | ||
275 | } | 299 | } |
276 | 300 | ||
277 | void Connection::waitForInput( int nBytesIn, int nSec, int nUSec ) | 301 | void Connection::waitForInput( int nBytesIn, int nSec, int nUSec ) |