X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fsocket_handler.cpp;h=ed1489581177d6d8b7a8d4df3735280a53892940;hp=11acc81790422af2eb9a0374c0ffb8e9e0114609;hb=6f6d24c02ef3e3a7600432bed1c801a611c3c918;hpb=d535333ffe637c9e547e68b792f334c229641520 diff --git a/src/socket_handler.cpp b/src/socket_handler.cpp index 11acc81..ed14895 100644 --- a/src/socket_handler.cpp +++ b/src/socket_handler.cpp @@ -97,11 +97,11 @@ bool socket_handler::is_closed() } /** @brief check if new data is waiting on the raw socket - @param usec_timeout wait until new data is found, max timeout usecs. + @param[in,out] usec_timeout wait until new data is found, max timeout usecs. -1: wait endless - NULL: no timeout + 0: return instantly */ -bool socket_handler::data_waiting(long long usec_timeout) +bool socket_handler::data_waiting(long long usec_timeout,long long* usec_timeout_remaining) { // just our socket fd_set active_fd_set; @@ -118,12 +118,19 @@ bool socket_handler::data_waiting(long long usec_timeout) { timeout_ptr = &tval; - // timeout von long long usec in int sec + int usec umrechnen + // convert timeout from long long usec to int sec + int usec tval.tv_sec = usec_timeout / 1000000; tval.tv_usec = usec_timeout % 1000000; } - if(select (FD_SETSIZE, &active_fd_set, NULL, NULL, timeout_ptr) > 0) + int ret=select (FD_SETSIZE, &active_fd_set, NULL, NULL, timeout_ptr); + + // return the timeout we did not use + // todo: this is linux specific according to man 2 select + if (usec_timeout > 0 && usec_timeout_remaining != NULL) + *usec_timeout_remaining=(tval.tv_sec*1000000)+tval.tv_usec; + + if (ret > 0) return true; else return false; @@ -131,14 +138,14 @@ bool socket_handler::data_waiting(long long usec_timeout) /** @brief read data from the raw socket and copy it into the provided buffer @param buffer the buffer where to append the new data - @param usec_timeout wait until new data is found, max timeout usecs. + @param[in,out] usec_timeout wait until new data is found, max timeout usecs. -1: wait endless - NULL: no timeout + 0: return instantly */ -bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout) +bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout, long long *timeout_remaining) { // fast path for timeout==0 - if (usec_timeout==0 || data_waiting(usec_timeout)) + if (usec_timeout==0 || data_waiting(usec_timeout,timeout_remaining)) return fill_buffer(buffer); else return false; @@ -184,7 +191,7 @@ bool socket_handler::fill_buffer(std::string& buffer) // Data read -> store it if (nbytes > 0) { - buffer.assign(socket_buffer,nbytes); + buffer.append(socket_buffer,nbytes); LOGSTREAM(debug,nbytes << " bytes read"); }