/** * Copyright (C) 2015-2018 * All rights reserved. * * AUTHOR(S) * Zheng Shuxin * E-mail: zhengshuxin@qiyi.com * * VERSION * Wed 30 May 2017 11:33:48 AM CST */ #pragma once #include #include "sock_addr.h" class udp_sock; /** * UDP 数据包类 */ class udp_pkt { public: /** * 构造函数 * @param size {size_t} 指定了每个 udp 数据包的最大值 */ udp_pkt(size_t size = 1460); ~udp_pkt(void); /** * 设置要发送的数据包数据 * @param data {const void*} 数据包地址,非 NULL * @param len {size_t} 数据包大小,须 > 0 且 <= 构造函数里设置的最大值 * @return {bool} 参数非法时返回 false */ bool set_data(const void* data, size_t len); /** * 设置数据包接收端地址,本方法仅用在客户端方式下 * @param addr {const char*} udp 目标地址 * @return {bool} 返回 false 表示地址非法 */ bool set_peer(const char* addr); /** * 获得读到的数据包内容,需先通过 get_dlen 获得数据大小 * @return {void*} */ void* get_data(void) const { return iov_.iov_base; } /** * 获得读到的数据包大小 * @return {size_t} */ size_t get_dlen(void) const { return iov_.iov_len; } /** * 当读到数据包后,本方法返回发送端的端口号 * @return {int} 返回值 < 0 表示出错 */ int get_port(void) const; /** * 当读到数据包后,本方法返回发送端的 IP 地址 * @return {const char*} 返回 NULL 表示无法获得发送端地址 */ const char* get_ip(void) const; private: friend class udp_sock; struct iovec iov_; // 存放收/发的数据地址及长度 const size_t size_; // 构造时设定后不能再修改 SOCK_ADDR addr_; // 源地址 socklen_t addr_len_; char ipbuf_[64]; }; /** * UDP 数据包集合对象 */ class udp_pkts { public: /** * 构造函数 * @param max {size_t} 指定接收 UDP 时最大的接收数据包个数,该值需 > 0 */ udp_pkts(size_t max); ~udp_pkts(void); /** * 获得指针下标的数据包对象 * @param i {size_t} 下标值 * @return {udp_pkt*} 返回 NULL 表示下标越界 */ udp_pkt* operator[](size_t i); /** * 获得已读到的或将要发送的数据包个数 * @return {size_t} */ size_t get_npkt(void) const { return npkt_; } /** * 设置据包个数,应用可调用此方法设置要发送的数据包个数; * upd_sock 类在读到数据时也会通过此方法设置读到数据包个数 * @param n {size_t} 据包个数,该值不能超过构造时指定的最大值 */ void set_npkt(size_t n); protected: friend class udp_sock; std::vector& get_pkts(void) { return pkts_; } private: std::vector pkts_; size_t max_; size_t npkt_; };