.TH "InspSocket" 3 "27 Nov 2005" "Version 1.0Betareleases" "InspIRCd" \" -*- nroff -*- .ad l .nh .SH NAME InspSocket \- .SH SYNOPSIS .br .PP \fC#include \fP .PP .SS "Public Member Functions" .in +1c .ti -1c .RI "\fBInspSocket\fP ()" .br .ti -1c .RI "\fBInspSocket\fP (int newfd)" .br .ti -1c .RI "\fBInspSocket\fP (\fBstd::string\fP \fBhost\fP, int \fBport\fP, bool listening, unsigned long maxtime)" .br .ti -1c .RI "virtual bool \fBOnConnected\fP ()" .br .ti -1c .RI "virtual void \fBOnError\fP (\fBInspSocketError\fP e)" .br .ti -1c .RI "virtual int \fBOnDisconnect\fP ()" .br .ti -1c .RI "virtual bool \fBOnDataReady\fP ()" .br .ti -1c .RI "virtual void \fBOnTimeout\fP ()" .br .ti -1c .RI "virtual void \fBOnClose\fP ()" .br .ti -1c .RI "virtual char * \fBRead\fP ()" .br .ti -1c .RI "virtual int \fBWrite\fP (\fBstd::string\fP data)" .br .ti -1c .RI "virtual int \fBOnIncomingConnection\fP (int newfd, char *ip)" .br .ti -1c .RI "void \fBSetState\fP (\fBInspSocketState\fP s)" .br .ti -1c .RI "\fBInspSocketState\fP \fBGetState\fP ()" .br .ti -1c .RI "bool \fBPoll\fP ()" .br .ti -1c .RI "virtual void \fBClose\fP ()" .br .ti -1c .RI "virtual \fB~InspSocket\fP ()" .br .in -1c .SS "Private Attributes" .in +1c .ti -1c .RI "int \fBfd\fP" .br .ti -1c .RI "\fBstd::string\fP \fBhost\fP" .br .ti -1c .RI "int \fBport\fP" .br .ti -1c .RI "\fBInspSocketState\fP \fBstate\fP" .br .ti -1c .RI "sockaddr_in \fBaddr\fP" .br .ti -1c .RI "in_addr \fBaddy\fP" .br .ti -1c .RI "time_t \fBtimeout_end\fP" .br .ti -1c .RI "bool \fBtimeout\fP" .br .ti -1c .RI "pollfd \fBpolls\fP" .br .ti -1c .RI "char \fBibuf\fP [1024]" .br .ti -1c .RI "sockaddr_in \fBclient\fP" .br .ti -1c .RI "sockaddr_in \fBserver\fP" .br .ti -1c .RI "socklen_t \fBlength\fP" .br .in -1c .SH "Detailed Description" .PP Definition at line 30 of file socket.h. .SH "Constructor & Destructor Documentation" .PP .SS "InspSocket::InspSocket ()" .PP Definition at line 46 of file socket.cpp. .PP References I_DISCONNECTED, and state. .PP .nf 47 { 48 this->state = I_DISCONNECTED; 49 } .fi .PP .SS "InspSocket::InspSocket (int newfd)" .PP Definition at line 51 of file socket.cpp. .PP References fd, I_CONNECTED, and state. .PP .nf 52 { 53 this->fd = newfd; 54 this->state = I_CONNECTED; 55 } .fi .PP .SS "InspSocket::InspSocket (\fBstd::string\fP host, int port, bool listening, unsigned long maxtime)" .PP Definition at line 57 of file socket.cpp. .PP References addr, addy, Close(), DEBUG, fd, I_CONNECTING, I_ERR_BIND, I_ERR_CONNECT, I_ERR_SOCKET, I_ERROR, I_LISTENING, OnError(), state, timeout, and timeout_end. .PP .nf 58 { 59 if (listening) { 60 if ((this->fd = OpenTCPSocket()) == ERROR) 61 { 62 this->fd = -1; 63 this->state = I_ERROR; 64 this->OnError(I_ERR_SOCKET); 65 log(DEBUG,'OpenTCPSocket() error'); 66 return; 67 } 68 else 69 { 70 if (BindSocket(this->fd,this->client,this->server,port,(char*)host.c_str()) == ERROR) 71 { 72 this->Close(); 73 this->fd = -1; 74 this->state = I_ERROR; 75 this->OnError(I_ERR_BIND); 76 log(DEBUG,'BindSocket() error %s',strerror(errno)); 77 return; 78 } 79 else 80 { 81 this->state = I_LISTENING; 82 log(DEBUG,'New socket now in I_LISTENING state'); 83 return; 84 } 85 } 86 } else { 87 char* ip; 88 this->host = host; 89 hostent* hoste = gethostbyname(host.c_str()); 90 if (!hoste) { 91 ip = (char*)host.c_str(); 92 } else { 93 struct in_addr* ia = (in_addr*)hoste->h_addr; 94 ip = inet_ntoa(*ia); 95 } 96 97 timeout_end = time(NULL)+maxtime; 98 timeout = false; 99 if ((this->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 100 { 101 this->state = I_ERROR; 102 this->OnError(I_ERR_SOCKET); 103 return; 104 } 105 this->port = port; 106 inet_aton(ip,&addy); 107 addr.sin_family = AF_INET; 108 addr.sin_addr = addy; 109 addr.sin_port = htons(this->port); 110 111 int flags; 112 flags = fcntl(this->fd, F_GETFL, 0); 113 fcntl(this->fd, F_SETFL, flags | O_NONBLOCK); 114 115 if(connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1) 116 { 117 if (errno != EINPROGRESS) 118 { 119 this->Close(); 120 this->OnError(I_ERR_CONNECT); 121 this->state = I_ERROR; 122 return; 123 } 124 } 125 this->state = I_CONNECTING; 126 return; 127 } 128 } .fi .PP .SS "InspSocket::~InspSocket ()\fC [virtual]\fP" .PP Definition at line 246 of file socket.cpp. .PP References Close(). .PP .nf 247 { 248 this->Close(); 249 } .fi .PP .SH "Member Function Documentation" .PP .SS "void InspSocket::Close ()\fC [virtual]\fP" .PP Definition at line 130 of file socket.cpp. .PP References fd, and OnClose(). .PP Referenced by InspSocket(), and ~InspSocket(). .PP .nf 131 { 132 if (this->fd != -1) 133 { 134 this->OnClose(); 135 shutdown(this->fd,2); 136 close(this->fd); 137 this->fd = -1; 138 } 139 } .fi .PP .SS "\fBInspSocketState\fP InspSocket::GetState ()" .PP Definition at line 233 of file socket.cpp. .PP References state. .PP .nf 234 { 235 return this->state; 236 } .fi .PP .SS "void InspSocket::OnClose ()\fC [virtual]\fP" .PP Definition at line 244 of file socket.cpp. .PP Referenced by Close(). .PP .nf 244 { return; } .fi .PP .SS "bool InspSocket::OnConnected ()\fC [virtual]\fP" .PP Definition at line 238 of file socket.cpp. .PP Referenced by Poll(). .PP .nf 238 { return true; } .fi .PP .SS "bool InspSocket::OnDataReady ()\fC [virtual]\fP" .PP Definition at line 242 of file socket.cpp. .PP Referenced by Poll(). .PP .nf 242 { return true; } .fi .PP .SS "int InspSocket::OnDisconnect ()\fC [virtual]\fP" .PP Definition at line 240 of file socket.cpp. .PP .nf 240 { return 0; } .fi .PP .SS "void InspSocket::OnError (\fBInspSocketError\fP e)\fC [virtual]\fP" .PP Definition at line 239 of file socket.cpp. .PP Referenced by InspSocket(), and Poll(). .PP .nf 239 { return; } .fi .PP .SS "int InspSocket::OnIncomingConnection (int newfd, char * ip)\fC [virtual]\fP" .PP Definition at line 241 of file socket.cpp. .PP Referenced by Poll(). .PP .nf 241 { return 0; } .fi .PP .SS "void InspSocket::OnTimeout ()\fC [virtual]\fP" .PP Definition at line 243 of file socket.cpp. .PP Referenced by Poll(). .PP .nf 243 { return; } .fi .PP .SS "bool InspSocket::Poll ()" .PP Definition at line 183 of file socket.cpp. .PP 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. .PP .nf 184 { 185 if ((time(NULL) > timeout_end) && (this->state == I_CONNECTING)) 186 { 187 // for non-listening sockets, the timeout can occur 188 // which causes termination of the connection after 189 // the given number of seconds without a successful 190 // connection. 191 this->OnTimeout(); 192 this->OnError(I_ERR_TIMEOUT); 193 timeout = true; 194 this->state = I_ERROR; 195 return false; 196 } 197 polls.fd = this->fd; 198 state == I_CONNECTING ? polls.events = POLLOUT : polls.events = POLLIN; 199 int ret = poll(&polls,1,1); 200 201 if (ret > 0) 202 { 203 int incoming = -1; 204 205 switch (this->state) 206 { 207 case I_CONNECTING: 208 this->SetState(I_CONNECTED); 209 return this->OnConnected(); 210 break; 211 case I_LISTENING: 212 length = sizeof (client); 213 incoming = accept (this->fd, (sockaddr*)&client,&length); 214 this->OnIncomingConnection(incoming,inet_ntoa(client.sin_addr)); 215 return true; 216 break; 217 case I_CONNECTED: 218 return this->OnDataReady(); 219 break; 220 default: 221 break; 222 } 223 } 224 return true; 225 } .fi .PP .SS "char * InspSocket::Read ()\fC [virtual]\fP" .PP Definition at line 141 of file socket.cpp. .PP References DEBUG, and ibuf. .PP .nf 142 { 143 int n = recv(this->fd,this->ibuf,sizeof(this->ibuf),0); 144 if (n > 0) 145 { 146 ibuf[n] = 0; 147 return ibuf; 148 } 149 else 150 { 151 log(DEBUG,'EOF or error on socket'); 152 return NULL; 153 } 154 } .fi .PP .SS "void InspSocket::SetState (\fBInspSocketState\fP s)" .PP Definition at line 227 of file socket.cpp. .PP References DEBUG, and state. .PP Referenced by Poll(). .PP .nf 228 { 229 log(DEBUG,'Socket state change'); 230 this->state = s; 231 } .fi .PP .SS "int InspSocket::Write (\fBstd::string\fP data)\fC [virtual]\fP" .PP Definition at line 160 of file socket.cpp. .PP .nf 161 { 162 char* d = (char*)data.c_str(); 163 unsigned int written = 0; 164 int n = 0; 165 int s = data.length(); 166 while ((written < data.length()) && (n >= 0)) 167 { 168 n = send(this->fd,d,s,0); 169 if (n > 0) 170 { 171 // If we didnt write everything, advance 172 // the pointers so that when we retry 173 // the next time around the loop, we try 174 // to write what we failed to write before. 175 written += n; 176 s -= n; 177 d += n; 178 } 179 } 180 return written; 181 } .fi .PP .SH "Member Data Documentation" .PP .SS "sockaddr_in \fBInspSocket::addr\fP\fC [private]\fP" .PP Definition at line 37 of file socket.h. .PP Referenced by InspSocket(). .SS "in_addr \fBInspSocket::addy\fP\fC [private]\fP" .PP Definition at line 38 of file socket.h. .PP Referenced by InspSocket(). .SS "sockaddr_in \fBInspSocket::client\fP\fC [private]\fP" .PP Definition at line 43 of file socket.h. .PP Referenced by Poll(). .SS "int \fBInspSocket::fd\fP\fC [private]\fP" .PP Definition at line 33 of file socket.h. .PP Referenced by Close(), InspSocket(), and Poll(). .SS "\fBstd::string\fP \fBInspSocket::host\fP\fC [private]\fP" .PP Definition at line 34 of file socket.h. .SS "char \fBInspSocket::ibuf\fP[1024]\fC [private]\fP" .PP Definition at line 42 of file socket.h. .PP Referenced by Read(). .SS "socklen_t \fBInspSocket::length\fP\fC [private]\fP" .PP Definition at line 45 of file socket.h. .PP Referenced by Poll(). .SS "pollfd \fBInspSocket::polls\fP\fC [private]\fP" .PP Definition at line 41 of file socket.h. .PP Referenced by Poll(). .SS "int \fBInspSocket::port\fP\fC [private]\fP" .PP Definition at line 35 of file socket.h. .SS "sockaddr_in \fBInspSocket::server\fP\fC [private]\fP" .PP Definition at line 44 of file socket.h. .SS "\fBInspSocketState\fP \fBInspSocket::state\fP\fC [private]\fP" .PP Definition at line 36 of file socket.h. .PP Referenced by GetState(), InspSocket(), Poll(), and SetState(). .SS "bool \fBInspSocket::timeout\fP\fC [private]\fP" .PP Definition at line 40 of file socket.h. .PP Referenced by InspSocket(), and Poll(). .SS "time_t \fBInspSocket::timeout_end\fP\fC [private]\fP" .PP Definition at line 39 of file socket.h. .PP Referenced by InspSocket(), and Poll(). .SH "Author" .PP Generated automatically by Doxygen for InspIRCd from the source code.