void on_read(int sock,short event,void *arg) { struct event* write_ev; int size; sock_ev* ev = (sock_ev*)arg; do { ev->buffer= (char*)malloc(MEM_SIZE); if ( NULL == ev->buffer ) { debug_log("malloc failed",errno); release_sock_event(ev); close(sock); break; } memset(ev->buffer,0,MEM_SIZE); size = recv(sock,ev->buffer,MEM_SIZE,0); if ( 0 == size ) { std::cout<<"client dropped"<<std::endl; release_sock_event(ev); close(sock); break; } event_set(ev->write_ev,sock,EV_WRITE,on_write,ev->buffer); event_base_set(base,ev->write_ev); event_add(ev->write_ev,NULL); } while(0); }
void do_tcp_read(int sock, short event, void* arg) { int size; struct sock_ev* ev = (struct sock_ev*)arg; size = recv(sock, ev->buffer+ev->offset, MAX_PACKET_LEN-ev->offset, 0); if (size == 0) { release_sock_event(ev); close(sock); return; } ev->offset += size; if((ev->offset>7)&& ev->read_data_flag==0) { //读取长度 ev->read_data_flag = 1; sscanf(ev->buffer, "%d\n", &ev->data_len); ev->data_len=ev->data_len-1; } else if((ev->offset>=(ev->data_len+7))&&(ev->read_data_flag==1)) { rcvbuf_t* rcvbuf = (rcvbuf_t*)MALLOC(rcvbuf_t, 1); rcvbuf->buffer = ev->buffer; rcvbuf->data_len = ev->data_len; rcvbuf->offset = ev->offset; ev->buffer = (char*)malloc(MAX_PACKET_LEN); //缓冲区中遗留的部分 ev->offset = rcvbuf->offset-rcvbuf->data_len-7; memcpy(ev->buffer,rcvbuf->buffer+rcvbuf->data_len+7,ev->offset); ev->read_data_flag = 0; //解压缩 pthread_t pt_uzrecv; pthread_create(&pt_uzrecv, NULL, uzrecv, rcvbuf); } else if(ev->offset>MAX_PACKET_LEN) { release_sock_event(ev); close(sock); return; } }
void on_read(int sock,short event,void* arg){ struct sock_ev* ev =(struct sock_ev*)arg; char buf[1024] = {0}; int size = recv(sock,buf,1024,0); if(size == 0){ release_sock_event(ev); printf("read error\n"); return ; } printf("recv:%s\n",buf); }
void on_read(int sock, short event, void* arg) { struct event* write_ev; int size; struct sock_ev* ev = (struct sock_ev*)arg; ev->buffer = (char*)malloc(MEM_SIZE); bzero(ev->buffer, MEM_SIZE); size = recv(sock, ev->buffer, MEM_SIZE, 0); printf("receive data:%s, size:%d\n", ev->buffer, size); if (size == 0) { release_sock_event(ev); close(sock); return; } event_set(ev->write_ev, sock, EV_WRITE, on_write, ev->buffer); event_base_set(base, ev->write_ev); event_add(ev->write_ev, NULL); }
void on_read(int sock, short event, void* arg) { struct event* write_ev; int size; struct sock_ev* ev = (struct sock_ev*)arg; ev->buffer = (char*)malloc(MEM_SIZE); bzero(ev->buffer, MEM_SIZE); // 5. recv: size = recv(sock, ev->buffer, MEM_SIZE, 0); printf("receive data:%s, size:%d\n", ev->buffer, size); if (size == 0) { // 返回0标志对方已经关闭了连接,因此这个时候就没必要继续监听该套接口上的事件, // 由于EV_READ在on_accept函数里是用EV_PERSIST参数注册的,因此要显示的调用event_del函数取消对该事件的监听。 release_sock_event(ev); close(sock); return; } event_set(ev->write_ev, sock, EV_WRITE, on_write, ev->buffer); event_base_set(base, ev->write_ev); event_add(ev->write_ev, NULL); }
void gmsvproto_sv_callback(int sock, short event, void* arg) { struct event* write_ev; int size; struct sock_ev* ev = (struct sock_ev*)arg; //初始化通信NetPacket以及内部buffer //这部分内容在如下函数中释放 //函数gmsvproto_sv.c:on_write()最后部分 ev->packet = (struct NetPacket*)malloc(sizeof(struct NetPacket)); if (ev->packet == NULL) { char string[256]; sprintf(string, "[ERROR]gmsvproto_sv.c:gmsvproto_sv_callback() malloc ev->packet failed!\n"); LogWrite(LT_SYSTEM, string); printf(string); } ev->packet->m_buffer = (unsigned char*)malloc(DEFAULT_SIZE); if (ev->packet->m_buffer == NULL) { char string[256]; sprintf(string, "[ERROR]gmsvproto_sv.c:gmsvproto_sv_callback() malloc ev->packet->m_buffer failed!\n"); LogWrite(LT_SYSTEM, string); printf(string); } bzero(ev->packet->m_buffer, DEFAULT_SIZE); ev->packet->opcode = 0; ev->packet->m_readPos = 0; ev->packet->m_writePos = 0; ev->packet->m_buffersize = DEFAULT_SIZE; //接受服务器数据 size = recv(sock, ev->packet->m_buffer, DEFAULT_SIZE, 0); if (size == -1) { if (errno == 104) { //暂时忽略104 Connection reset by peer //因为目前客户端断开连接会收到这个消息 //不处理会导致服务器崩溃 return; } } if (size == 0) { //客户端断开连接 //这里需要处理断开连接的处理 closePlayerSocketBySockid(sock); } printf("sock = %d, receive data:%s, size:%d\n",sock, ev->packet->m_buffer, size); //获取数据包的长度 memcpy(&(ev->packet->m_writePos), ev->packet->m_buffer + sizeof(uint16_t), sizeof(uint16_t)); if (size == 0) { release_sock_event(ev); close(sock); printf("sock = %d, closed!\n", sock); return; } event_set(ev->write_ev, sock, EV_WRITE, on_write, ev); event_base_set(base, ev->write_ev); event_add(ev->write_ev, NULL); }