From 636a13e1864da3d2ea20675e204337b73fab2bf1 Mon Sep 17 00:00:00 2001 From: Mike Goslin Date: Tue, 19 Dec 2000 01:34:45 +0000 Subject: [PATCH] *** empty log message *** --- panda/src/downloader/downloader.I | 2 +- panda/src/downloader/downloader.cxx | 140 ++++++++++++------ panda/src/downloader/downloader.h | 2 + panda/src/downloadertools/test_downloader.cxx | 5 +- 4 files changed, 101 insertions(+), 48 deletions(-) diff --git a/panda/src/downloader/downloader.I b/panda/src/downloader/downloader.I index ffe3044333..da8c278897 100644 --- a/panda/src/downloader/downloader.I +++ b/panda/src/downloader/downloader.I @@ -102,7 +102,7 @@ get_bytes_written(void) const { //////////////////////////////////////////////////////////////////// INLINE float Downloader:: get_bytes_per_second(void) const { - if (_initiated == false) { + if (_ever_initiated == false) { downloader_cat.warning() << "Downloader::get_bytes_per_second() - Download has not been " << "initiated" << endl; diff --git a/panda/src/downloader/downloader.cxx b/panda/src/downloader/downloader.cxx index bc9e556775..ac0d740671 100644 --- a/panda/src/downloader/downloader.cxx +++ b/panda/src/downloader/downloader.cxx @@ -66,6 +66,7 @@ Downloader(void) { _tlast = 0.0; _got_any_data = false; _initiated = false; + _ever_initiated = false; #if defined(WIN32) WSAData mydata; @@ -101,7 +102,7 @@ bool Downloader:: connect_to_server(const string &name, uint port) { if (downloader_cat.is_debug()) downloader_cat.debug() - << "Download connecting to server: " << name << " on port: " + << "Downloader connecting to server: " << name << " on port: " << port << endl; _server_name = name; @@ -118,8 +119,7 @@ connect_to_server(const string &name, uint port) { else { downloader_cat.error() << "Downloader::connect_to_server() - gethostbyname() failed: " - //<< strerror(errno) << endl; - << errno << endl; + << handle_socket_error() << endl; return false; } } else @@ -143,8 +143,7 @@ connect_to_server(void) { if (_socket == (int)0xffffffff) { downloader_cat.error() << "Downloader::connect_to_server() - socket failed: " - //<< strerror(errno) << endl; - << errno << endl; + << handle_socket_error() << endl; return false; } @@ -153,8 +152,7 @@ connect_to_server(void) { if (connect(_socket, (struct sockaddr *)&_sin, sizeof(_sin)) < 0) { downloader_cat.error() << "Downloader::connect_to_server() - connect() failed: " - //<< strerror(errno) << endl; - << errno << endl; + << handle_socket_error() << endl; disconnect_from_server(); _connected = false; } @@ -171,7 +169,7 @@ void Downloader:: disconnect_from_server(void) { if (downloader_cat.is_debug()) downloader_cat.debug() - << "Download disconnecting from server..." << endl; + << "Downloader disconnecting from server..." << endl; #if defined(WIN32) (void)closesocket(_socket); #else @@ -208,8 +206,8 @@ safe_send(int socket, const char *data, int length, long timeout) { return SS_timeout; } else if (sret == -1) { downloader_cat.error() - //<< "Downloader::safe_send() - error: " << strerror(errno) << endl; - << "Downloader::safe_send() - error: " << errno << endl; + << "Downloader::safe_send() - error: " << handle_socket_error() + << endl; return SS_error; } int ret = send(socket, data, length, 0); @@ -217,8 +215,8 @@ safe_send(int socket, const char *data, int length, long timeout) { bytes += ret; else { downloader_cat.error() - //<< "Downloader::safe_send() - error: " << strerror(errno) << endl; - << "Downloader::safe_send() - error: " << errno << endl; + << "Downloader::safe_send() - error: " << handle_socket_error() + << endl; return SS_error; } } @@ -253,38 +251,22 @@ fast_receive(int socket, DownloadStatus *status, int rec_size) { } else if (sret == -1) { downloader_cat.error() << "Downloader::fast_receive() - select() error: " - //<< strerror(errno) << endl; - << errno << endl; + << handle_socket_error() << endl; return FR_error; } int ret = recv(socket, status->_next_in, rec_size, 0); if (ret == 0) { return FR_eof; } else if (ret == -1) { -#if defined(WIN32_VC) - int err = WSAGetLastError(); - if (err == 0) { - if (downloader_cat.is_debug()) - downloader_cat.debug() - << "Downloader::fast_receive() - recv() error = 0" << endl; - return FR_no_data; - } else { - downloader_cat.error() - << "Downloader::fast_receive() - recv() error: " - << err << endl; - return FR_error; - } -#else downloader_cat.error() << "Downloader::fast_receive() - recv() error: " - << errno << endl; + << handle_socket_error() << endl; return FR_error; -#endif } if (downloader_cat.is_debug()) downloader_cat.debug() - << "Downloader::fast_receive() - recv() got: " << ret << " bytes" - << endl; + << "Downloader::fast_receive() - recv() requested: " << rec_size + << " got: " << ret << " bytes" << endl; status->_next_in += ret; status->_bytes_in_buffer += ret; status->_total_bytes += ret; @@ -332,7 +314,7 @@ initiate(const string &file_name, Filename file_dest, result = file_dest.open_write(_dest_stream); if (result == false) { downloader_cat.error() - << "Downloader::download() - Error opening file: " << file_dest + << "Downloader::initiate() - Error opening file: " << file_dest << " for writing" << endl; return DS_error_write; } @@ -346,7 +328,7 @@ initiate(const string &file_name, Filename file_dest, if (partial_content == true) { if (downloader_cat.is_debug()) downloader_cat.debug() - << "Downloader::download() - Requesting byte range: " << first_byte + << "Downloader::initiate() - Requesting byte range: " << first_byte << "-" << last_byte << endl; request += "\012Range: bytes="; stringstream start_stream; @@ -357,7 +339,7 @@ initiate(const string &file_name, Filename file_dest, int outlen = request.size(); if (downloader_cat.is_debug()) downloader_cat.debug() - << "Downloader::download() - Sending request:\n" << request << endl; + << "Downloader::initiate() - Sending request:\n" << request << endl; int send_ret = safe_send(_socket, request.c_str(), outlen, (long)downloader_timeout); @@ -380,6 +362,7 @@ initiate(const string &file_name, Filename file_dest, _tlast = 0.0; _got_any_data = false; _initiated = true; + _ever_initiated = true; return DS_success; } @@ -472,17 +455,33 @@ run(void) { } // Attempt to receive the bytes from the socket - int repeat = 1; - if (_receive_size > MAX_RECEIVE_BYTES) { - repeat += (int)(_receive_size / MAX_RECEIVE_BYTES); - } int fret; - for (int i = 0; i < repeat; i++) { + // Handle the case of a fast connection + if (_receive_size > MAX_RECEIVE_BYTES) { + int repeat = (int)(_receive_size / MAX_RECEIVE_BYTES); + int remain = (int)fmod((double)_receive_size, (double)MAX_RECEIVE_BYTES); + if (downloader_cat.is_debug()) + downloader_cat.debug() + << "Downloader::run() - fast connection - repeat: " << repeat + << " remain: " << remain << endl; + // Make multiple requests at once but do not exceed MAX_RECEIVE_BYTES + // for any single request + for (int i = 0; i <= repeat; i++) { + if (i < repeat) + fret = fast_receive(_socket, _current_status, MAX_RECEIVE_BYTES); + else if (remain > 0) + fret = fast_receive(_socket, _current_status, remain); + if (fret == FR_eof || fret < 0) { + break; + } else if (fret == FR_success) { + _got_any_data = true; + } + } + } else { // Handle the normal speed connection case + if (downloader_cat.is_debug()) + downloader_cat.debug() + << "Downloader::run() - normal connection" << endl; fret = fast_receive(_socket, _current_status, _receive_size); - if (fret == FR_eof || fret < 0) - break; - else if (fret == FR_success) - _got_any_data = true; } _tlast = _clock.get_real_time(); @@ -502,13 +501,13 @@ run(void) { if (downloader_cat.is_debug()) downloader_cat.debug() << "Downloader::run() - Got 0 bytes" << endl; - return DS_ok; + return ret; } } else if (fret == FR_no_data) { if (downloader_cat.is_debug()) downloader_cat.debug() << "Downloader::run() - No data" << endl; - return DS_ok; + return ret; } else if (fret < 0) { return DS_error; } @@ -741,3 +740,52 @@ reset(void) { _next_in = _start; _bytes_in_buffer = 0; } + +//////////////////////////////////////////////////////////////////// +// Function: Downloader::handle_socket_error +// Access: Private +// Description: +//////////////////////////////////////////////////////////////////// +char *Downloader:: +handle_socket_error(void) const { +#ifndef WIN32_VC + return strerror(errno); +#else + switch (WSAGetLastError()) { + case 10022: + return "An invalid argument was supplied"; + case 10036: + return "A blocking operation is currently executing"; + case 10040: + return "Message was larger than internal buffer or network limit"; + case 10050: + return "Network dead"; + case 10051: + return "Network unreachable"; + case 10052: + return "Connection broken because keep-alive detected a failure"; + case 10053: + return "Connection aborted by local host software"; + case 10054: + return "Connection closed by remote host"; + case 10055: + return "Out of buffer space or queue overflowed"; + case 10057: + return "Socket was not connected"; + case 10058: + return "Socket was previously shut down"; + case 10060: + return "Connection timed out"; + case 10061: + return "Connection refused by remote host"; + case 10064: + return "Remote host is down"; + case 10065: + return "Remote host is unreachable"; + case 10093: + return "WSAStartup() was not called"; + default: + return "Unknown WSA error"; + } +#endif +} diff --git a/panda/src/downloader/downloader.h b/panda/src/downloader/downloader.h index 78d4452479..50cdbddb6c 100644 --- a/panda/src/downloader/downloader.h +++ b/panda/src/downloader/downloader.h @@ -93,6 +93,7 @@ private: bool write_to_disk(DownloadStatus *status); void cleanup(void); + char *handle_socket_error(void) const; private: bool _connected; @@ -101,6 +102,7 @@ private: struct sockaddr_in _sin; bool _initiated; + bool _ever_initiated; PT(Buffer) _buffer; int _disk_write_frequency; float _frequency; diff --git a/panda/src/downloadertools/test_downloader.cxx b/panda/src/downloadertools/test_downloader.cxx index d41522d9d3..265ef6b4e3 100644 --- a/panda/src/downloadertools/test_downloader.cxx +++ b/panda/src/downloadertools/test_downloader.cxx @@ -25,11 +25,14 @@ main(int argc, char *argv[]) { for (;;) { ret = dl.run(); if (ret == Downloader::DS_success) { + cerr << "bytes per second: " << dl.get_bytes_per_second() << endl; return 1; } else if (ret == Downloader::DS_write) { cerr << "bytes per second: " << dl.get_bytes_per_second() << endl; - } else if (ret < 0) + } else if (ret < 0) { + cerr << "error!" << endl; return 0; + } } return 0; }