summaryrefslogtreecommitdiff
path: root/src/socket.cpp
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-10-24 00:57:18 +0000
committerMike Buland <eichlan@xagasoft.com>2007-10-24 00:57:18 +0000
commitd1770f567321f8b01185cdf974718aea89669a37 (patch)
treea76ddcb795b99ecd880824c06f505101bf4388a1 /src/socket.cpp
parentae5ea621f06a645dbfcf454e9b8f39a99dc8e822 (diff)
downloadlibbu++-d1770f567321f8b01185cdf974718aea89669a37.tar.gz
libbu++-d1770f567321f8b01185cdf974718aea89669a37.tar.bz2
libbu++-d1770f567321f8b01185cdf974718aea89669a37.tar.xz
libbu++-d1770f567321f8b01185cdf974718aea89669a37.zip
Corrected a few issues that cropped up when using the Bu::Socket without a
Client for buffering. The Bu::Client has also been made a little more reliable. The logger should get a few more tweaks, but it works fine for now, the hex dump could stand another tweak or two.
Diffstat (limited to 'src/socket.cpp')
-rw-r--r--src/socket.cpp66
1 files changed, 53 insertions, 13 deletions
diff --git a/src/socket.cpp b/src/socket.cpp
index 1874fd2..73d52e4 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -179,22 +179,32 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes )
179size_t Bu::Socket::read( void *pBuf, size_t nBytes, 179size_t Bu::Socket::read( void *pBuf, size_t nBytes,
180 uint32_t nSec, uint32_t nUSec ) 180 uint32_t nSec, uint32_t nUSec )
181{ 181{
182 struct timeval tv, nt, ct;
183 size_t nRead = 0;
184
182 fd_set rfds; 185 fd_set rfds;
183 FD_ZERO(&rfds); 186 FD_ZERO(&rfds);
184 FD_SET(nSocket, &rfds); 187 FD_SET(nSocket, &rfds);
185 struct timeval tv = { nSec, nUSec }; 188
186 int retval = select( nSocket+1, &rfds, NULL, NULL, &tv ); 189 gettimeofday( &nt, NULL );
187 if( retval == -1 ) 190 nt.tv_sec += nSec;
188 throw ConnectionException( 191 nt.tv_usec += nUSec;
189 excodeBadReadError, 192
190 "Bad Read error" 193 for(;;)
191 ); 194 {
192 if( !FD_ISSET( nSocket, &rfds ) ) 195 tv.tv_sec = nSec;
193 throw ConnectionException( 196 tv.tv_usec = nUSec;
194 excodeSocketTimeout, 197 select( nSocket+1, &rfds, NULL, NULL, &tv );
195 "Socket timout on read" 198 nRead += read( ((char *)pBuf)+nRead, nBytes-nRead );
196 ); 199 if( nRead >= nBytes )
197 return read( pBuf, nBytes ); 200 break;
201 gettimeofday( &ct, NULL );
202 if( (ct.tv_sec > nt.tv_sec) ||
203 (ct.tv_sec == nt.tv_sec &&
204 ct.tv_usec >= nt.tv_usec) )
205 break;
206 }
207 return nRead;
198} 208}
199 209
200size_t Bu::Socket::write( const void *pBuf, size_t nBytes ) 210size_t Bu::Socket::write( const void *pBuf, size_t nBytes )
@@ -208,6 +218,36 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes )
208 return nWrote; 218 return nWrote;
209} 219}
210 220
221size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32_t nUSec )
222{
223 struct timeval tv, nt, ct;
224 size_t nWrote = 0;
225
226 fd_set wfds;
227 FD_ZERO(&wfds);
228 FD_SET(nSocket, &wfds);
229
230 gettimeofday( &nt, NULL );
231 nt.tv_sec += nSec;
232 nt.tv_usec += nUSec;
233
234 for(;;)
235 {
236 tv.tv_sec = nSec;
237 tv.tv_usec = nUSec;
238 select( nSocket+1, NULL, &wfds, NULL, &tv );
239 nWrote += write( ((char *)pBuf)+nWrote, nBytes-nWrote );
240 if( nWrote >= nBytes )
241 break;
242 gettimeofday( &ct, NULL );
243 if( (ct.tv_sec > nt.tv_sec) ||
244 (ct.tv_sec == nt.tv_sec &&
245 ct.tv_usec >= nt.tv_usec) )
246 break;
247 }
248 return nWrote;
249}
250
211long Bu::Socket::tell() 251long Bu::Socket::tell()
212{ 252{
213 throw UnsupportedException(); 253 throw UnsupportedException();