Пример #1
0
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);
}
Пример #2
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;
    }
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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);
}