static void server_ondata(tcp_connection_t* connection, buffer_t* buffer, void* userdata) { /* 默认读取数据之后不处理,直接丢弃 * 所以需要使用者在on_connection中自行将数据接受callback改为自己的处理函数 */ buffer_retrieveall(buffer); return; }
static int tcp_connection_sendInLoop(tcp_connection_t* connection, const void* data, unsigned size) { inetaddr_t *peer_addr = &connection->peer_addr; int fd; void* buffer_data; channel_t *channel; buffer_t* out_buffer; int written; unsigned buffer_left_data_size; struct iovec vecs[2]; int error; out_buffer = connection->out_buffer; channel = connection->channel; fd = connection->fd; buffer_left_data_size = buffer_readablebytes(out_buffer); if (buffer_left_data_size > 0) { buffer_data = buffer_peek(out_buffer); vecs[0].iov_base = buffer_data; vecs[0].iov_len = buffer_left_data_size; vecs[1].iov_base = (void*)data; vecs[1].iov_len = size; written = writev(fd, vecs, 2); if (written < 0) { error = errno; if (error != EAGAIN) { log_error("tcp_connection_sendInLoop: writev() failed, errno: %d, peer addr: %s:%u", errno, peer_addr->ip, peer_addr->port); return -1; } } else if (written == (buffer_left_data_size+size)) { /* 当前所有的数据都发送完毕,一切安好则去除EPOLLOUT事件 */ channel_clearevent(channel, EPOLLOUT); } else if (written < buffer_left_data_size) { /* out_buffer中的数据尚未发送完毕,则将本次的数据放入out_buffer后再发送 */ buffer_retrieve(out_buffer, written); buffer_append(out_buffer, data, size); channel_setevent(channel, EPOLLOUT); } else if (written < (buffer_left_data_size+size)) { buffer_retrieveall(out_buffer); buffer_append(out_buffer, ((const char*)data+written-buffer_left_data_size), ((buffer_left_data_size+size)-written)); channel_setevent(channel, EPOLLOUT); } } else { written = write(fd, data, size); if (written < 0) { log_error("tcp_connection_sendInLoop: write() failed, errno: %d, peer addr: %s:%u", errno, peer_addr->ip, peer_addr->port); return -1; } else if (written < size) { buffer_append(out_buffer, ((const char*)data+written), (size-written)); channel_setevent(channel, EPOLLOUT); } } return 0; }