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__);
	}
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #5
0
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);
}
Exemple #7
0
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);
}
Exemple #10
0
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);
}
Exemple #11
0
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);
}
Exemple #13
0
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);
}
Exemple #15
0
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................*/

}
Exemple #16
0
//关闭连接,并移除监听事件
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);
}
Exemple #17
0
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);
}
Exemple #18
0
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);
}
Exemple #19
0
// 响应客户
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);
}
Exemple #20
0
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);
    }
}
Exemple #21
0
//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 );
}
Exemple #22
0
/*
 * 脚本超时钩子
 */
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);
    }
}
Exemple #23
0
// 判断超时,并作超时的处理
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);
    }
}
Exemple #24
0
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 ;
}
Exemple #25
0
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);
        }
    }
}
Exemple #26
0
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 );
}
Exemple #27
0
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 ;
}
Exemple #28
0
//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] );
		}
    }
}
Exemple #29
0
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);
	}
}