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
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
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 }