From bab9f4b4bc0f6aa0e1377745fd216ef9874b3f27 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 9 Dec 2005 20:21:39 +0000 Subject: Added new module docs git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@2301 e03df62e-2008-0410-955e-edbf42e46eb7 --- docs/module-doc/socket_8cpp-source.html | 410 ++++++++++++++++---------------- 1 file changed, 209 insertions(+), 201 deletions(-) (limited to 'docs/module-doc/socket_8cpp-source.html') diff --git a/docs/module-doc/socket_8cpp-source.html b/docs/module-doc/socket_8cpp-source.html index b11873f4e..bdd849a0d 100644 --- a/docs/module-doc/socket_8cpp-source.html +++ b/docs/module-doc/socket_8cpp-source.html @@ -57,211 +57,219 @@ 00048 this->state = I_DISCONNECTED; 00049 } 00050 -00051 InspSocket::InspSocket(int newfd) +00051 InspSocket::InspSocket(int newfd, char* ip) 00052 { 00053 this->fd = newfd; 00054 this->state = I_CONNECTED; -00055 } -00056 -00057 InspSocket::InspSocket(std::string host, int port, bool listening, unsigned long maxtime) -00058 { -00059 if (listening) { -00060 if ((this->fd = OpenTCPSocket()) == ERROR) -00061 { -00062 this->fd = -1; -00063 this->state = I_ERROR; -00064 this->OnError(I_ERR_SOCKET); -00065 log(DEBUG,"OpenTCPSocket() error"); -00066 return; -00067 } -00068 else -00069 { -00070 if (BindSocket(this->fd,this->client,this->server,port,(char*)host.c_str()) == ERROR) -00071 { -00072 this->Close(); -00073 this->fd = -1; -00074 this->state = I_ERROR; -00075 this->OnError(I_ERR_BIND); -00076 log(DEBUG,"BindSocket() error %s",strerror(errno)); -00077 return; -00078 } -00079 else -00080 { -00081 this->state = I_LISTENING; -00082 log(DEBUG,"New socket now in I_LISTENING state"); -00083 return; -00084 } -00085 } -00086 } else { -00087 char* ip; -00088 this->host = host; -00089 hostent* hoste = gethostbyname(host.c_str()); -00090 if (!hoste) { -00091 ip = (char*)host.c_str(); -00092 } else { -00093 struct in_addr* ia = (in_addr*)hoste->h_addr; -00094 ip = inet_ntoa(*ia); -00095 } -00096 -00097 timeout_end = time(NULL)+maxtime; -00098 timeout = false; -00099 if ((this->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) -00100 { -00101 this->state = I_ERROR; -00102 this->OnError(I_ERR_SOCKET); -00103 return; -00104 } -00105 this->port = port; -00106 inet_aton(ip,&addy); -00107 addr.sin_family = AF_INET; -00108 addr.sin_addr = addy; -00109 addr.sin_port = htons(this->port); -00110 -00111 int flags; -00112 flags = fcntl(this->fd, F_GETFL, 0); -00113 fcntl(this->fd, F_SETFL, flags | O_NONBLOCK); -00114 -00115 if(connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1) -00116 { -00117 if (errno != EINPROGRESS) -00118 { -00119 this->Close(); -00120 this->OnError(I_ERR_CONNECT); -00121 this->state = I_ERROR; -00122 return; -00123 } -00124 } -00125 this->state = I_CONNECTING; -00126 return; -00127 } -00128 } -00129 -00130 void InspSocket::Close() -00131 { -00132 if (this->fd != -1) -00133 { -00134 this->OnClose(); -00135 shutdown(this->fd,2); -00136 close(this->fd); -00137 this->fd = -1; -00138 } -00139 } -00140 -00141 char* InspSocket::Read() -00142 { -00143 int n = recv(this->fd,this->ibuf,sizeof(this->ibuf),0); -00144 if (n > 0) -00145 { -00146 ibuf[n] = 0; -00147 return ibuf; -00148 } -00149 else -00150 { -00151 log(DEBUG,"EOF or error on socket"); -00152 return NULL; -00153 } -00154 } -00155 -00156 // There are two possible outcomes to this function. -00157 // It will either write all of the data, or an undefined amount. -00158 // If an undefined amount is written the connection has failed -00159 // and should be aborted. -00160 int InspSocket::Write(std::string data) -00161 { -00162 char* d = (char*)data.c_str(); -00163 unsigned int written = 0; -00164 int n = 0; -00165 int s = data.length(); -00166 while ((written < data.length()) && (n >= 0)) -00167 { -00168 n = send(this->fd,d,s,0); -00169 if (n > 0) -00170 { -00171 // If we didnt write everything, advance -00172 // the pointers so that when we retry -00173 // the next time around the loop, we try -00174 // to write what we failed to write before. -00175 written += n; -00176 s -= n; -00177 d += n; -00178 } -00179 } -00180 return written; -00181 } -00182 -00183 bool InspSocket::Poll() -00184 { -00185 if ((time(NULL) > timeout_end) && (this->state == I_CONNECTING)) -00186 { -00187 // for non-listening sockets, the timeout can occur -00188 // which causes termination of the connection after -00189 // the given number of seconds without a successful -00190 // connection. -00191 this->OnTimeout(); -00192 this->OnError(I_ERR_TIMEOUT); -00193 timeout = true; -00194 this->state = I_ERROR; -00195 return false; -00196 } -00197 polls.fd = this->fd; -00198 state == I_CONNECTING ? polls.events = POLLOUT : polls.events = POLLIN; -00199 int ret = poll(&polls,1,1); -00200 -00201 if (ret > 0) -00202 { -00203 int incoming = -1; -00204 -00205 switch (this->state) -00206 { -00207 case I_CONNECTING: -00208 this->SetState(I_CONNECTED); -00209 return this->OnConnected(); -00210 break; -00211 case I_LISTENING: -00212 length = sizeof (client); -00213 incoming = accept (this->fd, (sockaddr*)&client,&length); -00214 this->OnIncomingConnection(incoming,inet_ntoa(client.sin_addr)); -00215 return true; -00216 break; -00217 case I_CONNECTED: -00218 return this->OnDataReady(); -00219 break; -00220 default: -00221 break; -00222 } -00223 } -00224 return true; -00225 } -00226 -00227 void InspSocket::SetState(InspSocketState s) -00228 { -00229 log(DEBUG,"Socket state change"); -00230 this->state = s; -00231 } -00232 -00233 InspSocketState InspSocket::GetState() -00234 { -00235 return this->state; -00236 } -00237 -00238 bool InspSocket::OnConnected() { return true; } -00239 void InspSocket::OnError(InspSocketError e) { return; } -00240 int InspSocket::OnDisconnect() { return 0; } -00241 int InspSocket::OnIncomingConnection(int newfd, char* ip) { return 0; } -00242 bool InspSocket::OnDataReady() { return true; } -00243 void InspSocket::OnTimeout() { return; } -00244 void InspSocket::OnClose() { return; } +00055 this->IP = ip; +00056 } +00057 +00058 InspSocket::InspSocket(std::string host, int port, bool listening, unsigned long maxtime) +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 } +00132 +00133 void InspSocket::Close() +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 } +00143 +00144 std::string InspSocket::GetIP() +00145 { +00146 return this->IP; +00147 } +00148 +00149 char* InspSocket::Read() +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 } +00163 +00164 // There are two possible outcomes to this function. +00165 // It will either write all of the data, or an undefined amount. +00166 // If an undefined amount is written the connection has failed +00167 // and should be aborted. +00168 int InspSocket::Write(std::string data) +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 } +00190 +00191 bool InspSocket::Poll() +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 } +00234 +00235 void InspSocket::SetState(InspSocketState s) +00236 { +00237 log(DEBUG,"Socket state change"); +00238 this->state = s; +00239 } +00240 +00241 InspSocketState InspSocket::GetState() +00242 { +00243 return this->state; +00244 } 00245 -00246 InspSocket::~InspSocket() -00247 { -00248 this->Close(); -00249 } -00250 -00251 /* -00252 int BindSocket (int sockfd, struct sockaddr_in client, struct sockaddr_in server, int port, char* addr) -00253 int OpenTCPSocket (void) -00254 */ -
1.4.4-20050815