err_t EthernetClient::do_poll(void *arg, struct tcp_pcb *cpcb) { EthernetClient *client = static_cast<EthernetClient*>(arg); if(client->_connected) { if(cpcb->keep_cnt_sent++ > 4) { cpcb->keep_cnt_sent = 0; /* Stop polling */ tcp_poll(cpcb, NULL, 0); tcp_abort(cpcb); return ERR_OK; } /* Send tcp keep alive probe */ tcp_keepalive(cpcb); return ERR_OK; } /* We only end up here if the connection failed to close * in an earlier call to tcp_close */ err_t err = tcp_close(cpcb); if (err != ERR_OK) { /* error closing, try again later in poll (every 2 sec) */ tcp_poll(cpcb, do_poll, 4); return err; } return err; }
static int _tcp_keepalive(lua_State *L) { int fd = luaL_checkint(L, 1); int keep_alive = lua_toboolean(L, 2); int ret = tcp_keepalive(fd, keep_alive); lua_pushinteger(L, ret); return 1; }