一个C++实用的buffer类

/*
* @brief Safely Buffer
*/
class Buffer {
public:
    Buffer()
        : _data(nullptr),
          _size(0) {

    }

    Buffer(const byte* data, size_t size) : _data(nullptr), _size(0) {
        if (!data || !size) {
            return;
        }

        allocBuffer(size);
        memcpy(_data, data, size);
    }

    Buffer(size_t size) : _data(nullptr), _size(0)  {
        allocBuffer(size);
    }

    Buffer(const Buffer& buffer) : _data(nullptr), _size(0)  {
        *this = buffer;
    }

    Buffer(const Buffer* pbuffer) : _data(nullptr), _size(0)  {
        if (!pbuffer) {
            return;
        }

        *this = *pbuffer;
    }

    ~Buffer() {
        releaseBuffer();
    }

    Buffer& assign(const byte* data, size_t size) {
        allocBuffer(size);

        if (data && size > 0) {
            memcpy(_data, data, size);
        }

        return *this;
    }

    byte* data() const {
        return _data;
    }

    size_t size() const {
        return _size;
    }

    size_t length() const {
        return size();
    }

    void resize(size_t size) {
        allocBuffer(size);
    }

    byte& operator[](size_t pos) const {
		assert(pos < _size);
        return _data[pos];
    }

    Buffer& operator=(const Buffer& right) {
        allocBuffer(right.size());

        if (!right.empty()) {
            memcpy(_data, right.data(), _size);
        }

        return *this;
    }

    bool empty() const {
        return (!_data && _size == 0);
    }

    void clear(){
        if(!_data || 0 == _size){
            return;
        }

        memset(_data, 0, _size);
    }

    void release() {
        releaseBuffer();
    }

    bool operator==(const Buffer& right) const {
        if (_size == right.size()) {
            for (size_t i = 0; i < _size; i++) {
                if ((*this)[i] != right[i]) {
                    return false;
                }
            }

            return true;
        }

        return false;
    }

private:
    void allocBuffer(size_t size) {
        releaseBuffer();
        _size = size;

        if (size) {
            _data = new byte[_size];

            if (!_data) {
                throw std::bad_alloc();
            }

            memset(_data, 0, _size);
        }
    }

    void releaseBuffer() {
        SAFE_DELETE_ARRAY(_data);
        _size = 0;
    }

private:
    byte* _data;
    size_t _size;
};

用来替代char*,方便且安全

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C语言是一种强大而灵活的编程语言,可以用来实现各种功能。在这里,假设我们想要创建一个实现UDP通信的实例。 首先,我们需要引入C语言的标准库中的头文件`<stdio.h>`和`<stdlib.h>`,以便进行输入输出和内存分配。 接下来,我们定义一个UDP,其中包含了UDP通信所需的各种属性和方法。首先,我们需要定义一个套接字(socket)以进行通信。使用C语言的网络编程库`<sys/socket.h>`,我们可以调用`socket()`函数来创建一个套接字,并指定协议族为IPv4和传输型为UDP。 然后,我们需要定义一些基本信息,例如本地主机的IP地址和端口号,以及远程主机的IP地址和端口号。 在的方法中,我们可以定义发送和接收数据的函数。发送函数的主要功能是将数据发送到指定的远程主机和端口上。接收函数则负责从本地套接字接收来自远程主机的数据,并将其打印出来。在这里,我们可以使用`sendto()`和`recvfrom()`函数来进行数据的发送和接收。 最后,在主函数中,我们可以创建该UDP的实例,并使用该的方法来发送和接收数据。 总结起来,通过使用C语言的标准库和网络编程库,我们可以创建一个UDP的实例,并使用该实例的方法来实现UDP通信。这样就可以在C语言中编写代码,实现UDP通信的功能。 ### 回答2: C语言中实现UDP的示例代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUFFER_SIZE 1024 typedef struct { int socket_fd; struct sockaddr_in server_addr; } UDP; void udp_init(UDP *udp, const char *server_ip, int server_port) { udp->socket_fd = socket(AF_INET, SOCK_DGRAM, 0); if (udp->socket_fd == -1) { perror("socket creation failed"); exit(1); } memset(&(udp->server_addr), 0, sizeof(udp->server_addr)); udp->server_addr.sin_family = AF_INET; udp->server_addr.sin_addr.s_addr = inet_addr(server_ip); udp->server_addr.sin_port = htons(server_port); } void udp_send(UDP *udp, const char *message) { int n = sendto(udp->socket_fd, message, strlen(message), 0, (const struct sockaddr *)&(udp->server_addr), sizeof(udp->server_addr)); if (n == -1) { perror("sendto failed"); exit(1); } } void udp_receive(UDP *udp) { char buffer[BUFFER_SIZE]; int len = sizeof(udp->server_addr); int n = recvfrom(udp->socket_fd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&(udp->server_addr), &len); if (n == -1) { perror("recvfrom failed"); exit(1); } buffer[n] = '\0'; printf("Received: %s\n", buffer); } void udp_close(UDP *udp) { close(udp->socket_fd); } int main() { UDP udp; udp_init(&udp, "127.0.0.1", 8888); udp_send(&udp, "Hello, UDP Server!"); udp_receive(&udp); udp_close(&udp); return 0; } ``` 这是一个基于C语言的UDP实例,它通过`udp_init`函数初始化UDP并指定服务器的IP地址和端口号。使用`udp_send`函数可以将消息发送给服务器,使用`udp_receive`函数可以接收来自服务器的消息。最后通过`udp_close`函数关闭UDP实例。以上是一个简单的UDP实现示例,可以根据实际需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值