Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

InspSocket Class Reference

#include <socket.h>

Collaboration diagram for InspSocket:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 InspSocket ()
 InspSocket (int newfd, char *ip)
 InspSocket (std::string host, int port, bool listening, unsigned long maxtime)
virtual bool OnConnected ()
virtual void OnError (InspSocketError e)
virtual int OnDisconnect ()
virtual bool OnDataReady ()
virtual void OnTimeout ()
virtual void OnClose ()
virtual char * Read ()
std::string GetIP ()
virtual int Write (std::string data)
virtual int OnIncomingConnection (int newfd, char *ip)
void SetState (InspSocketState s)
InspSocketState GetState ()
bool Poll ()
virtual void Close ()
virtual ~InspSocket ()

Private Attributes

int fd
std::string host
int port
InspSocketState state
sockaddr_in addr
in_addr addy
time_t timeout_end
bool timeout
pollfd polls
char ibuf [16384]
std::string IP
sockaddr_in client
sockaddr_in server
socklen_t length

Detailed Description

Definition at line 30 of file socket.h.


Constructor & Destructor Documentation

InspSocket::InspSocket  ) 
 

Definition at line 46 of file socket.cpp.

References I_DISCONNECTED, and state.

00047 {
00048         this->state = I_DISCONNECTED;
00049 }

InspSocket::InspSocket int  newfd,
char *  ip
 

Definition at line 51 of file socket.cpp.

References fd, I_CONNECTED, IP, and state.

00052 {
00053         this->fd = newfd;
00054         this->state = I_CONNECTED;
00055         this->IP = ip;
00056 }

InspSocket::InspSocket std::string  host,
int  port,
bool  listening,
unsigned long  maxtime
 

Definition at line 58 of file socket.cpp.

References addr, addy, Close(), DEBUG, fd, I_CONNECTING, I_ERR_BIND, I_ERR_CONNECT, I_ERR_SOCKET, I_ERROR, I_LISTENING, IP, OnError(), state, timeout, and timeout_end.

00059 {
00060         if (listening) {
00061                 if ((this->fd = OpenTCPSocket()) == ERROR)
00062                 {
00063                         this->fd = -1;
00064                         this->state = I_ERROR;
00065                         this->OnError(I_ERR_SOCKET);
00066                         log(DEBUG,"OpenTCPSocket() error");
00067                         return;
00068                 }
00069                 else
00070                 {
00071                         if (BindSocket(this->fd,this->client,this->server,port,(char*)host.c_str()) == ERROR)
00072                         {
00073                                 this->Close();
00074                                 this->fd = -1;
00075                                 this->state = I_ERROR;
00076                                 this->OnError(I_ERR_BIND);
00077                                 log(DEBUG,"BindSocket() error %s",strerror(errno));
00078                                 return;
00079                         }
00080                         else
00081                         {
00082                                 this->state = I_LISTENING;
00083                                 log(DEBUG,"New socket now in I_LISTENING state");
00084                                 return;
00085                         }
00086                 }                       
00087         } else {
00088                 char* ip;
00089                 this->host = host;
00090                 hostent* hoste = gethostbyname(host.c_str());
00091                 if (!hoste) {
00092                         ip = (char*)host.c_str();
00093                 } else {
00094                         struct in_addr* ia = (in_addr*)hoste->h_addr;
00095                         ip = inet_ntoa(*ia);
00096                 }
00097 
00098                 this->IP = ip;
00099 
00100                 timeout_end = time(NULL)+maxtime;
00101                 timeout = false;
00102                 if ((this->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
00103                 {
00104                         this->state = I_ERROR;
00105                         this->OnError(I_ERR_SOCKET);
00106                         return;
00107                 }
00108                 this->port = port;
00109                 inet_aton(ip,&addy);
00110                 addr.sin_family = AF_INET;
00111                 addr.sin_addr = addy;
00112                 addr.sin_port = htons(this->port);
00113 
00114                 int flags;
00115                 flags = fcntl(this->fd, F_GETFL, 0);
00116                 fcntl(this->fd, F_SETFL, flags | O_NONBLOCK);
00117 
00118                 if(connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1)
00119                 {
00120                         if (errno != EINPROGRESS)
00121                         {
00122                                 this->Close();
00123                                 this->OnError(I_ERR_CONNECT);
00124                                 this->state = I_ERROR;
00125                                 return;
00126                         }
00127                 }
00128                 this->state = I_CONNECTING;
00129                 return;
00130         }
00131 }

InspSocket::~InspSocket  )  [virtual]
 

Definition at line 254 of file socket.cpp.

References Close().

00255 {
00256         this->Close();
00257 }


Member Function Documentation

void InspSocket::Close  )  [virtual]
 

Definition at line 133 of file socket.cpp.

References fd, and OnClose().

Referenced by InspSocket(), and ~InspSocket().

00134 {
00135         if (this->fd != -1)
00136         {
00137                 this->OnClose();
00138                 shutdown(this->fd,2);
00139                 close(this->fd);
00140                 this->fd = -1;
00141         }
00142 }

std::string InspSocket::GetIP  ) 
 

Definition at line 144 of file socket.cpp.

References IP.

00145 {
00146         return this->IP;
00147 }

InspSocketState InspSocket::GetState  ) 
 

Definition at line 241 of file socket.cpp.

References state.

00242 {
00243         return this->state;
00244 }

void InspSocket::OnClose  )  [virtual]
 

Definition at line 252 of file socket.cpp.

Referenced by Close().

00252 { return; }

bool InspSocket::OnConnected  )  [virtual]
 

Definition at line 246 of file socket.cpp.

Referenced by Poll().

00246 { return true; }

bool InspSocket::OnDataReady  )  [virtual]
 

Definition at line 250 of file socket.cpp.

Referenced by Poll().

00250 { return true; }

int InspSocket::OnDisconnect  )  [virtual]
 

Definition at line 248 of file socket.cpp.

00248 { return 0; }

void InspSocket::OnError InspSocketError  e  )  [virtual]
 

Definition at line 247 of file socket.cpp.

Referenced by InspSocket(), and Poll().

00247 { return; }

int InspSocket::OnIncomingConnection int  newfd,
char *  ip
[virtual]
 

Definition at line 249 of file socket.cpp.

Referenced by Poll().

00249 { return 0; }

void InspSocket::OnTimeout  )  [virtual]
 

Definition at line 251 of file socket.cpp.

Referenced by Poll().

00251 { return; }

bool InspSocket::Poll  ) 
 

Definition at line 191 of file socket.cpp.

References client, fd, I_CONNECTED, I_CONNECTING, I_ERR_TIMEOUT, I_ERROR, I_LISTENING, length, OnConnected(), OnDataReady(), OnError(), OnIncomingConnection(), OnTimeout(), polls, SetState(), state, timeout, and timeout_end.

00192 {
00193         if ((time(NULL) > timeout_end) && (this->state == I_CONNECTING))
00194         {
00195                 // for non-listening sockets, the timeout can occur
00196                 // which causes termination of the connection after
00197                 // the given number of seconds without a successful
00198                 // connection.
00199                 this->OnTimeout();
00200                 this->OnError(I_ERR_TIMEOUT);
00201                 timeout = true;
00202                 this->state = I_ERROR;
00203                 return false;
00204         }
00205         polls.fd = this->fd;
00206         state == I_CONNECTING ? polls.events = POLLOUT : polls.events = POLLIN;
00207         int ret = poll(&polls,1,1);
00208 
00209         if (ret > 0)
00210         {
00211                 int incoming = -1;
00212                 
00213                 switch (this->state)
00214                 {
00215                         case I_CONNECTING:
00216                                 this->SetState(I_CONNECTED);
00217                                 return this->OnConnected();
00218                         break;
00219                         case I_LISTENING:
00220                                 length = sizeof (client);
00221                                 incoming = accept (this->fd, (sockaddr*)&client,&length);
00222                                 this->OnIncomingConnection(incoming,inet_ntoa(client.sin_addr));
00223                                 return true;
00224                         break;
00225                         case I_CONNECTED:
00226                                 return this->OnDataReady();
00227                         break;
00228                         default:
00229                         break;
00230                 }
00231         }
00232         return true;
00233 }

char * InspSocket::Read  )  [virtual]
 

Definition at line 149 of file socket.cpp.

References DEBUG, and ibuf.

00150 {
00151         int n = recv(this->fd,this->ibuf,sizeof(this->ibuf),0);
00152         if (n > 0)
00153         {
00154                 ibuf[n] = 0;
00155                 return ibuf;
00156         }
00157         else
00158         {
00159                 log(DEBUG,"EOF or error on socket");
00160                 return NULL;
00161         }
00162 }

void InspSocket::SetState InspSocketState  s  ) 
 

Definition at line 235 of file socket.cpp.

References DEBUG, and state.

Referenced by Poll().

00236 {
00237         log(DEBUG,"Socket state change");
00238         this->state = s;
00239 }

int InspSocket::Write std::string  data  )  [virtual]
 

Definition at line 168 of file socket.cpp.

00169 {
00170         char* d = (char*)data.c_str();
00171         unsigned int written = 0;
00172         int n = 0;
00173         int s = data.length();
00174         while ((written < data.length()) && (n >= 0))
00175         {
00176                 n = send(this->fd,d,s,0);
00177                 if (n > 0)
00178                 {
00179                         // If we didnt write everything, advance
00180                         // the pointers so that when we retry
00181                         // the next time around the loop, we try
00182                         // to write what we failed to write before.
00183                         written += n;
00184                         s -= n;
00185                         d += n;
00186                 }
00187         }
00188         return written;
00189 }


Member Data Documentation

sockaddr_in InspSocket::addr [private]
 

Definition at line 37 of file socket.h.

Referenced by InspSocket().

in_addr InspSocket::addy [private]
 

Definition at line 38 of file socket.h.

Referenced by InspSocket().

sockaddr_in InspSocket::client [private]
 

Definition at line 44 of file socket.h.

Referenced by Poll().

int InspSocket::fd [private]
 

Definition at line 33 of file socket.h.

Referenced by Close(), InspSocket(), and Poll().

std::string InspSocket::host [private]
 

Definition at line 34 of file socket.h.

char InspSocket::ibuf[16384] [private]
 

Definition at line 42 of file socket.h.

Referenced by Read().

std::string InspSocket::IP [private]
 

Definition at line 43 of file socket.h.

Referenced by GetIP(), and InspSocket().

socklen_t InspSocket::length [private]
 

Definition at line 46 of file socket.h.

Referenced by Poll().

pollfd InspSocket::polls [private]
 

Definition at line 41 of file socket.h.

Referenced by Poll().

int InspSocket::port [private]
 

Definition at line 35 of file socket.h.

sockaddr_in InspSocket::server [private]
 

Definition at line 45 of file socket.h.

InspSocketState InspSocket::state [private]
 

Definition at line 36 of file socket.h.

Referenced by GetState(), InspSocket(), Poll(), and SetState().

bool InspSocket::timeout [private]
 

Definition at line 40 of file socket.h.

Referenced by InspSocket(), and Poll().

time_t InspSocket::timeout_end [private]
 

Definition at line 39 of file socket.h.

Referenced by InspSocket(), and Poll().


The documentation for this class was generated from the following files:
Generated on Fri Dec 9 20:20:12 2005 for InspIRCd by  doxygen 1.4.4-20050815