]> git.stg.codes - stg.git/blob - libs/pinger/include/stg/pinger.h
Add async pool (to replace EVENT_LOOP).
[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 #ifndef PINGER_H
8 #define PINGER_H
9
10 #include <ctime>
11 #include <string>
12 #include <list>
13 #include <map>
14
15 #ifdef LINUX
16 #include <sys/types.h>
17 #include <sys/socket.h>
18 #include <netinet/ip_icmp.h>
19 #endif
20
21 #if defined (FREE_BSD) || defined(DARWIN)
22 #include <netinet/in.h>
23 #include <netinet/in_systm.h>
24 #include <netinet/ip.h>
25 #include <netinet/ip_icmp.h>
26 #include <netinet/ip_var.h>
27 #include <arpa/inet.h>
28 #endif
29
30 #include <cstdint>
31
32 //-----------------------------------------------------------------------------
33 struct ICMP_HDR
34 {
35 uint8_t       type;
36 uint8_t       code;
37 uint16_t      checksum;
38 union
39     {
40     struct
41         {
42         uint16_t    id;
43         uint16_t    sequence;
44         } echo;
45     uint32_t  gateway;
46     struct
47         {
48         uint16_t    unused;
49         uint16_t    mtu;
50         } frag;
51     } un;
52 };
53 //-----------------------------------------------------------------------------
54 struct IP_HDR
55 {
56     uint8_t     ihl:4,
57                 version:4;
58     uint8_t     tos;
59     uint16_t    tot_len;
60     uint16_t    id;
61     uint16_t    frag_off;
62     uint8_t     ttl;
63     uint8_t     protocol;
64     uint16_t    check;
65     uint32_t    saddr;
66     uint32_t    daddr;
67 };
68 //-----------------------------------------------------------------------------
69 struct PING_IP_TIME
70 {
71 uint32_t    ip;
72 time_t      pingTime;
73 };
74 //-----------------------------------------------------------------------------
75
76 #define PING_DATA_LEN   (64)
77 //-----------------------------------------------------------------------------
78 struct PING_MESSAGE
79 {
80     ICMP_HDR    hdr;
81     char        msg[PING_DATA_LEN];
82 };
83 //-----------------------------------------------------------------------------
84 class STG_PINGER
85 {
86 public:
87     typedef std::multimap<uint32_t, time_t> PingIPs;
88     typedef PingIPs::size_type SizeType;
89
90             explicit STG_PINGER(time_t delay = 15);
91             ~STG_PINGER();
92
93     int     Start();
94     int     Stop();
95     void    AddIP(uint32_t ip);
96     void    DelIP(uint32_t ip);
97     SizeType GetPingIPNum() const { return pingIP.size(); }
98     void    PrintAllIP();
99     int     GetIPTime(uint32_t ip, time_t * t) const;
100     void    SetDelayTime(time_t d) { delay = d; }
101     time_t  GetDelayTime() const { return delay; }
102     const std::string & GetStrError() const { return errorStr; }
103
104 private:
105     uint16_t    PingCheckSum(void * data, int len);
106     int         SendPing(uint32_t ip);
107     uint32_t    RecvPing();
108     void        RealAddIP();
109     void        RealDelIP();
110
111     static void * RunSendPing(void * d);
112     static void * RunRecvPing(void * d);
113
114     time_t      delay;
115     bool        nonstop;
116     bool        isRunningRecver;
117     bool        isRunningSender;
118     int         sendSocket;
119     int         recvSocket;
120     pthread_t   sendThread;
121     pthread_t   recvThread;
122
123     PING_MESSAGE pmSend;
124     uint32_t    pid;
125
126     std::string errorStr;
127
128     std::multimap<uint32_t, time_t> pingIP;
129     std::list<uint32_t>          ipToAdd;
130     std::list<uint32_t>          ipToDel;
131
132     mutable pthread_mutex_t mutex;
133 };
134 //-----------------------------------------------------------------------------
135 #endif