c++基础应用
一.udp通信类封装
1.介绍:在实际项目应用中,我们经常会用到udp通信,最好的方法就是将其封装成特有的类,放在utils工具类中或者放在第三方基类base库中;udp通信主要的功能就是data的收与发,按照socket接口要求提供所需的ip\端口\组播地址等即可构建.
2.类的特色:
- 地址使用string传入;
- 发送使用队列逐次发送
- 收到数据的处理,放到具体的子类中实现;
class ABI_EXPORT CMyUdpClientSink
{
public:
virtual ~CMyUdpClientSink(){}
virtual void on_udp_client_connected(int64_t id) = 0;
virtual void on_udp_client_disconnected(int64_t id) = 0;
virtual void on_udp_data(int64_t id, std::vector<unsigned char>& buf) = 0;
};
class ABI_EXPORT CMyUdpClient : public plt::CRefAble
{
public:
CUdpClient(CMyUdpClientSink *sink, int64_t id, std::string ip, int32_t port, int32_t local_port, std::string multicast_addr = "");
virtual ~CUdpClient();
public:
void heartbeat(bool& busy,int32_t select_milli_seconds=0);
void sendData(std::vector<unsigned char>& buf);
protected:
bool doInit();
bool doUninit();
bool doConnect();
void doCheck(bool* can_read, bool* can_write, bool* is_error, int32_t select_milli_seconds);
bool doRead();
bool doWrite();
protected:
CUdpClientSink *m_sink;
uint64_t m_id;
std::string m_ip;
int32_t m_port;
int32_t m_local_port;
std::string m_multicast;
typedef enum{
STATUS_IDLE,
STATUS_CONNECTED,
STATUS_DISCONNECTED,
}CStatus;
CStatus m_status;
SOCKET m_socket;
sockaddr_in m_svr_addr;
fd_set m_fds_read;
fd_set m_fds_write;
fd_set m_fds_error;
char m_recv_buf[65535];
std::list<std::vector<unsigned char> > m_to_send_datas;
std::vector<unsigned char> m_sending_data;
std::vector<unsigned char>::size_type m_sending_start_pos;
};