]> git.stg.codes - stg.git/blob - libs/pinger/include/stg/pinger.h
b726a751e015a67b7691a384f82e8b9fe8a75158
[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 <list>
11 #include <map>
12 #include <ctime>
13 #include <cstdint>
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 //-----------------------------------------------------------------------------
31 struct ICMP_HDR
32 {
33     uint8_t       type;
34     uint8_t       code;
35     uint16_t      checksum;
36     union
37     {
38         struct
39         {
40             uint16_t    id;
41             uint16_t    sequence;
42         } echo;
43         uint32_t  gateway;
44         struct
45         {
46             uint16_t    unused;
47             uint16_t    mtu;
48         } frag;
49     } un;
50 };
51 //-----------------------------------------------------------------------------
52 struct IP_HDR
53 {
54     uint8_t     ihl:4,
55                 version:4;
56     uint8_t     tos;
57     uint16_t    tot_len;
58     uint16_t    id;
59     uint16_t    frag_off;
60     uint8_t     ttl;
61     uint8_t     protocol;
62     uint16_t    check;
63     uint32_t    saddr;
64     uint32_t    daddr;
65 };
66 //-----------------------------------------------------------------------------
67 struct PING_IP_TIME
68 {
69     uint32_t    ip;
70     time_t      pingTime;
71 };
72 //-----------------------------------------------------------------------------
73
74 #define PING_DATA_LEN   (64)
75 //-----------------------------------------------------------------------------
76 struct PING_MESSAGE
77 {
78     ICMP_HDR    hdr;
79     char        msg[PING_DATA_LEN];
80 };
81 //-----------------------------------------------------------------------------
82 class STG_PINGER
83 {
84     public:
85         typedef std::multimap<uint32_t, time_t> PingIPs;
86         typedef PingIPs::size_type SizeType;
87
88                 explicit STG_PINGER(time_t delay = 15);
89                 ~STG_PINGER();
90
91         int     Start();
92         int     Stop();
93         void    AddIP(uint32_t ip);
94         void    DelIP(uint32_t ip);
95         SizeType GetPingIPNum() const { return m_pingIP.size(); }
96         void    PrintAllIP();
97         int     GetIPTime(uint32_t ip, time_t * t) const;
98         void    SetDelayTime(time_t d) { m_delay = d; }
99         time_t  GetDelayTime() const { return m_delay; }
100         const std::string & GetStrError() const { return m_errorStr; }
101
102     private:
103         uint16_t    PingCheckSum(void * data, int len);
104         int         SendPing(uint32_t ip);
105         uint32_t    RecvPing();
106         void        RealAddIP();
107         void        RealDelIP();
108
109         static void * RunSendPing(void * d);
110         static void * RunRecvPing(void * d);
111
112         time_t      m_delay;
113         bool        m_nonstop;
114         bool        m_isRunningRecver;
115         bool        m_isRunningSender;
116         int         m_sendSocket;
117         int         m_recvSocket;
118         pthread_t   m_sendThread;
119         pthread_t   m_recvThread;
120
121         PING_MESSAGE m_pmSend;
122         uint32_t    m_pid;
123
124         std::string m_errorStr;
125
126         std::multimap<uint32_t, time_t> m_pingIP;
127         std::list<uint32_t>          m_ipToAdd;
128         std::list<uint32_t>          m_ipToDel;
129
130         mutable pthread_mutex_t m_mutex;
131 };