Beispiel #1
0
void
libevent_cb_node_onrecv_data(int socket, short event, void* arg){
    struct fs_node* node = (struct fs_node*)arg;
    
    ssize_t nread  = 0;
    BYTE buff[RECV_BUFF_MAX];
    
    
    do{
        fs_zero(buff, RECV_BUFF_MAX);
        nread = recv(socket, buff, RECV_BUFF_MAX, 0);
        
        
        if(nread > 0){
            fs_node_recv_data(node, buff, nread);
        }else{
            if(nread == -1){
                if(errno == EAGAIN){
                    break;
                }else{
                    fprintf(stderr, "%d on recv_data error[%d] \n", node->node_id, errno);
                    fs_node_shudown(node);
                    return;
                }
            }else{
                fs_node_shudown(node);
                return;
            }
        }
        
        
    } while (fs_true);
    
    
}
Beispiel #2
0
void
libevent_cb_node_onsend_data(int socket, short event, void* arg){
    
    struct fs_node* node = (struct fs_node*)arg;
    
    pthread_mutex_lock(&node->write_mutex);
    
    if(node->send_buffer == NULL)
    {
        event_del(node->write_ev);
        pthread_mutex_unlock(&node->write_mutex);
        return;
    }
    
    void* data = (void*)fs_output_stream_get_dataptr(node->send_buffer);
    size_t len = fs_output_stream_get_len(node->send_buffer);
    ssize_t nsize = len;
    ssize_t nwrite = 0;
    ssize_t nwrited = 0;
    while (nsize > 0) {
        nwrite = send(node->socket, (BYTE*)data + (len - nsize), nsize, 0);
        if(nwrite > 0){
            nwrited += nwrite;
        }
        if(nwrite < nsize){
            if(nwrite == -1){
                if(errno == EAGAIN)
                {
                    break;
                }else{
                    fprintf(stderr, "%d on send_data error = %d \n", node->node_id, errno);
                    
                    pthread_mutex_unlock(&node->write_mutex);
                    fs_node_shudown(node);
                    return;
                }
            }
        }
        nsize -= nwrite;
    }
    
    fs_output_stream_sub(node->send_buffer, nwrited, len - nwrited);

    
    len = fs_output_stream_get_len(node->send_buffer);
    if(len == 0){
        event_del(node->write_ev);
    }
    
    pthread_mutex_unlock(&node->write_mutex);


}
Beispiel #3
0
VALUE
rb_Node_close(VALUE self){
    struct fs_node* node = NULL;
    Data_Get_Struct(self, struct fs_node, node);
    if(node) {
        fs_node_set_script_id(node, Qnil);
        if(!fs_node_is_closed(node)){
            fs_node_shudown(node);
        }
        return Qtrue;
    }else{
        rb_raise(rb_eRuntimeError, "NODE is NULL");
    }
    return Qfalse;
}