]> git.stg.codes - stg.git/blobdiff - libs/pinger/include/stg/pinger.h
Port to CMake, get rid of os_int.h.
[stg.git] / libs / pinger / include / stg / pinger.h
diff --git a/libs/pinger/include/stg/pinger.h b/libs/pinger/include/stg/pinger.h
new file mode 100644 (file)
index 0000000..26f5f4b
--- /dev/null
@@ -0,0 +1,135 @@
+ /*
+ $Revision: 1.8 $
+ $Date: 2008/05/10 11:59:53 $
+ $Author: nobunaga $
+ */
+
+#ifndef PINGER_H
+#define PINGER_H
+
+#include <ctime>
+#include <string>
+#include <list>
+#include <map>
+
+#ifdef LINUX
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/ip_icmp.h>
+#endif
+
+#if defined (FREE_BSD) || defined(DARWIN)
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/ip_var.h>
+#include <arpa/inet.h>
+#endif
+
+#include <cstdint>
+
+//-----------------------------------------------------------------------------
+struct ICMP_HDR
+{
+uint8_t       type;
+uint8_t       code;
+uint16_t      checksum;
+union
+    {
+    struct
+        {
+        uint16_t    id;
+        uint16_t    sequence;
+        } echo;
+    uint32_t  gateway;
+    struct
+        {
+        uint16_t    unused;
+        uint16_t    mtu;
+        } frag;
+    } un;
+};
+//-----------------------------------------------------------------------------
+struct IP_HDR
+{
+    uint8_t     ihl:4,
+                version:4;
+    uint8_t     tos;
+    uint16_t    tot_len;
+    uint16_t    id;
+    uint16_t    frag_off;
+    uint8_t     ttl;
+    uint8_t     protocol;
+    uint16_t    check;
+    uint32_t    saddr;
+    uint32_t    daddr;
+};
+//-----------------------------------------------------------------------------
+struct PING_IP_TIME
+{
+uint32_t    ip;
+time_t      pingTime;
+};
+//-----------------------------------------------------------------------------
+
+#define PING_DATA_LEN   (64)
+//-----------------------------------------------------------------------------
+struct PING_MESSAGE
+{
+    ICMP_HDR    hdr;
+    char        msg[PING_DATA_LEN];
+};
+//-----------------------------------------------------------------------------
+class STG_PINGER
+{
+public:
+    typedef std::multimap<uint32_t, time_t> PingIPs;
+    typedef PingIPs::size_type SizeType;
+
+            explicit STG_PINGER(time_t delay = 15);
+            ~STG_PINGER();
+
+    int     Start();
+    int     Stop();
+    void    AddIP(uint32_t ip);
+    void    DelIP(uint32_t ip);
+    SizeType GetPingIPNum() const { return pingIP.size(); }
+    void    PrintAllIP();
+    int     GetIPTime(uint32_t ip, time_t * t) const;
+    void    SetDelayTime(time_t d) { delay = d; }
+    time_t  GetDelayTime() const { return delay; }
+    const std::string & GetStrError() const { return errorStr; }
+
+private:
+    uint16_t    PingCheckSum(void * data, int len);
+    int         SendPing(uint32_t ip);
+    uint32_t    RecvPing();
+    void        RealAddIP();
+    void        RealDelIP();
+
+    static void * RunSendPing(void * d);
+    static void * RunRecvPing(void * d);
+
+    time_t      delay;
+    bool        nonstop;
+    bool        isRunningRecver;
+    bool        isRunningSender;
+    int         sendSocket;
+    int         recvSocket;
+    pthread_t   sendThread;
+    pthread_t   recvThread;
+
+    PING_MESSAGE pmSend;
+    uint32_t    pid;
+
+    std::string errorStr;
+
+    std::multimap<uint32_t, time_t> pingIP;
+    std::list<uint32_t>          ipToAdd;
+    std::list<uint32_t>          ipToDel;
+
+    mutable pthread_mutex_t mutex;
+};
+//-----------------------------------------------------------------------------
+#endif