とりあえずNTPのサンプル
いやー htonlしてるサンプル無さすぎるww
2208988800ULの増減はやってるんだが、ntoh hton の付きで書かれてないから、すっかりntoh忘れてて数時間悩んだeee
#pragma once class CNtpSock : public CAsyncSocket { private: #define OFFSET_1900_1970 2208988800UL /* 1970 - 1900 */ #pragma pack(1) typedef struct _packet { unsigned char l; unsigned char stratum; unsigned char ppoll; signed char precision; unsigned __int32 rootdelay; unsigned __int32 rootdispersion; unsigned __int32 refid; unsigned __int32 ref; unsigned __int32 ref_frac; unsigned __int32 org; unsigned __int32 org_frac; unsigned __int32 rec; unsigned __int32 rec_frac; unsigned __int32 xmt; unsigned __int32 xmt_frac; } packet; #pragma pack() CString m_dstaddr; UINT m_dstport; packet m_ntppkt; public: CNtpSock() { m_ntppkt.xmt = 0; }; void Time(unsigned __int32& hi, unsigned __int32& lo) { SYSTEMTIME sysLocalTime; GetLocalTime(&sysLocalTime); CTime timeNow(sysLocalTime); hi = htonl(timeNow.GetTime() + OFFSET_1900_1970); lo = htonl(sysLocalTime.wMilliseconds); }; virtual void OnReceive(int nErrorCode) { if (m_ntppkt.xmt == 0) { ReceiveFrom(&m_ntppkt, sizeof(packet), m_dstaddr, m_dstport ); if(m_ntppkt.l == 0x24) return; //reg.flood m_ntppkt.l = 0x24; m_ntppkt.stratum = 68; m_ntppkt.precision = 0xeb; m_ntppkt.refid = 0x01007f7f; // 127.127.0.1 OnSend(nErrorCode); } CAsyncSocket::OnReceive(nErrorCode); } virtual void OnSend(int nErrorCode) { if (m_ntppkt.xmt != 0) { Time(m_ntppkt.ref, m_ntppkt.ref_frac); Time(m_ntppkt.org, m_ntppkt.org_frac); Time(m_ntppkt.rec, m_ntppkt.rec_frac); SendTo(&m_ntppkt, sizeof(packet), m_dstport, m_dstaddr); m_ntppkt.xmt = 0; } CAsyncSocket::OnSend(nErrorCode); } };