Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

sstream.cc

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include <errno.h>
00005 #include <sys/types.h>
00006 #include <sys/socket.h>
00007 #include <unistd.h>
00008 #include <netdb.h>
00009 #include <netinet/in.h>
00010 #include <arpa/inet.h>
00011 
00012 #include "config.h"
00013 #include "Debug.h"
00014 #include "sstream.h"
00015 
00016 using namespace std;
00017 
00018 void sstream::connectTo(char *name, char *service)
00019 {
00020         connectTo(name, service, "");
00021 }
00022 
00023 void sstream::connectTo(char *name, char *service, char *from)
00024 {
00025         char buf[1024];
00026 
00027         if (is_connected())
00028                 disconnect();
00029         strcpy(_name, name);
00030         strcpy(_service, service);
00031 
00032         try {
00033                 if ((strcmp(from, "") != 0)) {
00034                         VERB(slog.
00035                              p(Logger::
00036                                Debug) <<
00037                              "sstream::connectTo using interface " << from
00038                              << "\n");
00039                         sockinetaddr bindAddr(from);
00040                         (*((iosockinet *) this))->bind(bindAddr);
00041                 }
00042         }
00043         catch(sockerr e) {
00044                 sprintf(buf, "can't bind to %s\n", from);
00045                 slog.
00046                     p(Logger::
00047                       Error) << "sstream::connectTo: can't bind to " <<
00048                     from << " sockerr code: " << e.serrno()
00049                     << " sockerr operation: " << e.operation()
00050                     << " sockerrtext: " << e.errstr() << "\n";
00051                 setstate(ios::badbit);
00052                 return;
00053         }
00054 
00055         try {
00056                 VERB(slog.
00057                      p(Logger::
00058                        Debug) << "sstream::connectTo connecting to " <<
00059                      name << " service " << service << "\n");
00060                 sockinetaddr serverAddr(name, service);
00061                 (*this)->connect(serverAddr);
00062         }
00063         catch(sockerr e) {
00064                 sprintf(buf, "cannot connect to %s (%s)\n", name, service);
00065                 slog.
00066                     p(Logger::
00067                       Error) << "sstream::connectTo can't connect to " <<
00068                     name << " " << service << " sockerr code: " << e.
00069                     serrno() << " sockerr operation: " << e.operation()
00070                     << " sockerrtext: " << e.errstr() << "\n";
00071                 setstate(ios::badbit);
00072                 return;
00073         }
00074 
00075         try {
00076                 (*this)->recvtimeout(-1);
00077                 //(*this)->sendtimeout (-1);
00078                 (*this)->keepalive(1);
00079         }
00080         catch(sockerr e) {
00081                 slog.
00082                     p(Logger::
00083                       Error) <<
00084                     "sstream::connectTo: setting keepalive error " <<
00085                     " sockerr code: " << e.
00086                     serrno() << " sockerr operation: " << e.operation()
00087                     << " sockerrtext: " << e.errstr() << "\n";
00088                 // FIXME: is this a fatal error?
00089         }
00090 
00091         connected = 1;
00092         clear();
00093 }
00094 
00095 void sstream::disconnect()
00096 {
00097         sockbuf *pS;
00098 
00099         VERB(slog.p(Logger::Debug) << "sstream::disconnect()\n");
00100         try {
00101                 pS = rdbuf();
00102                 pS->shutdown(sockbuf::shut_readwrite);
00103         } catch (sockerr e) {
00104                 VERB(slog.p(Logger::Debug) << "sstream::disconnect() sockerror"
00105                         << e.serrno() << " sockerr operation: "
00106                         << e.operation() << " sockerrtext: " << e.errstr()
00107                         << "\n");
00108         }
00109         _name[0] = '\0';
00110         _service[0] = '\0';
00111         connected = 0;
00112         setstate(ios::badbit);
00113 }
00114 
00115 int sstream::is_connected()
00116 {
00117         return connected;
00118 }

Generated on Fri Aug 20 10:58:08 2004 for NewsCache by doxygen 1.3.6-20040222