BOOL CMulticastSocket::CreateSendingSocket(UINT nTTL, BOOL bLoopBack)
{
	if(!m_SendSocket.Create(0, SOCK_DGRAM, 0))		// Create an unconnected UDP socket
		return FALSE;

	if(!SetTTL(nTTL))								// Set Time to Live as specified by user
		AfxMessageBox("Warning! Error Setting TTL");

	SetLoopBack(bLoopBack);							// Enable/Disable Loopback

	return TRUE;
}
//   Create multicast socket for Sending Packets    //
bool CCiMulticastSocket::CreateBlockingSendSocket( const char *groupIP, unsigned short groupPort, const char *SourceInterfaceIP, unsigned int nTTL, bool bLoopBack )
{
	// Create socket for Sending packets from multicast group
	if( ( m_iSendSocket = socket(AF_INET, SOCK_DGRAM, 0))  == -1 ) {
		return false;
    }

	// Fill m_saHostGroup for sending datagrams When you use SendN()
	memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));

	m_saHostGroup.sin_family = AF_INET;
	m_saHostGroup.sin_addr.s_addr = inet_addr(groupIP);
	m_saHostGroup.sin_port = htons(groupPort);

	// Fill m_saSourceAddress To bind sending socket( Requirement )
	memset(&m_saSourceAddress, 0, sizeof(m_saSourceAddress));

	m_saSourceAddress.sin_family = AF_INET;
	m_saSourceAddress.sin_addr.s_addr = htonl(INADDR_ANY);
	m_saSourceAddress.sin_port = htons(0);

	if ( bind( m_iSendSocket, (struct sockaddr *)&m_saSourceAddress, sizeof(m_saSourceAddress)) != 0) {
        return false;
    }

	// Make send socket reuseable immediately when it is closed.
	const int on = 1;
	if( setsockopt( m_iSendSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) == -1 ) {
        return false;
    }

	// Join the multicast group
	m_mrMReq.imr_multiaddr.s_addr = inet_addr(groupIP);	/* group addr */
	if ( strcmp("0.0.0.0", SourceInterfaceIP) == 0 ) {
		m_mrMReq.imr_interface.s_addr = htons(INADDR_ANY);		// use default
	} else {
		m_mrMReq.imr_interface.s_addr = inet_addr(SourceInterfaceIP);
	}// m_mrMReq.imr_interface.S_un.S_addr를 안 주게 되면 IP_ADD_MEMBERSHIP에서 ERROR가 난다.

	int resultOfsetsockopt;
	if( ( resultOfsetsockopt = setsockopt( m_iSendSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&m_mrMReq, sizeof(m_mrMReq) ) ) < 0 ) {
		return false;
	}

	// Local Interface Setting
	if ( strcmp("0.0.0.0", SourceInterfaceIP) == 0 ) {
		m_MyInterfaceAddress.s_addr = htons(INADDR_ANY);  // Use default interface
	}
	else {
		m_MyInterfaceAddress.s_addr = inet_addr(SourceInterfaceIP);
	}

	if( setsockopt( m_iSendSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&m_MyInterfaceAddress, sizeof(m_MyInterfaceAddress)) < 0 ) {
		return false;
	}

	if ( !SetTTL(nTTL) ) {// Set Time to Live as specified by user
		return false;
	}

	SetLoopBack(bLoopBack);							// Enable/Disable Loopback

	return true;
}