예제 #1
0
//有数据传过来了,读取数据
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);
	}
}
예제 #2
0
void SendToClient(aeEventLoop *el, int fd, void *privdata, int mask){
	int writenLen;
	char * head = privdata;

	// 确保sockfd是非阻塞的
	writenLen = write(fd, head, strlen(head));
	if (writenLen == -1){
		if(errno == ECONNRESET){
			//printf("client socket closed...\n");
			ClientClose(el, fd, writenLen);
		}
		else if (errno == EINTR || errno == EAGAIN){
			//printf("init....continue...");
		}
		else{
			// 其他错误
			//printf("write error...\n");
			ClientClose(el, fd, writenLen);
		}
	}

	else if (writenLen == 0){
		// 这里表示对端的socket已正常关闭.
		//printf("client socket closed...\n");
		ClientClose(el, fd, writenLen);
	}

	else{
		// 写了数据
		aeDeleteFileEvent(el, fd, AE_WRITABLE);
		//printf("write finished...\n");
		//printf("write cnt:\n");
		//printf("%s\n", head);
	}
}
예제 #3
0
void GateModule::handle_message(const message& msg)
{
	switch (msg.get_type())
	{
	case EMessageType::SocketConnect:
	{
		ClientConnect(msg);
		break;
	}
	case EMessageType::SocketData:
	{
		ClientData(msg);
		break;
	}
	case EMessageType::SocketClose:
	{
		ClientClose(msg);
		break;
	}
	case EMessageType::ActorData:
	{
		ActorData(msg);
		break;
	}
	case EMessageType::ToClient:
	{
		ToClientData(msg);
		break;
	}
	}
}
예제 #4
0
파일: server.c 프로젝트: wshgit/redis-net
// 响应客户
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);
}
예제 #5
0
파일: main.c 프로젝트: fgd1987/elua
//有数据传过来了,读取数据
void ReadFromClient(aeEventLoop *el, int fd, void *privdata, int mask)
{
	char buffer[MAX_LEN] = { 0 };
	
	int res = read(fd, buffer, 2);
	assert(res == 2);

	res = read(fd, buffer, res);

	int res = read(fd, buffer, MAX_LEN);
	printf("read: %d\n", res);
	if( res <= 0 )
	{
		ClientClose(el, fd, res, privdata);
	}
	else
	{
		struct Client *p = privdata;
		assert(p);		

		lua_getglobal(p->L, "OnData");

		lua_pushinteger(p->L, fd);
		lua_pushlstring(p->L, buffer, res);

		lua_pcall(p->L, 2, 0, 0);

		//res = write(fd, buffer, MAX_LEN);
		//if( -1 == res )
		//	ClientClose(el, fd, res, privdata);
	}
}
예제 #6
0
파일: server.c 프로젝트: TheNiceGuy/mtd
void ServerFreeSafe(struct server* st_server) {
    struct client* st_client;
    struct file* st_file;

    assert(!st_server->listening);

    /* Free memory related to the clients. */
    if(st_server->st_clients != NULL) {
        for(int i = 0; i < st_server->st_clients->current; i++) {
            st_client = (struct client*)VectorGetPointer(st_server->st_clients, i);

            if(ClientClose(st_client) == FAILED)
                printf("Could not gracefully terminate client %s:%d\n", st_client->ip, st_client->port);
            ClientDelete(st_client);
        }
        VectorFree(st_server->st_clients);
    }

    /* Free memory related to the clients. */
    if(st_server->st_files != NULL) {
        for(int i = 0; i < st_server->st_files->current; i++) {
            st_file = (struct file*)VectorGetPointer(st_server->st_files, i);
            ServerDeleteFile(st_server, st_file->descriptor);
        }
        VectorFree(st_server->st_files);
    }
}
예제 #7
0
파일: server.c 프로젝트: wshgit/redis-net
// 读取客户端数据
void ReadFromClient(aeEventLoop *el, int fd, void *privdata, int mask)
{
	int res;
	client_t* c = privdata;
	res = read(fd, c->request + c->len, MAX_LEN - c->len);
	if( res <= 0 )
	{
		ClientClose(el, c, res);
		return;
	}
	c->len += res;	
	
	if(processBuffer(el, c, res) == OK) {
		if(aeCreateFileEvent(el, fd, AE_WRITABLE, sendReplyToClient, c) == AE_ERR)  {
			fprintf(stderr, "Can't Register File Writeable Event.\n");
			ClientClose(el, c, res);
		}			
	}
	
}
예제 #8
0
//接受新连接
void WriteHandler(aeEventLoop *el, int fd, void *privdata, int mask){
	int writenLen;
	char * head = "hello world !!!";

	// 确保sockfd是非阻塞的
	writenLen = write(fd, head, strlen(head));
	if (writenLen == -1){
		if(errno == ECONNRESET){
			//printf("client socket closed...\n");
			ClientClose(el, fd, writenLen);
		}
		else if (errno == EINTR || errno == EAGAIN){
			//printf("init....continue...");
		}
		else{
			// 其他错误
			//printf("write error...\n");
			ClientClose(el, fd, writenLen);
		}
	}

	else if (writenLen == 0){
		// 这里表示对端的socket已正常关闭.
		//printf("client socket closed...\n");
		ClientClose(el, fd, writenLen);
	}

	else{
		// 写了数据
		//printf("write finished...\n");
		//printf("write cnt:\n");
		//printf("%s\n", head);
		total_req += 1;
		aeDeleteFileEvent(el, fd, AE_WRITABLE);
		if( aeCreateFileEvent(el, fd, AE_READABLE, 
		ReadFromServer, NULL) == AE_ERR ){
			fprintf(stderr, "client connect fail: %d\n", fd);
			close(fd);
		}
	}
}
예제 #9
0
//有数据传过来了,读取数据
void ReadFromClient(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");
		char *ret = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
		//可以参考redis源码,在处理函数完毕之后调用专门的函数设置等待写事件
		if( aeCreateFileEvent(el, fd, AE_WRITABLE,
		SendToClient, ret) == AE_ERR ){
			fprintf(stderr, "set writeable fail: %d\n", fd);
			//close(fd);
		}
	}
}
예제 #10
0
파일: server.c 프로젝트: wshgit/redis-net
int processBuffer(aeEventLoop *el, client_t* c, int res) {
	char *newline = strstr(c->request,"\r\n");
	int reqlen;	

	if(newline == NULL) {
		if(c->len > MAX_REQUEST_SIZE) {
			fprintf(stderr,"Protocol error: too big request");
			ClientClose(el, c, res);
			return ERR;
		}
		return NO_READY;
	}

	reqlen = newline - c->request + 2;
	memcpy(c->response, c->request, reqlen);
	c->rsplen = reqlen;
	c->len -= reqlen;
	if(c->len)
		memmove(c->request, c->request+reqlen, c->len);

	return OK;
}