*** empty log message ***

This commit is contained in:
Mike Goslin 2000-12-19 01:34:45 +00:00
parent 147a42a6e3
commit 636a13e186
4 changed files with 101 additions and 48 deletions

View File

@ -102,7 +102,7 @@ get_bytes_written(void) const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE float Downloader:: INLINE float Downloader::
get_bytes_per_second(void) const { get_bytes_per_second(void) const {
if (_initiated == false) { if (_ever_initiated == false) {
downloader_cat.warning() downloader_cat.warning()
<< "Downloader::get_bytes_per_second() - Download has not been " << "Downloader::get_bytes_per_second() - Download has not been "
<< "initiated" << endl; << "initiated" << endl;

View File

@ -66,6 +66,7 @@ Downloader(void) {
_tlast = 0.0; _tlast = 0.0;
_got_any_data = false; _got_any_data = false;
_initiated = false; _initiated = false;
_ever_initiated = false;
#if defined(WIN32) #if defined(WIN32)
WSAData mydata; WSAData mydata;
@ -101,7 +102,7 @@ bool Downloader::
connect_to_server(const string &name, uint port) { connect_to_server(const string &name, uint port) {
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Download connecting to server: " << name << " on port: " << "Downloader connecting to server: " << name << " on port: "
<< port << endl; << port << endl;
_server_name = name; _server_name = name;
@ -118,8 +119,7 @@ connect_to_server(const string &name, uint port) {
else { else {
downloader_cat.error() downloader_cat.error()
<< "Downloader::connect_to_server() - gethostbyname() failed: " << "Downloader::connect_to_server() - gethostbyname() failed: "
//<< strerror(errno) << endl; << handle_socket_error() << endl;
<< errno << endl;
return false; return false;
} }
} else } else
@ -143,8 +143,7 @@ connect_to_server(void) {
if (_socket == (int)0xffffffff) { if (_socket == (int)0xffffffff) {
downloader_cat.error() downloader_cat.error()
<< "Downloader::connect_to_server() - socket failed: " << "Downloader::connect_to_server() - socket failed: "
//<< strerror(errno) << endl; << handle_socket_error() << endl;
<< errno << endl;
return false; return false;
} }
@ -153,8 +152,7 @@ connect_to_server(void) {
if (connect(_socket, (struct sockaddr *)&_sin, sizeof(_sin)) < 0) { if (connect(_socket, (struct sockaddr *)&_sin, sizeof(_sin)) < 0) {
downloader_cat.error() downloader_cat.error()
<< "Downloader::connect_to_server() - connect() failed: " << "Downloader::connect_to_server() - connect() failed: "
//<< strerror(errno) << endl; << handle_socket_error() << endl;
<< errno << endl;
disconnect_from_server(); disconnect_from_server();
_connected = false; _connected = false;
} }
@ -171,7 +169,7 @@ void Downloader::
disconnect_from_server(void) { disconnect_from_server(void) {
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Download disconnecting from server..." << endl; << "Downloader disconnecting from server..." << endl;
#if defined(WIN32) #if defined(WIN32)
(void)closesocket(_socket); (void)closesocket(_socket);
#else #else
@ -208,8 +206,8 @@ safe_send(int socket, const char *data, int length, long timeout) {
return SS_timeout; return SS_timeout;
} else if (sret == -1) { } else if (sret == -1) {
downloader_cat.error() downloader_cat.error()
//<< "Downloader::safe_send() - error: " << strerror(errno) << endl; << "Downloader::safe_send() - error: " << handle_socket_error()
<< "Downloader::safe_send() - error: " << errno << endl; << endl;
return SS_error; return SS_error;
} }
int ret = send(socket, data, length, 0); int ret = send(socket, data, length, 0);
@ -217,8 +215,8 @@ safe_send(int socket, const char *data, int length, long timeout) {
bytes += ret; bytes += ret;
else { else {
downloader_cat.error() downloader_cat.error()
//<< "Downloader::safe_send() - error: " << strerror(errno) << endl; << "Downloader::safe_send() - error: " << handle_socket_error()
<< "Downloader::safe_send() - error: " << errno << endl; << endl;
return SS_error; return SS_error;
} }
} }
@ -253,38 +251,22 @@ fast_receive(int socket, DownloadStatus *status, int rec_size) {
} else if (sret == -1) { } else if (sret == -1) {
downloader_cat.error() downloader_cat.error()
<< "Downloader::fast_receive() - select() error: " << "Downloader::fast_receive() - select() error: "
//<< strerror(errno) << endl; << handle_socket_error() << endl;
<< errno << endl;
return FR_error; return FR_error;
} }
int ret = recv(socket, status->_next_in, rec_size, 0); int ret = recv(socket, status->_next_in, rec_size, 0);
if (ret == 0) { if (ret == 0) {
return FR_eof; return FR_eof;
} else if (ret == -1) { } 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_cat.error()
<< "Downloader::fast_receive() - recv() error: " << "Downloader::fast_receive() - recv() error: "
<< err << endl; << handle_socket_error() << endl;
return FR_error; return FR_error;
} }
#else
downloader_cat.error()
<< "Downloader::fast_receive() - recv() error: "
<< errno << endl;
return FR_error;
#endif
}
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Downloader::fast_receive() - recv() got: " << ret << " bytes" << "Downloader::fast_receive() - recv() requested: " << rec_size
<< endl; << " got: " << ret << " bytes" << endl;
status->_next_in += ret; status->_next_in += ret;
status->_bytes_in_buffer += ret; status->_bytes_in_buffer += ret;
status->_total_bytes += ret; status->_total_bytes += ret;
@ -332,7 +314,7 @@ initiate(const string &file_name, Filename file_dest,
result = file_dest.open_write(_dest_stream); result = file_dest.open_write(_dest_stream);
if (result == false) { if (result == false) {
downloader_cat.error() downloader_cat.error()
<< "Downloader::download() - Error opening file: " << file_dest << "Downloader::initiate() - Error opening file: " << file_dest
<< " for writing" << endl; << " for writing" << endl;
return DS_error_write; return DS_error_write;
} }
@ -346,7 +328,7 @@ initiate(const string &file_name, Filename file_dest,
if (partial_content == true) { if (partial_content == true) {
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Downloader::download() - Requesting byte range: " << first_byte << "Downloader::initiate() - Requesting byte range: " << first_byte
<< "-" << last_byte << endl; << "-" << last_byte << endl;
request += "\012Range: bytes="; request += "\012Range: bytes=";
stringstream start_stream; stringstream start_stream;
@ -357,7 +339,7 @@ initiate(const string &file_name, Filename file_dest,
int outlen = request.size(); int outlen = request.size();
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.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, int send_ret = safe_send(_socket, request.c_str(), outlen,
(long)downloader_timeout); (long)downloader_timeout);
@ -380,6 +362,7 @@ initiate(const string &file_name, Filename file_dest,
_tlast = 0.0; _tlast = 0.0;
_got_any_data = false; _got_any_data = false;
_initiated = true; _initiated = true;
_ever_initiated = true;
return DS_success; return DS_success;
} }
@ -472,18 +455,34 @@ run(void) {
} }
// Attempt to receive the bytes from the socket // 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; int fret;
for (int i = 0; i < repeat; i++) { // Handle the case of a fast connection
fret = fast_receive(_socket, _current_status, _receive_size); if (_receive_size > MAX_RECEIVE_BYTES) {
if (fret == FR_eof || fret < 0) 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; break;
else if (fret == FR_success) } else if (fret == FR_success) {
_got_any_data = true; _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);
}
_tlast = _clock.get_real_time(); _tlast = _clock.get_real_time();
// Check for end of file // Check for end of file
@ -502,13 +501,13 @@ run(void) {
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Downloader::run() - Got 0 bytes" << endl; << "Downloader::run() - Got 0 bytes" << endl;
return DS_ok; return ret;
} }
} else if (fret == FR_no_data) { } else if (fret == FR_no_data) {
if (downloader_cat.is_debug()) if (downloader_cat.is_debug())
downloader_cat.debug() downloader_cat.debug()
<< "Downloader::run() - No data" << endl; << "Downloader::run() - No data" << endl;
return DS_ok; return ret;
} else if (fret < 0) { } else if (fret < 0) {
return DS_error; return DS_error;
} }
@ -741,3 +740,52 @@ reset(void) {
_next_in = _start; _next_in = _start;
_bytes_in_buffer = 0; _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
}

View File

@ -93,6 +93,7 @@ private:
bool write_to_disk(DownloadStatus *status); bool write_to_disk(DownloadStatus *status);
void cleanup(void); void cleanup(void);
char *handle_socket_error(void) const;
private: private:
bool _connected; bool _connected;
@ -101,6 +102,7 @@ private:
struct sockaddr_in _sin; struct sockaddr_in _sin;
bool _initiated; bool _initiated;
bool _ever_initiated;
PT(Buffer) _buffer; PT(Buffer) _buffer;
int _disk_write_frequency; int _disk_write_frequency;
float _frequency; float _frequency;

View File

@ -25,11 +25,14 @@ main(int argc, char *argv[]) {
for (;;) { for (;;) {
ret = dl.run(); ret = dl.run();
if (ret == Downloader::DS_success) { if (ret == Downloader::DS_success) {
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl;
return 1; return 1;
} else if (ret == Downloader::DS_write) { } else if (ret == Downloader::DS_write) {
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl; 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;
} }
}
return 0; return 0;
} }