Mercurial > cabal
annotate sources/network.cpp @ 7:8d54d9fdeca3
fixed comments
removed daemonization verbose
strings' size() -> length()
| author | Vlad Glagolev <enqlave@gmail.com> |
|---|---|
| date | Sun, 03 Feb 2008 21:29:41 +0300 |
| parents | 9be05a31b7f9 |
| children |
| rev | line source |
|---|---|
| 7 | 1 /** network.cpp (2007-04-02) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
2 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
3 * -- CABAL -- network essentials (sockets, etc.) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
4 * |
| 2 | 5 * Copyright (c) 2007-2008 Vlad Glagolev <enqlave@gmail.com> |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
6 * All rights reserved. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
7 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
8 * Permission to use, copy, modify, and distribute this software for any |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
9 * purpose with or without fee is hereby granted, provided that the above |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
10 * copyright notice and this permission notice appear in all copies. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
11 * |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
19 */ |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
20 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
21 #include "cabal.hpp" // required: network.hpp |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
22 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
23 Network::Network() |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
24 { |
| 7 | 25 if (CABAL->debug) |
| 26 cout << "NETWORK: going on-line...\n"; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
27 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
28 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
29 Network::~Network() |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
30 { |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
31 closeSocket(); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
32 |
| 7 | 33 if (CABAL->debug) |
| 34 cout << "NETWORK: off-line\n"; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
35 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
36 |
| 2 | 37 void Network::sendMsg(string m) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
38 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
39 if (cs == -1) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
40 return; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
41 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
42 if (CABAL->debug) |
| 2 | 43 cout << "<- " << cs << " -- " << m << endl; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
44 |
| 7 | 45 send(cs, (m + "\n").c_str(), (m + "\n").length(), 0); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
46 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
47 |
| 2 | 48 string Network::receiveMsg() |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
49 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
50 if (cs == -1) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
51 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
52 |
| 2 | 53 if (canRead(cs)) { |
| 7 | 54 string sbuffer; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
55 char cbuffer; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
56 |
| 2 | 57 int err = recv(cs, &cbuffer, 1, 0); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
58 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
59 if (err > 0) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
60 sbuffer += cbuffer; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
61 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
62 while (1) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
63 if (sbuffer[sbuffer.size() - 1] == '\n') { |
| 2 | 64 sbuffer = (sbuffer.substr(0, 1) == ":") |
| 7 | 65 ? sbuffer.substr(1, sbuffer.length() - 3) |
| 66 : sbuffer.substr(0, sbuffer.length() - 2); | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
67 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
68 if (CABAL->debug) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
69 cout << "-> " << cs << " -- " << sbuffer << endl; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
70 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
71 return sbuffer; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
72 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
73 |
| 2 | 74 err = recv(cs, &cbuffer, 1, 0); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
75 |
| 2 | 76 if (!err) |
| 5 | 77 shut("remote server closed connection"); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
78 else if (err < 0) |
| 5 | 79 shut("failed to receive data"); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
80 else |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
81 sbuffer += cbuffer; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
82 } |
| 2 | 83 } else if (!err) |
| 5 | 84 shut("remote server closed connection"); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
85 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
86 return sbuffer; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
87 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
88 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
89 return ""; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
90 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
91 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
92 bool Network::resolveHost(pchar name, struct address_type *a, int inet) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
93 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
94 #ifdef ENABLE_IPV6 |
| 5 | 95 bool e = false; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
96 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
97 struct addrinfo hints, *res, *reso; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
98 struct sockaddr_in *in; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
99 struct sockaddr_in6 *in6; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
100 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
101 memset(&hints, 0, sizeof (hints)); |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
102 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
103 hints.ai_socktype = SOCK_STREAM; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
104 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
105 if (getaddrinfo(name, "domain", &hints, &res) < 0) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
106 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
107 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
108 reso = res; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
109 |
| 2 | 110 while (res) { |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
111 if (!inet || res->ai_family == inet) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
112 switch (res->ai_family) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
113 case AF_INET6: |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
114 a->inet = AF_INET6; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
115 in6 = (struct sockaddr_in6 *)res->ai_addr; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
116 memcpy (&a->sa6.sin6_addr, &in6->sin6_addr, \ |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
117 sizeof (struct in6_addr)); |
| 5 | 118 e = true; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
119 break; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
120 case AF_INET: |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
121 a->inet = AF_INET; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
122 in = (struct sockaddr_in *)res->ai_addr; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
123 memcpy (&a->sa.sin_addr, &in->sin_addr, \ |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
124 sizeof (struct in_addr)); |
| 5 | 125 e = true; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
126 break; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
127 default: |
| 5 | 128 e = false; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
129 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
130 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
131 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
132 if (e) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
133 break; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
134 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
135 res = res->ai_next; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
136 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
137 |
| 2 | 138 freeaddrinfo(reso); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
139 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
140 return e; |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
141 #else // ! ENABLE_IPV6 |
| 2 | 142 if (inet && inet != AF_INET) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
143 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
144 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
145 a->inet = AF_INET; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
146 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
147 struct hostent *he; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
148 |
| 2 | 149 if (!(he = gethostbyname(name))) { |
| 150 a->sa.sin_addr.s_addr = inet_addr(name); | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
151 |
| 2 | 152 if (a->sa.sin_addr.s_addr) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
153 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
154 } else |
| 2 | 155 memcpy(&a->sa.sin_addr.s_addr, he->h_addr_list[0], he->h_length); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
156 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
157 return 1; |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
158 #endif // ENABLE_IPV6 |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
159 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
160 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
161 bool Network::activateTCP(int port, pchar host) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
162 { |
| 2 | 163 cs = socket(address.inet, SOCK_STREAM, IPPROTO_TCP); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
164 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
165 if (cs == -1) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
166 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
167 |
| 2 | 168 if (host) { |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
169 struct address_type a; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
170 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
171 if (!resolveHost(host, &a, address.inet)) { |
| 2 | 172 close(cs); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
173 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
174 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
175 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
176 int e; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
177 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
178 #ifdef ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
179 if (a.inet == AF_INET6) |
| 5 | 180 e = bind(cs, (struct sockaddr *)&a.sa6, sizeof(a.sa6)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
181 else |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
182 #endif // ENABLE_IPV6 |
| 5 | 183 e = bind(cs, (struct sockaddr *)&a.sa, sizeof(a.sa)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
184 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
185 if (e == -1) { |
| 2 | 186 close(cs); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
187 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
188 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
189 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
190 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
191 #ifdef ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
192 if (address.inet == AF_INET6) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
193 address.sa6.sin6_family = AF_INET6; |
| 2 | 194 address.sa6.sin6_port = htons(port); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
195 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
196 else { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
197 #endif // ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
198 address.sa.sin_family = AF_INET; |
| 2 | 199 address.sa.sin_port = htons(port); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
200 #ifdef ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
201 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
202 #endif // ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
203 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
204 socklen_t parm; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
205 |
| 2 | 206 setsockopt(cs, IPPROTO_TCP, TCP_NODELAY, (pchar)&parm, sizeof(parm)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
207 |
|
6
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
208 connected = false; |
|
9be05a31b7f9
Enqlave IRC Network => Vaygr IRC Network
Vlad Glagolev <enqlave@gmail.com>
parents:
5
diff
changeset
|
209 connecting = true; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
210 |
| 7 | 211 if (CABAL->debug) |
| 212 cout << "NETWORK: socket opened..........: " << cs << endl; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
213 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
214 return 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
215 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
216 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
217 bool Network::openHost() |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
218 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
219 int e; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
220 #ifdef ENABLE_IPV6 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
221 if (address.inet == AF_INET6) |
| 2 | 222 e = connect(cs, (struct sockaddr *)&address.sa6, sizeof(address.sa6)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
223 else |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
224 #endif // ENABLE_IPV6 |
| 2 | 225 e = connect(cs, (struct sockaddr *)&address.sa, sizeof(address.sa)); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
226 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
227 if (e == -1) { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
228 if (errno == EISCONN) { |
| 5 | 229 connected = true; |
| 230 connecting = false; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
231 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
232 return 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
233 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
234 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
235 if (errno != EWOULDBLOCK && errno != EINPROGRESS && errno != EALREADY) { |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
236 closeSocket(); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
237 |
| 5 | 238 connecting = false; |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
239 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
240 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
241 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
242 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
243 return 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
244 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
245 |
| 5 | 246 connected = true; |
| 247 connecting = false; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
248 |
| 7 | 249 if (CABAL->debug) |
| 250 cout << "NETWORK: socket connected.......: " << cs << endl; | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
251 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
252 return 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
253 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
254 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
255 bool Network::closeSocket() |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
256 { |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
257 if (cs == -1) |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
258 return 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
259 |
|
4
a7051ac7118b
added primary parser implementation
Vlad Glagolev <enqlave@gmail.com>
parents:
2
diff
changeset
|
260 close(cs); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
261 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
262 cs = -1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
263 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
264 return 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
265 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
266 |
| 2 | 267 int Network::canRead(int socket) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
268 { |
| 2 | 269 FD_ZERO(&rs); |
| 270 FD_SET(socket, &rs); | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
271 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
272 timeout.tv_sec = 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
273 timeout.tv_usec = 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
274 |
| 2 | 275 int e = select(socket + 1, &rs, 0, 0, &timeout); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
276 |
| 2 | 277 FD_ZERO(&rs); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
278 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
279 return e; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
280 } |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
281 |
| 2 | 282 int Network::canWrite(int socket) |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
283 { |
| 2 | 284 FD_ZERO(&ws); |
| 285 FD_SET(socket, &ws); | |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
286 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
287 timeout.tv_sec = 0; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
288 timeout.tv_usec = 1; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
289 |
| 2 | 290 int e = select(socket + 1, 0, &ws, 0, &timeout); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
291 |
| 2 | 292 FD_ZERO(&ws); |
|
0
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
293 |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
294 return e; |
|
bafff9de2a76
Initial commit since summer'07
Vlad Glagolev <enqlave@gmail.com>
parents:
diff
changeset
|
295 } |
