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; }
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); }
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); } } } } }