]> git.stg.codes - stg.git/blob - stglibs/pinger.lib/pinger.h
Produce debug output only if SMUX_DEBUG is defined
[stg.git] / stglibs / pinger.lib / 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 (FREE_BSD5)
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 "stg/os_int.h"
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             STG_PINGER(time_t delay = 15);
88             ~STG_PINGER();
89
90     int     Start();
91     int     Stop();
92     void    AddIP(uint32_t ip);
93     void    DelIP(uint32_t ip);
94     int     GetPingIPNum() const;
95     void    PrintAllIP();
96     int     GetIPTime(uint32_t ip, time_t * t) const;
97     void    SetDelayTime(time_t d) { delay = d; }
98     time_t  GetDelayTime() const { return delay; }
99     const std::string & GetStrError() const { return errorStr; }
100
101 private:
102     uint16_t    PingCheckSum(void * data, int len);
103     int         SendPing(uint32_t ip);
104     uint32_t    RecvPing();
105     void        RealAddIP();
106     void        RealDelIP();
107
108     static void * RunSendPing(void * d);
109     static void * RunRecvPing(void * d);
110
111     int         delay;
112     bool        nonstop;
113     bool        isRunningRecver;
114     bool        isRunningSender;
115     int         sendSocket;
116     int         recvSocket;
117     pthread_t   sendThread;
118     pthread_t   recvThread;
119
120     PING_MESSAGE pmSend;
121     uint32_t    pid;
122
123     std::string errorStr;
124
125     std::multimap<uint32_t, time_t> pingIP;
126     std::list<uint32_t>          ipToAdd;
127     std::list<uint32_t>          ipToDel;
128
129     mutable pthread_mutex_t mutex;
130 };
131 //-----------------------------------------------------------------------------
132 #endif