X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8c6fa3fbaccc22127280bf77a48fab5a3ee0716e..46b0747592074017ff0ea4b33d4a7194235886e5:/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 index 00000000..26f5f4b3 --- /dev/null +++ b/libs/pinger/include/stg/pinger.h @@ -0,0 +1,135 @@ + /* + $Revision: 1.8 $ + $Date: 2008/05/10 11:59:53 $ + $Author: nobunaga $ + */ + +#ifndef PINGER_H +#define PINGER_H + +#include +#include +#include +#include + +#ifdef LINUX +#include +#include +#include +#endif + +#if defined (FREE_BSD) || defined(DARWIN) +#include +#include +#include +#include +#include +#include +#endif + +#include + +//----------------------------------------------------------------------------- +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 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 pingIP; + std::list ipToAdd; + std::list ipToDel; + + mutable pthread_mutex_t mutex; +}; +//----------------------------------------------------------------------------- +#endif