📄 ntpsock.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 + -