とりあえず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);
	}
};