⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntpsock.h

📁 linux程序
💻 H
字号:
// NtpSock.h: interface for the CNtpSock class.
//
//////////////////////////////////////////////////////////////////////
#ifndef _NTP_SOCK_H_
#define _NTP_SOCK_H_ 

#include "NtpTime.h"
#include "LogList.h"

#ifdef __Win32__
    #include <winsock2.h>
    #include "LogList.h"
    #define socklen_t int
#endif

#ifdef __REDHATLINUX__
    #include <pthread.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <arpa/inet.h>
    #include <netinet/tcp.h>
    #include <unistd.h>

    #define INVALID_SOCKET (-1)
    typedef sockaddr SOCKADDR; 
    typedef char *   LPSTR   ;  
#endif

struct NtpServerResponse
{
    int m_nLeapIndicator; //0: no warning
                          //1: last minute in day has 61 seconds
                          //2: last minute has 59 seconds
                          //3: clock not synchronized

    int m_nStratum;       //0: unspecified or unavailable
                          //1: primary reference (e.g., radio clock)
                          //2-15: secondary reference (via NTP or SNTP)
                          //16-255: reserved

    CNtpTime     m_OriginateTime;    //Time when the request was sent from the client to the SNTP server
    CNtpTime     m_ReceiveTime;      //Time when the request was received by the server
    CNtpTime     m_TransmitTime;     //Time when the server sent the request back to the client
    CNtpTime     m_DestinationTime;  //Time when the reply was received by the client
    double       m_RoundTripDelay;   //Round trip time in seconds
    double       m_LocalClockOffset; //Local clock offset relative to the server
};

//Simple wrapper class for an Ntp socket
class CNtpSocket
{
public:
    //Constructors / Destructors 
    CNtpSocket();
    ~CNtpSocket();

	int Bind(unsigned short port = 123);
    /// 允许多个Socket绑定一个IP地址 
    int ReuseAddr();
    /// 允许Socket使用发送合并的Nagle算法
    int NoDelay();
    /// 允许使用“保持活动”包
    int KeepAlive();
    /// 设置Socket发送缓存区的大小
    int SetSocketSndBufSize(unsigned int inNewSize);
    /// 设置Socket接受缓存区的大小
    int SetSocketRcvBufSize(unsigned int inNewSize);
    /// 设置Socket 阻塞/不阻塞状态
    int SetSockBlock(unsigned long blockingIO);
    /// 设置Socket是否可以传送广播数据
    int SetSockBroadcast(unsigned long broadcast);       
    /// 设置Socket是否可以支持多播数据
    int SetSockMulticast(char *multicastAddr, bool isTrue);       
	/// 
	int SetLoopBack(int lb);
	
	int SetIPLoop();

	/// 建立连接

		
    //General functions
    Bool8 Create(int type = SOCK_DGRAM);
    Bool8 Connect(char *pszHostAddress, int nPort);
    int  Send(char *pszBuf, int nBuf, struct sockaddr_in *toAddr);
    int  Receive(char *pszBuf, int nBuf, struct sockaddr_in *fromAddr);
    void Close();
    int  IsReadible(unsigned long dwTimeout);

protected:
    Bool8 Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen);
    #ifdef __Win32__
        SOCKET m_hSocket;
    #endif
    
    #ifdef __REDHATLINUX__
        int m_hSocket;
    #endif
};


class CConnectionPeer
{
public:
	CConnectionPeer(unsigned int castType = UNICAST,Bool8 isServer = false,char *serverAddr = NULL,unsigned short port = 123);
	~CConnectionPeer();
	int DealRecvData();
	int SendTimeSynData();

	void DataRecvThread();
	Bool8 StartDataRecvThread();
	Bool8 TerminateDataRecvThread();

	void MultiCastSendThread();
	Bool8 StartMultiCastSendThread();
	Bool8 TerminateMultiCastSendThread();
	
	void DataSendThread();
	Bool8 StartDataSendThread();
	Bool8 TerminateDataSendThread();
	#ifdef __Win32__
	    Bool8 GetSetTimePriviledge();
	    void CancelSetTimePriviledge();
	#endif
	
	Bool8 RepairSystemTime(NtpServerResponse *resp);
    
	/// 对服务器有效,用于监听客户端同步消息
	void SetLocalListenPort(unsigned short port);
	
	void SetServerPort(unsigned short port);
	void SetServerAddr(char *addr);
	void SetMulticastAddr(char *addr);
	void SetLocalPort(unsigned short port);
	Bool8 SetIsServer(Bool8 isServer){ mIsServer = isServer; return true;}
	void SetLogDisplay(CLogList *log){ pLog = log;} 
	void SetAnyCast( bool isTrue);
	void SetMultiCast( bool isTrue);
	void SetMultiCastPeriod(unsigned int multicastPeriod);
	void SetUniCastPeriod(unsigned int unicastPeriod);
	int  SendMultiCastSynData();
	int  SendAnyMultiCastSynData();
	Bool8 GetIsUniCast();
	Bool8 GetIsMultiCast();
	Bool8 GetIsAnyCast();
	Bool8 GetIsTakeNetDelay();
	Bool8 GetIsTackServerAddr();

protected:
	char mServerAddr[20], mMultiCastAddr[20];
	unsigned short mLocalPort,mServerPort;
	CNtpSocket mPeerSocket;
	Bool8       mIsServer;
	unsigned int mCastType;
	CLogList   *pLog;

	/// WINDOWS VARIABLE DEFINE
	#ifdef __Win32__
	    HANDLE  mRecvThreadHandle;
	    HANDLE  mMultiCastThreadHandle;
	    HANDLE  mSendThreadHandle;
	#endif
	#ifdef __REDHATLINUX__
	    pthread_t  mRecvThreadHandle;
	    pthread_t  mMultiCastThreadHandle;
	    pthread_t  mSendThreadHandle;
	#endif
	
	
	Bool8    mIsAnyCast;
	Bool8    mIsMultiCast;
	Bool8    mIsGetNetDelay;
	Bool8    mIsGetServerAddr;
	double  mNetDelay;
	unsigned int mMultiCastPeriod;
	unsigned int mUniCastPeriod;

    #ifdef __Win32__
	    HANDLE     m_hToken;
	    Bool8       m_bTakenPriviledge;
	    TOKEN_PRIVILEGES m_TokenPriv;
	#endif
	/// END WINDOWS VARIABLE DEFINE 
	

};

#endif // !defined(AFX_NTPSOCK_H__28D444E2_CCBC_49B8_A02A_CBE3BC58BFF5__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -