Mercurial > cabal
comparison sources/network.cpp @ 2:19227b0b7cc1
.h => .hpp for the headers
added year 2008 to copyright notes
renamed some functions for better meaning
prepared parser module for rewriting
added showHelp() function
some code clean up
| author | Vlad Glagolev <enqlave@gmail.com> |
|---|---|
| date | Mon, 21 Jan 2008 01:14:10 +0300 |
| parents | bafff9de2a76 |
| children | a7051ac7118b |
comparison
equal
deleted
inserted
replaced
| 1:08d8cdf4fe7f | 2:19227b0b7cc1 |
|---|---|
| 1 /** | 1 /** |
| 2 * network.cpp (2007-04-02) | 2 * network.cpp (2007-04-02) |
| 3 * | 3 * |
| 4 * -- CABAL -- network essentials (sockets, etc.) | 4 * -- CABAL -- network essentials (sockets, etc.) |
| 5 * | 5 * |
| 6 * Copyright (c) 2007 Vlad Glagolev <enqlave@gmail.com> | 6 * Copyright (c) 2007-2008 Vlad Glagolev <enqlave@gmail.com> |
| 7 * All rights reserved. | 7 * All rights reserved. |
| 8 * | 8 * |
| 9 * Permission to use, copy, modify, and distribute this software for any | 9 * Permission to use, copy, modify, and distribute this software for any |
| 10 * purpose with or without fee is hereby granted, provided that the above | 10 * purpose with or without fee is hereby granted, provided that the above |
| 11 * copyright notice and this permission notice appear in all copies. | 11 * copyright notice and this permission notice appear in all copies. |
| 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 20 */ | 20 */ |
| 21 | 21 |
| 22 #include "cabal.h" // required: network.h | 22 #include "cabal.hpp" // required: network.hpp |
| 23 | 23 |
| 24 Network::Network() | 24 Network::Network() |
| 25 { | 25 { |
| 26 cout << "NETWORK: going online...\n"; | 26 cout << "NETWORK: going online...\n"; |
| 27 } | 27 } |
| 31 socketClose(); | 31 socketClose(); |
| 32 | 32 |
| 33 cout << "NETWORK: offline\n"; | 33 cout << "NETWORK: offline\n"; |
| 34 } | 34 } |
| 35 | 35 |
| 36 void Network::msgSend (string data) | 36 void Network::sendMsg(string m) |
| 37 { | 37 { |
| 38 if (cs == -1) | 38 if (cs == -1) |
| 39 return; | 39 return; |
| 40 | 40 |
| 41 if (CABAL->debug) | 41 if (CABAL->debug) |
| 42 cout << "<- " << cs << " -- " << data << endl; | 42 cout << "<- " << cs << " -- " << m << endl; |
| 43 | 43 |
| 44 send (cs, (data + "\n").c_str(), (data + "\n").size(), 0); | 44 send(cs, (m + "\n").c_str(), (m + "\n").size(), 0); |
| 45 } | 45 } |
| 46 | 46 |
| 47 string Network::msgReceive() | 47 string Network::receiveMsg() |
| 48 { | 48 { |
| 49 if (cs == -1) | 49 if (cs == -1) |
| 50 return 0; | 50 return 0; |
| 51 | 51 |
| 52 if (canRead(cs) == 1) { | 52 if (canRead(cs)) { |
| 53 string sbuffer = ""; | 53 string sbuffer = ""; |
| 54 char cbuffer; | 54 char cbuffer; |
| 55 | 55 |
| 56 int err = recv (cs, &cbuffer, 1, 0); | 56 int err = recv(cs, &cbuffer, 1, 0); |
| 57 | 57 |
| 58 if (err > 0) { | 58 if (err > 0) { |
| 59 sbuffer += cbuffer; | 59 sbuffer += cbuffer; |
| 60 | 60 |
| 61 while (1) { | 61 while (1) { |
| 62 if (sbuffer[sbuffer.size() - 1] == '\n') { | 62 if (sbuffer[sbuffer.size() - 1] == '\n') { |
| 63 sbuffer = (sbuffer.substr (0, 1) == ":") | 63 sbuffer = (sbuffer.substr(0, 1) == ":") |
| 64 ? sbuffer.substr (1, sbuffer.size() - 3) | 64 ? sbuffer.substr(1, sbuffer.size() - 3) |
| 65 : sbuffer.substr (0, sbuffer.size() - 2); | 65 : sbuffer.substr(0, sbuffer.size() - 2); |
| 66 | 66 |
| 67 if (CABAL->debug) | 67 if (CABAL->debug) |
| 68 cout << "-> " << cs << " -- " << sbuffer << endl; | 68 cout << "-> " << cs << " -- " << sbuffer << endl; |
| 69 | 69 |
| 70 return sbuffer; | 70 return sbuffer; |
| 71 } | 71 } |
| 72 | 72 |
| 73 err = recv (cs, &cbuffer, 1, 0); | 73 err = recv(cs, &cbuffer, 1, 0); |
| 74 | 74 |
| 75 if (err == 0) | 75 if (!err) |
| 76 shut ("remote server closed connection"); | 76 shut ("remote server closed connection"); |
| 77 else if (err < 0) | 77 else if (err < 0) |
| 78 shut ("failed to receive data"); | 78 shut ("failed to receive data"); |
| 79 else | 79 else |
| 80 sbuffer += cbuffer; | 80 sbuffer += cbuffer; |
| 81 } | 81 } |
| 82 } else if (err == 0) | 82 } else if (!err) |
| 83 shut ("remote server closed connection"); | 83 shut ("remote server closed connection"); |
| 84 | 84 |
| 85 return sbuffer; | 85 return sbuffer; |
| 86 } | 86 } |
| 87 | 87 |
| 105 if (getaddrinfo(name, "domain", &hints, &res) < 0) | 105 if (getaddrinfo(name, "domain", &hints, &res) < 0) |
| 106 return 0; | 106 return 0; |
| 107 | 107 |
| 108 reso = res; | 108 reso = res; |
| 109 | 109 |
| 110 while (res != 0) { | 110 while (res) { |
| 111 if (!inet || res->ai_family == inet) { | 111 if (!inet || res->ai_family == inet) { |
| 112 switch (res->ai_family) { | 112 switch (res->ai_family) { |
| 113 case AF_INET6: | 113 case AF_INET6: |
| 114 a->inet = AF_INET6; | 114 a->inet = AF_INET6; |
| 115 in6 = (struct sockaddr_in6 *)res->ai_addr; | 115 in6 = (struct sockaddr_in6 *)res->ai_addr; |
| 133 break; | 133 break; |
| 134 | 134 |
| 135 res = res->ai_next; | 135 res = res->ai_next; |
| 136 } | 136 } |
| 137 | 137 |
| 138 freeaddrinfo (reso); | 138 freeaddrinfo(reso); |
| 139 | 139 |
| 140 return e; | 140 return e; |
| 141 | 141 |
| 142 #else | 142 #else |
| 143 | 143 |
| 144 if (inet != 0 && inet != AF_INET) | 144 if (inet && inet != AF_INET) |
| 145 return 0; | 145 return 0; |
| 146 | 146 |
| 147 a->inet = AF_INET; | 147 a->inet = AF_INET; |
| 148 | 148 |
| 149 struct hostent *he; | 149 struct hostent *he; |
| 150 | 150 |
| 151 if ((he = gethostbyname (name)) == 0) { | 151 if (!(he = gethostbyname(name))) { |
| 152 a->sa.sin_addr.s_addr = inet_addr (name); | 152 a->sa.sin_addr.s_addr = inet_addr(name); |
| 153 | 153 |
| 154 if (a->sa.sin_addr.s_addr == 1) | 154 if (a->sa.sin_addr.s_addr) |
| 155 return 0; | 155 return 0; |
| 156 } else | 156 } else |
| 157 memcpy (&a->sa.sin_addr.s_addr, he->h_addr_list[0], he->h_length); | 157 memcpy(&a->sa.sin_addr.s_addr, he->h_addr_list[0], he->h_length); |
| 158 | 158 |
| 159 return 1; | 159 return 1; |
| 160 | 160 |
| 161 #endif // ENABLE_IPV6 | 161 #endif // ENABLE_IPV6 |
| 162 } | 162 } |
| 163 | 163 |
| 164 bool Network::tcpActivate (int port, pchar host) | 164 bool Network::tcpActivate (int port, pchar host) |
| 165 { | 165 { |
| 166 cs = socket (address.inet, SOCK_STREAM, IPPROTO_TCP); | 166 cs = socket(address.inet, SOCK_STREAM, IPPROTO_TCP); |
| 167 | 167 |
| 168 if (cs == -1) | 168 if (cs == -1) |
| 169 return 0; | 169 return 0; |
| 170 | 170 |
| 171 if (host != 0) { | 171 if (host) { |
| 172 struct address_type a; | 172 struct address_type a; |
| 173 | 173 |
| 174 if (!hostResolve (host, &a, address.inet)) { | 174 if (!hostResolve(host, &a, address.inet)) { |
| 175 close (cs); | 175 close(cs); |
| 176 return 0; | 176 return 0; |
| 177 } | 177 } |
| 178 | 178 |
| 179 int e; | 179 int e; |
| 180 | 180 |
| 181 #ifdef ENABLE_IPV6 | 181 #ifdef ENABLE_IPV6 |
| 182 if (a.inet == AF_INET6) | 182 if (a.inet == AF_INET6) |
| 183 e = bind (cs, (struct sockaddr *)&a.sa6, sizeof (a.sa6)); | 183 e = bind(cs, (struct sockaddr *)&a.sa6, sizeof (a.sa6)); |
| 184 else | 184 else |
| 185 #endif // ENABLE_IPV6 | 185 #endif // ENABLE_IPV6 |
| 186 e = bind (cs, (struct sockaddr *)&a.sa, sizeof (a.sa)); | 186 e = bind(cs, (struct sockaddr *)&a.sa, sizeof (a.sa)); |
| 187 | 187 |
| 188 if (e == -1) { | 188 if (e == -1) { |
| 189 close (cs); | 189 close(cs); |
| 190 return 0; | 190 return 0; |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 | 193 |
| 194 #ifdef ENABLE_IPV6 | 194 #ifdef ENABLE_IPV6 |
| 195 if (address.inet == AF_INET6) { | 195 if (address.inet == AF_INET6) { |
| 196 address.sa6.sin6_family = AF_INET6; | 196 address.sa6.sin6_family = AF_INET6; |
| 197 address.sa6.sin6_port = htons (port); | 197 address.sa6.sin6_port = htons(port); |
| 198 } | 198 } |
| 199 else { | 199 else { |
| 200 #endif // ENABLE_IPV6 | 200 #endif // ENABLE_IPV6 |
| 201 address.sa.sin_family = AF_INET; | 201 address.sa.sin_family = AF_INET; |
| 202 address.sa.sin_port = htons (port); | 202 address.sa.sin_port = htons(port); |
| 203 #ifdef ENABLE_IPV6 | 203 #ifdef ENABLE_IPV6 |
| 204 } | 204 } |
| 205 #endif // ENABLE_IPV6 | 205 #endif // ENABLE_IPV6 |
| 206 | 206 |
| 207 socklen_t parm; | 207 socklen_t parm; |
| 208 | 208 |
| 209 setsockopt (cs, IPPROTO_TCP, TCP_NODELAY, (pchar)&parm, sizeof (parm)); | 209 setsockopt(cs, IPPROTO_TCP, TCP_NODELAY, (pchar)&parm, sizeof(parm)); |
| 210 | 210 |
| 211 connected = 0; | 211 connected = 0; |
| 212 connecting = 1; | 212 connecting = 1; |
| 213 | 213 |
| 214 cout << "NETWORK: socket opened........... " << cs << endl; | 214 cout << "NETWORK: socket opened........... " << cs << endl; |
| 217 } | 217 } |
| 218 | 218 |
| 219 bool Network::hostOpen() | 219 bool Network::hostOpen() |
| 220 { | 220 { |
| 221 int e; | 221 int e; |
| 222 | |
| 223 #ifdef ENABLE_IPV6 | 222 #ifdef ENABLE_IPV6 |
| 224 if (address.inet == AF_INET6) | 223 if (address.inet == AF_INET6) |
| 225 e = connect (cs, (struct sockaddr *)&address.sa6, sizeof (address.sa6)); | 224 e = connect(cs, (struct sockaddr *)&address.sa6, sizeof(address.sa6)); |
| 226 else | 225 else |
| 227 #endif // ENABLE_IPV6 | 226 #endif // ENABLE_IPV6 |
| 228 e = connect (cs, (struct sockaddr *)&address.sa, sizeof (address.sa)); | 227 e = connect(cs, (struct sockaddr *)&address.sa, sizeof(address.sa)); |
| 229 | 228 |
| 230 if (e == -1) { | 229 if (e == -1) { |
| 231 if (errno == EISCONN) { | 230 if (errno == EISCONN) { |
| 232 connected = 1; | 231 connected = 1; |
| 233 connecting = 0; | 232 connecting = 0; |
| 264 cs = -1; | 263 cs = -1; |
| 265 | 264 |
| 266 return 1; | 265 return 1; |
| 267 } | 266 } |
| 268 | 267 |
| 269 int Network::canRead (int socket) | 268 int Network::canRead(int socket) |
| 270 { | 269 { |
| 271 FD_ZERO (&rs); | 270 FD_ZERO(&rs); |
| 272 FD_SET (socket, &rs); | 271 FD_SET(socket, &rs); |
| 273 | 272 |
| 274 timeout.tv_sec = 0; | 273 timeout.tv_sec = 0; |
| 275 timeout.tv_usec = 1; | 274 timeout.tv_usec = 1; |
| 276 | 275 |
| 277 int e = select (socket + 1, &rs, 0, 0, &timeout); | 276 int e = select(socket + 1, &rs, 0, 0, &timeout); |
| 278 | 277 |
| 279 FD_ZERO (&rs); | 278 FD_ZERO(&rs); |
| 280 | 279 |
| 281 return e; | 280 return e; |
| 282 } | 281 } |
| 283 | 282 |
| 284 int Network::canWrite (int socket) | 283 int Network::canWrite(int socket) |
| 285 { | 284 { |
| 286 FD_ZERO (&ws); | 285 FD_ZERO(&ws); |
| 287 FD_SET (socket, &ws); | 286 FD_SET(socket, &ws); |
| 288 | 287 |
| 289 timeout.tv_sec = 0; | 288 timeout.tv_sec = 0; |
| 290 timeout.tv_usec = 1; | 289 timeout.tv_usec = 1; |
| 291 | 290 |
| 292 int e = select (socket + 1, 0, &ws, 0, &timeout); | 291 int e = select(socket + 1, 0, &ws, 0, &timeout); |
| 293 | 292 |
| 294 FD_ZERO (&ws); | 293 FD_ZERO(&ws); |
| 295 | 294 |
| 296 return e; | 295 return e; |
| 297 } | 296 } |
