catalinux / Conn (public) (License: LGPLv2) (since 2016-03-01) (hash sha1)
Net library for easy building ipv4/ipv6 network daemons/clients
List of commits:
Subject Hash Author Date (UTC)
More verbose logging and added some TODOs. a27014689701b1dd3d0e3c02629d3c7dd0edc77e Catalin(ux) M. BOIE 2010-06-07 20:24:43
Added Conn_[io]qlen and obsoleted Conn_qlen (ambiguous). be3822589afe052fade15fd81afee3549217131a Catalin(ux) M. BOIE 2010-06-07 20:23:39
Use u32 field of epoll. ptr on 64bit gave an warning. 37c86810ceaadd0c8139f11e3737577efea4cabd Catalin(ux) M. BOIE 2010-06-07 19:46:15
Export CONN_VERSION in Conn_config.h d34d7a1da235b00c3aa1c8e0494310c4dd100886 Catalin(ux) M. BOIE 2010-06-07 19:45:53
In Conn_poll_cb, show human readable events. a3e305582e9bf1185254f8feeab90c51af626443 Catalin(ux) M. BOIE 2010-06-07 17:22:49
Cosmetic logs. 937e40b54fabf19d7ed2102c104585bea0181634 Catalin(ux) M. BOIE 2010-06-07 17:22:25
Export Conn_poll_status. 8d6e2e96bd8e7a34a239533edb7484d78de69995 Catalin(ux) M. BOIE 2010-06-07 17:21:57
Bump up the version to 1.0.31. 4a307965c1f3b1449e98c7487a8e98538d237a23 Catalin(ux) M. BOIE 2010-05-30 19:22:27
On accept() set IN+OUT flags to speed up the sending (skip an epoll_wait). 843d55ea6c8360f4f435288cd68183029e4c06e4 Catalin(ux) M. BOIE 2010-05-06 17:10:14
Use accept4 to skip an extra fcntl call! 3eda4a8ac828035e4205dbe13e60fa39b6d8b2c6 Catalin(ux) M. BOIE 2010-05-06 17:09:54
If the socket is in closing phase, do not change events. 57e97028a524ab257bc8216c5a2da7381cc0d050 Catalin(ux) M. BOIE 2010-05-06 17:02:27
Avoid doing epoll_ctl using a cache. 9bc66cd209921998195b25c2f296fd0516a1ddbb Catalin(ux) M. BOIE 2010-05-06 16:53:13
Do not call gerpeername and getsockname at every accept/connect. Do it only when needed. d2505dbca77358b6ed67394e09904b525ea517e6 Catalin(ux) M. BOIE 2010-05-06 16:38:40
Simplified setting NONBLOCK in Conn_setnonblock. 18d93d4daf5182e2c2749be05f7bbd43bb18bb18 Catalin(ux) M. BOIE 2010-05-06 16:13:34
strstr should not use case sensitive when searching for \n. 50658544213ff74d0e03625c5e3fae0eadba73ad Catalin(ux) M. BOIE 2010-05-06 16:11:06
Grow receiving buffer with Conn_default_ibuf instead of 0! Stupid! f663a98fc5db5f64a4ed7bf9a37ae5a1a708ac3c Catalin(ux) M. BOIE 2010-05-06 16:10:13
Use fd -1 to signal that the socket is closed. 66c44cbeb5672fae1bea46260adbae06a3562d88 Catalin(ux) M. BOIE 2010-05-06 16:08:59
Better error logging in xbind example. dac03d74521e751de9d900ea115ad2fbd2deba6e Catalin(ux) M. BOIE 2010-02-16 20:22:05
Fixed some stupid choices regarding storage type for the output of snprintf. 3cddc7934c4fc2640e4a60d408e98c45acef48c9 Catalin(ux) M. BOIE 2010-02-05 00:12:13
First round of memory status. 9e267dc05ec2c0b1e50288a6d9a5db5d3677e82e Catalin(ux) M. BOIE 2010-02-04 23:46:48
Commit a27014689701b1dd3d0e3c02629d3c7dd0edc77e - More verbose logging and added some TODOs.
Author: Catalin(ux) M. BOIE
Author date (UTC): 2010-06-07 20:24
Committer name: Catalin(ux) M. BOIE
Committer date (UTC): 2010-06-11 09:04
Parent(s): be3822589afe052fade15fd81afee3549217131a
Signer:
Signing key:
Signing status: N
Tree: 6621ac07ea9baf514270f11dd09e93eb2cf529d5
File Lines added Lines deleted
Conn.c 22 21
TODO 1 0
File Conn.c changed (mode: 100644) (index 4caddbb..513507e)
... ... static void Conn_recv_cb_i(const unsigned int slot)
1193 1193 else if (Conn_data_cb) else if (Conn_data_cb)
1194 1194 Conn_data_cb(&Conns[slot]); Conn_data_cb(&Conns[slot]);
1195 1195 } else if (n == 0) { } else if (n == 0) {
1196 Log(10, "\tRemote closed sending side (slot=%u, id=%llu)\n",
1197 slot, Conns[slot].id);
1196 Log(10, "\tRemote closed sending side.\n");
1198 1197 Conns[slot].error_state = CONN_ERROR_HANGUP; Conns[slot].error_state = CONN_ERROR_HANGUP;
1198 /* TODO: Maybe we should just cut INPUT and do not hangup */
1199 1199 } else { } else {
1200 1200 Log(4, "\tError in recv (slot=%u, id=%llu) [%s]\n", Log(4, "\tError in recv (slot=%u, id=%llu) [%s]\n",
1201 1201 slot, Conns[slot].id, strerror(errno)); slot, Conns[slot].id, strerror(errno));
 
... ... static void Conn_poll_cb(const unsigned int slot, int revents)
1236 1236
1237 1237 /* First, test we have a new connection */ /* First, test we have a new connection */
1238 1238 if ((revents & CONN_POLLOUT) if ((revents & CONN_POLLOUT)
1239 && (Conn_ignore(slot) == 0)) {
1240 /* We just established a connection */
1241 if (Conns[slot].state == CONN_STATE_CONNECT_b) {
1242 /*
1243 * We do not need POLLOUT now - it was used only for
1244 * connect completion.
1245 */
1239 && (Conn_ignore(slot) == 0)
1240 && (Conns[slot].state == CONN_STATE_CONNECT_b)) {
1241 Log(12, "\tWe just established a connection.\n");
1242
1243 if (Conn_oqlen(&Conns[slot]) == 0) {
1244 /* Nothing to send */
1246 1245 revents &= ~CONN_POLLOUT; revents &= ~CONN_POLLOUT;
1247 1246 Conns[slot].events &= ~CONN_POLLOUT; Conns[slot].events &= ~CONN_POLLOUT;
1248 1247 Conn_engine_chg_obj(&Conns[slot]); Conn_engine_chg_obj(&Conns[slot]);
1248 }
1249 1249
1250 Conns[slot].state = CONN_STATE_OPEN;
1250 Conns[slot].state = CONN_STATE_OPEN;
1251 1251
1252 Conns[slot].flags |= CONN_ADDR_LOCAL_DIRTY;
1252 Conns[slot].flags |= CONN_ADDR_LOCAL_DIRTY;
1253 1253
1254 Conns[slot].time_open = Conn_now;
1254 Conns[slot].time_open = Conn_now;
1255 1255
1256 if (Conns[slot].cb_connected != NULL)
1257 Conns[slot].cb_connected(&Conns[slot]);
1258 else if (Conn_connected_cb)
1259 Conn_connected_cb(&Conns[slot]);
1260 }
1256 if (Conns[slot].cb_connected != NULL)
1257 Conns[slot].cb_connected(&Conns[slot]);
1258 else if (Conn_connected_cb)
1259 Conn_connected_cb(&Conns[slot]);
1261 1260 } }
1262 1261
1263 /* Second, test for error or input */
1262 /* Second, test for hangup or input */
1264 1263 if ((revents & CONN_POLLIN) if ((revents & CONN_POLLIN)
1265 1264 && (Conn_ignore(slot) == 0)) { && (Conn_ignore(slot) == 0)) {
1265 Log(12, "\tWe have input...\n");
1266 1266 if (Conns[slot].type == CONN_TYPE_MASTER) { if (Conns[slot].type == CONN_TYPE_MASTER) {
1267 1267 /* C pointer can change under us in Conn_accept->Conn_grow */ /* C pointer can change under us in Conn_accept->Conn_grow */
1268 1268 Conn_accept(slot); Conn_accept(slot);
 
... ... static void Conn_poll_cb(const unsigned int slot, int revents)
1278 1278
1279 1279 if ((revents & CONN_POLLOUT) if ((revents & CONN_POLLOUT)
1280 1280 && (Conn_ignore(slot) == 0)) { && (Conn_ignore(slot) == 0)) {
1281 /* We can send data */
1281 Log(12, "\tWe can send data...\n");
1282 1282 if (Conns[slot].state == CONN_STATE_OPEN) { if (Conns[slot].state == CONN_STATE_OPEN) {
1283 1283 if (Conns[slot].cb_send) if (Conns[slot].cb_send)
1284 1284 Conns[slot].cb_send(&Conns[slot]); Conns[slot].cb_send(&Conns[slot]);
 
... ... static void Conn_poll_cb(const unsigned int slot, int revents)
1287 1287 else else
1288 1288 Conn_send_cb_i(slot); Conn_send_cb_i(slot);
1289 1289
1290 if (Conns[slot].obuf_head == Conns[slot].obuf_tail) {
1290 if (Conn_oqlen(&Conns[slot]) == 0) {
1291 1291 if (Conns[slot].flags & CONN_FLAGS_CLOSE_AFTER_SEND) { if (Conns[slot].flags & CONN_FLAGS_CLOSE_AFTER_SEND) {
1292 1292 Conns[slot].state = CONN_STATE_ERROR; Conns[slot].state = CONN_STATE_ERROR;
1293 1293 Conns[slot].error_state = CONN_ERROR_USERREQ; Conns[slot].error_state = CONN_ERROR_USERREQ;
 
... ... int Conn_poll(const int timeout)
1374 1374
1375 1375 /* Closing connection if it is in error state */ /* Closing connection if it is in error state */
1376 1376 if (Conns[slot].error_state > 0) { if (Conns[slot].error_state > 0) {
1377 Log(11, "\tSlot=%u in error [%s], exchange with pos %u.\n",
1377 Log(11, "\tSlot=%u in error [%s], exchange with slot %u.\n",
1378 1378 slot, Conn_errno(&Conns[slot]), last); slot, Conn_errno(&Conns[slot]), last);
1379 1379 Conn_move_slot(slot, last); Conn_move_slot(slot, last);
1380 1380 Conn_free_intern(last); Conn_free_intern(last);
 
... ... int Conn_poll(const int timeout)
1418 1418
1419 1419 /* /*
1420 1420 * Returns the lifetime of a connection * Returns the lifetime of a connection
1421 * TODO: To be moved in 'core'?
1421 1422 */ */
1422 1423 unsigned long long Conn_lifetime(struct Conn *C) unsigned long long Conn_lifetime(struct Conn *C)
1423 1424 { {
File TODO changed (mode: 100644) (index cf1fec2..56c4068)
3 3 == HIGH PRIORITY == == HIGH PRIORITY ==
4 4 [ ] Cache getaddrinfo responses [ ] Cache getaddrinfo responses
5 5 [ ] Replace Conn_X with Conn_get_socket_X! [ ] Replace Conn_X with Conn_get_socket_X!
6 [ ] Use shutdown(2) before closing connection (http://www.developerweb.net/forum/archive/index.php/t-2940.html).
6 7
7 8 == LOW PRIORITY == == LOW PRIORITY ==
8 9 [ ] Dump all memory statistics [ ] Dump all memory statistics
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/Conn

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/Conn

Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/Conn

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main