/* LUA: new(fd, read, write, error) Pushes a new bufferevent instance on the stack Accepts: base, fd, read, write, error cb Requires base, fd and error cb */ static int buffer_event_push(lua_State* L) { le_bufferevent *ev; le_base* base = event_base_get(L, 1); /* NOTE: Should probably reference the socket as well... */ int fd = getSocketFd(L, 2); luaL_checktype(L, 5, LUA_TFUNCTION); if(!lua_isnil(L, 3)) luaL_checktype(L, 3, LUA_TFUNCTION); if(!lua_isnil(L, 4)) luaL_checktype(L, 4, LUA_TFUNCTION); ev= (le_bufferevent*)lua_newuserdata(L, sizeof(le_bufferevent)); luaL_getmetatable(L, BUFFER_EVENT_MT); lua_setmetatable(L, -2); ev->ev = bufferevent_new(fd, buffer_event_readcb, buffer_event_writecb, buffer_event_errorcb, ev); lua_createtable(L, 5, 0); lua_pushvalue(L, 3); lua_rawseti(L, -2, 1); // Read lua_pushvalue(L, 4); lua_rawseti(L, -2, 2); // Write lua_pushvalue(L, 5); lua_rawseti(L, -2, 3); // Err event_buffer_push(L, ev->ev->input); lua_rawseti(L, -2, READ_BUFFER_LOCATION); event_buffer_push(L, ev->ev->output); lua_rawseti(L, -2, WRITE_BUFFER_LOCATION); lua_setfenv(L, -2); ev->base = base; return 1; }
//外网模式下,服务器在线测试 USER_FUNC void pingTest(void *arg) { while (getPingServerThreadFlag()) { sleep(5); pingServer(); sleep(120); u_printf("check ping result"); if (getPingResultFlag()) { //if ping result is correct setPingResultFlag(0); } else { //若ping服务器无反应,则释放资源并让主板重新上线 resetPingData(); //关闭socket连接 closeSocket(getSocketFd()); sleep(10); //10s后主板开始重新上线 initPingData(); connectServer(); loginServer(); if (hfthread_create(recvTest, "RECV_THREAD", 256, NULL,HFTHREAD_PRIORITIES_LOW, NULL, NULL) != HF_SUCCESS) { u_printf("create recvMessage thread fail\n"); } if (hfthread_create(pingTest, "PING_THREAD", 256, NULL,HFTHREAD_PRIORITIES_LOW, NULL, NULL) != HF_SUCCESS) { u_printf("create pingServer thread fail\n"); } } } }
/* sock, event, callback, timeout */ static int luaevent_addevent(lua_State* L) { int fd, event; le_callback* arg = event_callback_push(L, 1, 4); struct timeval *tv = &arg->timeout; if(lua_isnil(L, 2) && lua_isnumber(L, 5)) { fd = -1; /* Per event_timer_set.... */ } else { fd = getSocketFd(L, 2); } event = luaL_checkinteger(L, 3); if(lua_isnumber(L, 5)) { double time = lua_tonumber(L, 5); load_timeval(time, tv); } else { tv = NULL; } /* Setup event... */ arg->ev = *event_new(arg->base->base, fd, event | EV_PERSIST, luaevent_callback, arg); event_add(&arg->ev, tv); return 1; }
/* return Wert: -1,0 : Fehler 1 : Pipe ist ready 2 : Socket lesbar */ int ueberwacheFd(int pipe_fd[],char *getText){ //Observe the pi(p)e with the magic of Gandalf the Grey int socket_fd = getSocketFd(); fd_set set; FD_ZERO(&set); FD_SET(pipe_fd[READ],&set); FD_SET(socket_fd,&set); int max = pipe_fd[READ]; if (max < socket_fd) { max = socket_fd; } int ret = select(max+1,&set,NULL,NULL,NULL); if(ret < 1){ log_printf(LOG_ERROR,"Fehler bei Select\n"); perror("error"); return 0; } else if (FD_ISSET(pipe_fd[READ],&set)) { log_printf(LOG_DEBUG,"Gandalf hat gedacht.\n"); return pipe_read(pipe_fd, getText); } log_printf(LOG_DEBUG,"Gandalf denkt zu langsam.\n"); return 2; }