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 }