Пример #1
0
bool 
ox_buffer_write(struct buffer_s* self, const char* data, size_t len)
{
    bool write_ret = true;

    if(ox_buffer_getwritevalidcount(self) >= len)
    {
        /*  直接写入    */
        memcpy(ox_buffer_getwriteptr(self), data, len);
        ox_buffer_addwritepos(self, len);
    }
    else
    {
        size_t left_len = self->data_len - ox_buffer_getreadvalidcount(self);
        if(left_len >= len)
        {
            ox_buffer_adjustto_head(self);
            ox_buffer_write(self, data, len);
        }
        else
        {
            write_ret = false;
        }
    }

    return write_ret;
}
Пример #2
0
void SSDBProtocolRequest::appendBlock(const char* data, size_t len)
{
    if (ox_buffer_getwritevalidcount(m_request) < len)
    {
        buffer_s* temp = ox_buffer_new(ox_buffer_getsize(m_request) + len);
        memcpy(ox_buffer_getwriteptr(temp), ox_buffer_getreadptr(m_request), ox_buffer_getreadvalidcount(m_request));
        ox_buffer_addwritepos(temp, ox_buffer_getreadvalidcount(m_request));
        ox_buffer_delete(m_request);
        m_request = temp;
    }

    ox_buffer_write(m_request, data, len);
}
Пример #3
0
static void
connection_sendmsg_handle(struct connection_s* self)
{
    if(self->status == connection_establish)
    {
        struct buffer_s* send_buffer = self->send_buffer;
        int send_len = 0;

proc_send:
        {
            struct rwlist_s* free_sendmsg_list = self->free_sendmsg_list;
            struct rwlist_s* sendmsg_list = self->sendmsg_list;
            struct msg_data_s** msg = NULL;

            while((msg = (struct msg_data_s**)ox_rwlist_front(sendmsg_list, 0)) != NULL)
            {
                struct msg_data_s* data = *msg;

                /*  只处理发送数据的消息  */
                if(data->type == send_msg_data)
                {
                    /*  先写入内置缓冲区    */
                    if(ox_buffer_write(send_buffer, data->data, data->len))
                    {
                        assert(data->msg_id == self->last_send_msg_id+1);
                        self->last_send_msg_id++;

                        ox_rwlist_pop(sendmsg_list, 0);
                        ox_rwlist_push(free_sendmsg_list, msg);
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    ox_rwlist_pop(sendmsg_list, 0);
                    ox_rwlist_push(free_sendmsg_list, msg);
                }
            }
        }

        send_len = ox_buffer_getreadvalidcount(send_buffer);
        if(send_len > 0)
        {
            /*  发送内置缓冲区 */
            int ret_len = send(self->fd, ox_buffer_getreadptr(send_buffer), send_len, 0);
            if(ret_len > 0)
            {
                ox_buffer_addreadpos(send_buffer, ret_len);

                if(send_len == ret_len)
                {
                    /*  如果发送全部成功,则继续处理发送消息队列中的消息    */
                    goto proc_send;
                }
            }
            else if(ret_len == SOCKET_ERROR)
            {
                if(S_EWOULDBLOCK == sErrno)
                {
                    self->writable = false;
                    ox_fdset_add(self->fdset, self->fd, WriteCheck);
                }
            }
        }
    }
}