//有数据传过来了,读取数据 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); } }
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); } }
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; } } }
// 响应客户 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 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); } }
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); } }
// 读取客户端数据 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); } } }
//接受新连接 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); } } }
//有数据传过来了,读取数据 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); } } }
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; }