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; }