X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fsocket_handler.cpp;h=98944b0fd1e9d41ed7ab97b421bfd02698dbde6f;hp=582cb0ceae14ea2d54296c642be0e72ea01bb993;hb=58b327c6c65474fdfde7d0d99d66d3986400f208;hpb=a7170401dd90dc79cc7d7a808cfe18a06c7e983b diff --git a/src/socket_handler.cpp b/src/socket_handler.cpp index 582cb0c..98944b0 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,18 @@ 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 + 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 +137,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,8 +190,8 @@ bool socket_handler::fill_buffer(std::string& buffer) // Data read -> store it if (nbytes > 0) { - buffer.assign(socket_buffer,nbytes); - LOGSTREAM(debug,nbytes << " read"); + buffer.append(socket_buffer,nbytes); + LOGSTREAM(debug,nbytes << " bytes read"); } // more data waiting -> recurse