#include "StdAfx.h"
#include "SockAddrIn.h"
#include "SocketHandle.h"

// SockAddrIn ��ʵ��;
SockAddrIn SockAddrIn::NULLAddr;
SockAddrIn::SockAddrIn()
{
	Clear();
}

SockAddrIn::SockAddrIn(IN const SockAddrIn& sin)
{
	Copy( sin );
}

SockAddrIn::~SockAddrIn(){}

// ��սṹ��;
void SockAddrIn::Clear()
{
	memset(this, 0, sizeof(sockaddr_storage));
}

/************************************************************************/
/*  ������Copy[2/28/2016 IT];
/*  ���������ƽṹ��;
/*  ������;
/*  	[IN] sin��SockAddrIn��������;;
/*  ���أ�����thisָ��;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
SockAddrIn& SockAddrIn::Copy(IN const SockAddrIn& sin)
{
	ss_family = sin.ss_family;
	memcpy(this, &sin, Size());
	return *this;
}

/************************************************************************/
/*  ������IsEqual[2/28/2016 IT];
/*  �������Ա������ַ�����Ƿ���ͬ;
/*  ������;
/*  	[IN] ��;
/*  ���أ���ͬ����TRUE,���򷵻�FALSE;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
bool SockAddrIn::IsEqual(IN const SockAddrIn& sin) const
{
	if ( ss_family == AF_INET )
	{// AF_INET��IPV4Э���ַ��ר��,����Ҫ����sin_zero[8]����;
		return (memcmp(this, &sin, Size() - 8) == 0);
	}

	// �����IPV6��ַ�ṹ��AF_INET6��;
	return (memcmp(this, &sin, Size()) == 0);
}

/************************************************************************/
/*  ������CreateFrom[2/29/2016 IT];
/*  ����������������׽��ֵ�ַ,��Ҫ�������ַ�����ʽ����;
/*  ������;
/*  	[IN] pszAddr������˵�ַ������������;
/*  	[IN] pszService���ַ�����ʽ��IP�˿ڻ������;
/*  	[IN] nFamily�������ַ�����ͣ�IPV4��IPV6��;
/*  	[OUT] ��;
/*  	[IN/OUT] ��;
/*  ���أ��ɹ���������TRUE;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
bool SockAddrIn::CreateFrom(IN LPCTSTR pszAddr, IN LPCTSTR pszService, IN int nFamily /*=AF_INET*/, bool bIsClient /*= true*/)
{
	Clear();
	CSocketHandle::GetAddressInfo(pszAddr, pszService, nFamily, *this, bIsClient);
	return !IsNull();
}

/************************************************************************/
/*  ������CreateFrom[2/29/2016 IT];
/*  ����������������׽��ֵ�ַ,��Ҫ��������ֵ��ʽ����(ֻ֧��IPV4);
/*  ������;
/*  	[IN] lIPAddr����ֵ��ʽ��IP��ַ;
/*  	[IN] nPort����ֵ��ʽ�ķ���˶˿ں�;
/*  	[IN] nFamily�������ַ�����ͣ�Ĭ��AF_INET��;
/*  	[IN] bFmtHost��
/*			��־IP��ַ������1���Ͷ˿ڣ�����2���������ֽ���HBO(Host By Order),��С��ģʽ(little-endian)
/*			�������ֽ���NBO(NetWork By Order),�����ģʽ(big-endian);
/*  ���أ��ɹ���������TRUE;
/*  ע�⣺�ú���ֻ֧��IPV4�����ַ;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
bool SockAddrIn::CreateFrom(IN ULONG lIPAddr, IN USHORT nPort, IN int nFamily /*= AF_INET*/, IN bool bFmtHost /*= true*/)
{
	Clear();
	_ASSERTE( nFamily == AF_INET ); // supports IPv4 only
	SOCKADDR_IN* psin = reinterpret_cast<SOCKADDR_IN*>(this);
	psin->sin_family = static_cast<short>(nFamily);
	if ( bFmtHost )
	{
		psin->sin_addr.s_addr = htonl( lIPAddr );
		psin->sin_port = htons( nPort );
	}
	else
	{
		psin->sin_addr.s_addr = lIPAddr;
		psin->sin_port = nPort;
	}
	return !IsNull();
}