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