]> git.stg.codes - stg.git/blob - libs/pinger/include/stg/pinger.h
Use std::lock_guard instead of STG_LOCKER.
[stg.git] / libs / pinger / include / stg / pinger.h
1  /*
2  $Revision: 1.8 $
3  $Date: 2008/05/10 11:59:53 $
4  $Author: nobunaga $
5  */
6
7 #pragma once
8
9 #include <string>
10 #include <map>
11 #include <mutex>
12 #pragma GCC diagnostic push
13 #pragma GCC diagnostic ignored "-Wshadow"
14 #include <jthread.hpp>
15 #pragma GCC diagnostic pop
16 #include <ctime>
17 #include <cstdint>
18
19 #ifdef LINUX
20 #include <sys/types.h>
21 #include <sys/socket.h>
22 #include <netinet/ip_icmp.h>
23 #endif
24
25 #if defined (FREE_BSD) || defined(DARWIN)
26 #include <netinet/in.h>
27 #include <netinet/in_systm.h>
28 #include <netinet/ip.h>
29 #include <netinet/ip_icmp.h>
30 #include <netinet/ip_var.h>
31 #include <arpa/inet.h>
32 #endif
33
34 //-----------------------------------------------------------------------------
35 struct ICMP_HDR
36 {
37     uint8_t       type;
38     uint8_t       code;
39     uint16_t      checksum;
40     union
41     {
42         struct
43         {
44             uint16_t    id;
45             uint16_t    sequence;
46         } echo;
47         uint32_t  gateway;
48         struct
49         {
50             uint16_t    unused;
51             uint16_t    mtu;
52         } frag;
53     } un;
54 };
55 //-----------------------------------------------------------------------------
56 struct IP_HDR
57 {
58     uint8_t     ihl:4,
59                 version:4;
60     uint8_t     tos;
61     uint16_t    tot_len;
62     uint16_t    id;
63     uint16_t    frag_off;
64     uint8_t     ttl;
65     uint8_t     protocol;
66     uint16_t    check;
67     uint32_t    saddr;
68     uint32_t    daddr;
69 };
70 //-----------------------------------------------------------------------------
71 struct PING_IP_TIME
72 {
73     uint32_t    ip;
74     time_t      pingTime;
75 };
76 //-----------------------------------------------------------------------------
77
78 #define PING_DATA_LEN   (64)
79 //-----------------------------------------------------------------------------
80 struct PING_MESSAGE
81 {
82     ICMP_HDR    hdr;
83     char        msg[PING_DATA_LEN];
84 };
85 //-----------------------------------------------------------------------------
86 class STG_PINGER
87 {
88     public:
89         using PingIPs = std::multimap<uint32_t, time_t>;
90
91                 explicit STG_PINGER(unsigned delay = 15);
92
93         bool    Start();
94         bool    Stop();
95         void    AddIP(uint32_t ip);
96         void    DelIP(uint32_t ip);
97         auto    GetPingIPNum() const { std::lock_guard lock(m_mutex); return m_pingIPs.size(); }
98         void    PrintAllIP();
99         bool    GetIPTime(uint32_t ip, time_t& t) const;
100         void    SetDelayTime(unsigned d) { m_delay = d; }
101         unsigned GetDelayTime() const { return m_delay; }
102         const std::string& GetStrError() const { return m_errorStr; }
103
104     private:
105         uint16_t    PingCheckSum(const void* data, int len);
106         bool        SendPing(uint32_t ip);
107         uint32_t    RecvPing();
108
109         void RunSendPing(std::stop_token token);
110         void RunRecvPing(std::stop_token token);
111
112         mutable std::mutex m_mutex;
113
114         unsigned    m_delay;
115         bool        m_isRunningRecver;
116         bool        m_isRunningSender;
117         int         m_sendSocket;
118         int         m_recvSocket;
119         std::jthread m_sendThread;
120         std::jthread m_recvThread;
121
122         PING_MESSAGE m_pmSend;
123         uint32_t    m_pid;
124
125         std::string m_errorStr;
126
127         PingIPs m_pingIPs;
128 };