#include <socket.h>
Collaboration diagram for InspSocket:
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 |
Definition at line 30 of file socket.h.
|
Definition at line 46 of file socket.cpp. References I_DISCONNECTED, and state. 00047 { 00048 this->state = I_DISCONNECTED; 00049 }
|
|
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 }
|
|
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 }
|
|
Definition at line 254 of file socket.cpp. References Close(). 00255 { 00256 this->Close(); 00257 }
|
|
Definition at line 133 of file socket.cpp. 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 }
|
|
Definition at line 144 of file socket.cpp. References IP. 00145 { 00146 return this->IP; 00147 }
|
|
Definition at line 241 of file socket.cpp. References state. 00242 { 00243 return this->state; 00244 }
|
|
Definition at line 252 of file socket.cpp. Referenced by Close().
|
|
Definition at line 246 of file socket.cpp. Referenced by Poll().
|
|
Definition at line 250 of file socket.cpp. Referenced by Poll().
|
|
Definition at line 248 of file socket.cpp.
|
|
Definition at line 247 of file socket.cpp. Referenced by InspSocket(), and Poll().
|
|
Definition at line 249 of file socket.cpp. Referenced by Poll().
|
|
Definition at line 251 of file socket.cpp. Referenced by 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 }
|
|
Definition at line 149 of file socket.cpp. 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 }
|
|
Definition at line 235 of file socket.cpp. Referenced by Poll().
|
|
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 }
|
|
Definition at line 37 of file socket.h. Referenced by InspSocket(). |
|
Definition at line 38 of file socket.h. Referenced by InspSocket(). |
|
Definition at line 44 of file socket.h. Referenced by Poll(). |
|
Definition at line 33 of file socket.h. Referenced by Close(), InspSocket(), and Poll(). |
|
|
|
Definition at line 42 of file socket.h. Referenced by Read(). |
|
Definition at line 43 of file socket.h. Referenced by GetIP(), and InspSocket(). |
|
Definition at line 46 of file socket.h. Referenced by Poll(). |
|
Definition at line 41 of file socket.h. Referenced by Poll(). |
|
|
|
|
|
Definition at line 36 of file socket.h. Referenced by GetState(), InspSocket(), Poll(), and SetState(). |
|
Definition at line 40 of file socket.h. Referenced by InspSocket(), and Poll(). |
|
Definition at line 39 of file socket.h. Referenced by InspSocket(), and Poll(). |