void closeFd(int fd, aeEventLoop* el) { aeDeleteTimeEvent(el, time_event_id); if(client_fd != -1){ aeDeleteFileEvent(el, client_fd, AE_READABLE); close(client_fd); client_fd = -1; } if(read_fd != -1){ aeDeleteFileEvent(el, read_fd, AE_READABLE); close(read_fd); read_fd = -1; } if(master_fd != -1){ aeDeleteFileEvent(el, master_fd, AE_READABLE); close(master_fd); master_fd = -1; } if (listen_fd != -1) { aeDeleteFileEvent(el, listen_fd, AE_READABLE); close(listen_fd); listen_fd = -1; } state = START_STATE; buf_master_cmd.len = 0; buf_slave_answer.len = 0; clear_queue(&q); if((time_event_id = aeCreateTimeEvent(el, 1,timeEvent , 0, 0)) == AE_ERR) { log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "Unrecoverable error creating time event errno = %d at line %d in file %s",errno, __LINE__, __FILE__); } }
void freeClient(vuiClient *c) { listNode *ln; listIter *it; cJSON *json; /* Free the query buffer */ sdsfree(c->querybuf); sdsfree(c->querymsg); sdsfree(c->res.body); sdsfree(c->res.reason); sdsfree(c->res.buf); /* Close socket, unregister events, and remove list of replies and * accumulated arguments. */ if (c->fd != -1) { aeDeleteFileEvent(server.el,c->fd,AE_READABLE); aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE); close(c->fd); } it = listGetIterator(c->jsons, AL_START_HEAD); while((ln = listNext(it))) { json = (cJSON *)ln->value; cJSON_Delete(json); listDelNode(c->jsons, ln); } listRelease(c->jsons); listReleaseIterator(it); zfree(c); server.client = NULL; }
void read_handler(aeEventLoop *el, int fd, void *privdata, int mask) { int err; int nread; (void) mask; char buf[BUF_SIZE]={0}; struct request *req = (struct request*)privdata; nread = read(fd, buf, BUF_SIZE); if (nread < 1) { request_free(req); aeDeleteFileEvent(el, fd, AE_WRITABLE); aeDeleteFileEvent(el, fd, AE_READABLE); close(fd); _clicount--; return; } else { request_append(req, buf, nread); err = request_parse(req); if (err == -1) { request_free(req); aeDeleteFileEvent(el, fd, AE_WRITABLE); aeDeleteFileEvent(el, fd, AE_READABLE); close(fd); _clicount--; return; } if (err == 1) { _process_cmd(fd, req); request_clean(req); } } }
static void resetClient(client c) { aeDeleteFileEvent(config.el,c->context->fd,AE_WRITABLE); aeDeleteFileEvent(config.el,c->context->fd,AE_READABLE); aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c); c->written = 0; c->pending = config.pipeline; }
void freeClient(client *c) { if (c->fd != -1) { aeDeleteFileEvent(server.el, c->fd, AE_READABLE); aeDeleteFileEvent(server.el, c->fd, AE_WRITABLE); close(c->fd); } zfree(c); }
void tWriteProc(struct aeEventLoop* eventLoop, int fd, void* clientData, int mask) { char pageBuf[512] = {0}; char contentBuf[256] = {0}; client_data_t *c = (client_data_t *)clientData; snprintf(contentBuf, sizeof(contentBuf), "<html>Hello, <a href=\"https://github.com/pandyxu/enhanced-redis-event-lib\">enhanced-redis-event-lib</a> example.<br /><br />%s</html>", server.backgroundBuf); snprintf(pageBuf, sizeof(pageBuf), "HTTP/1.1 200 OK\r\nContent-Length: %ld\r\n\r\n%s", strlen(contentBuf), contentBuf); int data_size = strlen(pageBuf); size_t available = sizeof(c->writeBuf)-c->writeBufPos; if (data_size > available) { ERRLOG("writeBuf not enough."); aeDeleteFileEvent(eventLoop, fd, AE_WRITABLE); free_client(c); return; } memcpy(c->writeBuf+c->writeBufPos, pageBuf, data_size); c->writeBufPos += data_size; int nwritten = 0; while(c->writeBufPos > 0) { nwritten = write(fd, c->writeBuf + c->sentlen, c->writeBufPos - c->sentlen); if (nwritten <= 0) { break; } c->sentlen += nwritten; /* If the buffer was sent, set writeBufPos to zero to continue with * the remainder of the reply. */ if (c->sentlen == c->writeBufPos) { c->writeBufPos = 0; c->sentlen = 0; } } if (nwritten == -1) { if (errno == EAGAIN) { nwritten = 0; } else { ERRLOG("Error writing to client: %s", strerror(errno)); aeDeleteFileEvent(eventLoop, fd, AE_WRITABLE); free_client(c); return; } } aeDeleteFileEvent(eventLoop, fd, AE_WRITABLE); free_client(c); }
void FreeRemote(proxy_client*r) { /*add..............*/ LogDebug("free remote"); aeDeleteFileEvent(el,r->fd,AE_READABLE); aeDeleteFileEvent(el,r->fd,AE_WRITABLE); close(r->fd); FreeBufferList(r->blist); free(r); /*add..............*/ }
static void freeClient(client c) { listNode *ln; aeDeleteFileEvent(config.el,c->context->fd,AE_WRITABLE); aeDeleteFileEvent(config.el,c->context->fd,AE_READABLE); redisFree(c->context); sdsfree(c->obuf); zfree(c); config.liveclients--; ln = listSearchKey(config.clients,c); assert(ln != NULL); listDelNode(config.clients,ln); }
void free_client(client_data_t* c) { if (NULL == c) { return; } if (c->fd != -1) { aeDeleteFileEvent(server.el,c->fd,AE_READABLE); aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE); close(c->fd); } zfree(c); }
aeFileProc *doWrite(struct aeEventLoop *eventLoop, int client_sk, void *clientData, int mask){ if(clientData != NULL){ int len = 0; int wrote = send(client_sk, clientData, strlen(clientData) + 1, 0); if(wrote <= 0){ aeDeleteFileEvent(eventLoop, client_sk, AE_READABLE); } clientData = NULL; zfree(clientData); } aeDeleteFileEvent(eventLoop, client_sk, AE_WRITABLE); }
static void unlink_redis_test_client(redis_test_client *c) { /* Certain operations must be done only if the client has an active socket. * If the client was already unlinked or if it's a "fake client" the * fd is already set to -1. */ if (c->fd != -1) { /* Unregister async I/O handlers and close the socket. */ aeDeleteFileEvent(server.el,c->fd,AE_READABLE); aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE); close(c->fd); c->fd = -1; } }
void ClientClose(aeEventLoop *el, int fd, int err){ //如果err为0,则说明是正常退出,否则就是异常退出 if( 0 == err ){ //printf("Client quit: %d\n", fd); } else if( -1 == err ) fprintf(stderr, "Client Error: %s\n", strerror(errno)); //删除结点,关闭文件 aeDeleteFileEvent(el, fd, AE_READABLE); aeDeleteFileEvent(el, fd, AE_WRITABLE); close(fd); }
void gwseriport_release(struct gwseriport *s) { aeDeleteFileEvent(server.el,s->fd,AE_READABLE); aeDeleteFileEvent(server.el,s->fd,AE_WRITABLE); close(s->fd); buffer_release(s->recvbuf); listNode *ln = listSearchKey(server.seriports,s); assert(ln != NULL); listDelNode(server.seriports,ln); free(s); }
void easysocketbenchmark::closeclient(int fd, int err){ //如果err为0,则说明是正常退出,否则就是异常退出 if( 0 == err ){ //printf("Client quit: %d\n", fd); } else if( -1 == err ){ //printf("client error: %s\n", strerror(errno)); } //删除结点,关闭文件 aeDeleteFileEvent(this->g_event_loop, fd, AE_READABLE); aeDeleteFileEvent(this->g_event_loop, fd, AE_WRITABLE); close(fd); }
void FreeClient(proxy_client*c) { /*add................*/ if(c==NULL) return; LogDebug("free client %d",c->fd); aeDeleteFileEvent(el,c->fd,AE_READABLE); aeDeleteFileEvent(el,c->fd,AE_WRITABLE); close(c->fd); FreeRemote(c->remote); FreeBufferList(c->blist); free(c); /*add................*/ }
//关闭连接,并移除监听事件 void freeClient( aeConnection* c ) { if (c->fd != -1) { c->disable = 1; int reactor_id = c->fd%servG->reactorNum; aeEventLoop* el = servG->reactorThreads[reactor_id].reactor.eventLoop; aeDeleteFileEvent( el ,c->fd,AE_READABLE); aeDeleteFileEvent( el,c->fd,AE_WRITABLE); sdsfree( c->send_buffer ); servG->connectNum -= 1; close(c->fd); } //zfree(c); }
void sendReplay(aeEventLoop *el, int fd, void *privdata, int mask) { vuiClient *c = (vuiClient *)privdata; int len; int nw; char *pos; sdsclear(c->res.buf); LogInfo("sendReplay...."); c->res.buf = sdscatprintf(c->res.buf, "%s %d %s\r\nlength: %zu\r\n\r\n%s", c->res.version, c->res.code, c->res.reason, sdslen(c->res.body), c->res.body); len = sdslen(c->res.buf); pos = c->res.buf; while(len>0) { nw = write(fd, pos, len); pos += nw; len -= nw; } //reset if (c->res.code >= 200) { c->procing = PROC_END; } else{ c->res.code = 200; c->res.reason = sdscpy(c->res.reason, "OK"); c->procing = PROC_ING; } aeDeleteFileEvent(el,c->fd,AE_WRITABLE); }
static void client_cb(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask) { struct node *client = (struct node *)clientData; /* read */ char buffer[512]; int len = read(fd, buffer, 512); if (len <= 0) { fprintf(stderr, "Client closed: %d.", fd); aeDeleteFileEvent(eventLoop, fd, mask); client_remove(client); return; } /* push to total and split */ int count = 0; client->buffer = sdscatlen(client->buffer, buffer, len); sds *lines = sdssplitlen(client->buffer, sdslen(client->buffer), "\n", 1, &count); /* translate */ int i; for (i = 0; i < count; i++) { translate(lines[i], client); sdsfree(lines[i]); } free(lines); sdsclear(client->buffer); }
// 响应客户 void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) { client_t* c = privdata; int nwritten = c->rsplen; int res, sentlen = 0; printf("Request From %s:%d : %s\n", c->ipaddr, c->port, c->response); while(nwritten) { res = write(fd, c->response + sentlen, c->rsplen - sentlen); // 写入出错 if (res == -1) { if (errno == EAGAIN) { continue; } else { fprintf(stderr, "send response to client failure.\n"); ClientClose(el, c, res); } } nwritten -= res; sentlen += res; if (sentlen == c->rsplen) { c->rsplen = 0; } } aeDeleteFileEvent(el,c->fd,AE_WRITABLE); }
void mx_send_client_response(mx_connection_t *conn) { int wcount, wsize = conn->sendlast - conn->sendpos; wcount = write(conn->fd, conn->sendpos, wsize); if (wcount == -1) { if (errno != EAGAIN && errno != EWOULDBLOCK) { mx_write_log(mx_log_error, "Failed to read, and not due to blocking"); mx_free_connection(conn); } return; } else if (wcount == 0) { mx_free_connection(conn); return; } conn->sendpos += wcount; if (conn->sendpos >= conn->sendlast) { /* finish */ conn->sendpos = conn->sendbuf; conn->sendlast = conn->sendbuf; conn->state = mx_event_reading; conn->rev_handler = mx_recv_client_request; conn->wev_handler = NULL; aeDeleteFileEvent(mx_daemon->event, conn->fd, AE_WRITABLE); } }
//write to pipe void onMasterPipeWritable( aeEventLoop *el, int pipe_fd, void *privdata, int mask ) { ssize_t nwritten; int worker_id = (int)( privdata ); pthread_mutex_lock( &servG->workers[worker_id].r_mutex ); nwritten = write( pipe_fd , servG->workers[worker_id].send_buffer, sdslen(servG->workers[worker_id].send_buffer)); //pipe fd error... if (nwritten <= 0) { printf( "I/O error writing to pipefd: %s", strerror(errno)); close( pipe_fd ); return; } //offset sdsrange(servG->workers[worker_id].send_buffer,nwritten,-1); ///if send_buffer no data need send, remove writable event if (sdslen(servG->workers[worker_id].send_buffer) == 0) { aeDeleteFileEvent( el, pipe_fd , AE_WRITABLE); } pthread_mutex_unlock( &servG->workers[worker_id].r_mutex ); }
/* * 脚本超时钩子 */ void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { long long elapsed; REDIS_NOTUSED(ar); REDIS_NOTUSED(lua); // 计算已执行时间 elapsed = (ustime()/1000) - server.lua_time_start; if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { redisLog(REDIS_WARNING,"Lua slow script detected: still in execution after %lld milliseconds. You can try killing the script using the SCRIPT KILL command.",elapsed); // 已超时 server.lua_timedout = 1; /* Once the script timeouts we reenter the event loop to permit others * to call SCRIPT KILL or SHUTDOWN NOSAVE if needed. For this reason * we need to mask the client executing the script from the event loop. * If we don't do that the client may disconnect and could no longer be * here when the EVAL command will return. */ // 当脚本运行超时时,将正在执行的客户端从读事件中移除 // 并允许其他客户端执行 SCRIPT KILL 或者 SHUTDOWN NOSAVE aeDeleteFileEvent(server.el, server.lua_caller->fd, AE_READABLE); } if (server.lua_timedout) // 在脚本上下文中,启动文件事件处理(等待 SCRIPT KILL 或 SHUTDOWN NOSAVE) aeProcessEvents(server.el, AE_FILE_EVENTS|AE_DONT_WAIT); if (server.lua_kill) { // 杀死脚本 redisLog(REDIS_WARNING,"Lua script killed by user with SCRIPT KILL."); lua_pushstring(lua,"Script killed by user with SCRIPT KILL..."); lua_error(lua); } }
// 判断超时,并作超时的处理 void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { long long elapsed; REDIS_NOTUSED(ar); REDIS_NOTUSED(lua); // 计算已经超时的时间 elapsed = (ustime()/1000) - server.lua_time_start; if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { redisLog(REDIS_WARNING,"Lua slow script detected: still in execution after %lld milliseconds. You can try killing the script using the SCRIPT KILL command.",elapsed); server.lua_timedout = 1; // 超时了,关闭监听发送 lua 脚本命令的客户端 /* Once the script timeouts we reenter the event loop to permit others * to call SCRIPT KILL or SHUTDOWN NOSAVE if needed. For this reason * we need to mask the client executing the script from the event loop. * If we don't do that the client may disconnect and could no longer be * here when the EVAL command will return. */ aeDeleteFileEvent(server.el, server.lua_caller->fd, AE_READABLE); } // lua 脚本执行超时,redis 会检测对否有其他客户端会发送 SCRIPT KILL 命令 // 尝试终结这个脚本的执行 if (server.lua_timedout) aeProcessEvents(server.el, AE_FILE_EVENTS|AE_DONT_WAIT); // 如果 lua 脚本被停止了,强制产生错误,结束 lua if (server.lua_kill) { redisLog(REDIS_WARNING,"Lua script killed by user with SCRIPT KILL."); lua_pushstring(lua,"Script killed by user with SCRIPT KILL..."); lua_error(lua); } }
static void finish_storage_recovery(struct aeEventLoop *eventLoop, int sockfd, void *clientData, int mask) { g_storage_service.heart_beat.status = STORAGE_RECOVERYED; aeDeleteFileEvent(eventLoop,sockfd,AE_READABLE); clean_storage_client((storage_client_t*)clientData); return ; }
void aeFileReadWrite(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask) { int ret; printf("aeFileReadWrite mask = %d, fd = %d\n", mask, fd); if(server_fd == fd){ struct sockaddr_in client_addr; socklen_t sin_size; printf("A New client connect\n"); int new_fd = accept(fd, (struct sockaddr *)&client_addr, &sin_size); printf("New connection client%s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); ret = aeCreateFileEvent(eventLoop, new_fd, AE_READABLE, aeFileReadWrite, NULL); if(ret == AE_ERR) printf("aeCreateFileEvent failed\n"); }else{ char buf[1024]; ret = recv(fd, buf, sizeof(buf), 0); if (ret <= 0) { printf("A Client disconnet\n"); aeDeleteFileEvent(eventLoop, fd, AE_READABLE | AE_WRITABLE); aeClose(fd); }else{ buf[ret] = '\0'; printf("Recv data: %s\n", buf); } } }
void onMasterPipeWritable( aeEventLoop *el , int pipe_fd , void *privdata , int mask ) { ssize_t nwritten; int worker_id = (int) ( privdata ); pthread_mutex_lock( &servG->workers[worker_id].r_mutex ); nwritten = write( pipe_fd , servG->workers[worker_id].send_buffer , sdslen( servG->workers[worker_id].send_buffer ) ); if (nwritten < 0) { printf( "Master Pipe Write Error written=%d,errno=%d,errstr=%s \n" , nwritten , errno , strerror( errno ) ); close( pipe_fd ); return; } if (nwritten > 0) { sdsrange( servG->workers[worker_id].send_buffer , nwritten , -1 ); } else { printf( "Notice:onMasterPipeWritable empty loop \n" ); } /* if send_buffer empty, remove writable event */ if (sdslen( servG->workers[worker_id].send_buffer ) == 0) { aeDeleteFileEvent( el , pipe_fd , AE_WRITABLE ); } pthread_mutex_unlock( &servG->workers[worker_id].r_mutex ); }
static void do_new_nb_sock_send_file(struct aeEventLoop *eventLoop, int sockfd, void *clientData, int mask) { storage_client_t *pClient; pClient = clientData; int size; if((size = sendfile(sockfd,pClient->file.fd,&pClient->file.start_offlen,\ pClient->file.file_size-pClient->file.read_size)) == -1&&errno != EAGAIN) { logError( "file: "__FILE__",line :%d, "\ "sock_send_file sendfile failed,"\ "errno: %d,error info: %s",\ __LINE__,errno,strerror(errno)); return ; } pClient->file.read_size += size; if(pClient->file.read_size == pClient->file.file_size) { aeDeleteFileEvent(eventLoop,sockfd,AE_WRITABLE); if(pClient->file.proc != NULL) pClient->file.proc(eventLoop,sockfd,pClient,AE_WRITABLE); } return ; }
//send to client,if send over , delete writable event void onClientWritable( aeEventLoop *el, int fd, void *privdata, int mask ) { ssize_t nwritten; if( servG->connlist[fd].disable == 1 ) { return; } nwritten = write( fd, servG->connlist[fd].send_buffer, sdslen(servG->connlist[fd].send_buffer)); if (nwritten <= 0) { printf( "I/O error writing to client: %s", strerror(errno)); freeClient( &servG->connlist[fd] ); return; } //offset sdsrange(servG->connlist[fd].send_buffer,nwritten,-1); ///if send_buffer no data need send, remove writable event if (sdslen(servG->connlist[fd].send_buffer) == 0) { aeDeleteFileEvent( el, fd, AE_WRITABLE); if( servG->connlist[fd].disable == 2 ) { freeClient( &servG->connlist[fd] ); } } }
static void request_handler (aeEventLoop * el, int fd, void *data, int mask) { workerState *ws = (workerState *) data; simpleBuf *sb = &ws->out; int tw; if (ws->reconn_after > 0LL) { ws->reconn_after = 0LL; } tw = sb_write (sb, fd); if (tw < 0) { fprintf (stderr, "[smr-client] failed to sb_write:%d\n", tw); free_connection (ws, 1); return; } if (sb->ep - sb->cp == 0) { sb->cp = sb->buf; //reset sb aeDeleteFileEvent (el, fd, AE_WRITABLE); ws->wprepared = 0; } return; }
//有数据传过来了,读取数据 void ReadFromServer(aeEventLoop *el, int fd, void *privdata, int mask) { char buffer[MAX_LEN] = { 0 }; int res; res = read(fd, buffer, MAX_LEN-1); if( res == 0 ){ //printf("client socket closed...\n"); ClientClose(el, fd, res); } else if( res < 0 ){ if(errno == EWOULDBLOCK || errno == EAGAIN){ //printf("read finished...\n"); } else if(errno == EINTR){ //printf("initevent....continue..."); } else{ //printf("read error...\n"); ClientClose(el, fd, res); } } else if( res == MAX_LEN-1){ //printf("partial content : %s", buffer); //printf("read not finished...continue...\n"); } else if( 0 < res < MAX_LEN-1){ //printf("partial content : %s", buffer); //printf("read finished...\n"); total_res += 1; aeDeleteFileEvent(el, fd, AE_READABLE); WriteHandler(el, fd, NULL, 0); } }