________________________________________________________________________
Applicable Environment
________________________________________________________________________
- Topic: Network Multicast
- SDP: 6.5.0, 6.6.0, 7.0.0, 7.1.0
- Target: Any supported target
________________________________________________________________________
Recommendation________________________________________________________________________
The following test program shows how to set the TTL for Multicast packets. For this it is needed to control the stack through the datagram socket. Setting the TTL cannot be done on the transmitting socket/interface directly. To use this example, the addresses used need to be edited to the local environment.
/**
* Demonstration of how to set TTL on a multicast socket
**/
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
struct in_addr localInterface;
struct sockaddr_in groupSock;
int sd;
int datalen;
char databuf[1024];
int main( int argc, char *argv[] )
{
// Open the datagram socket for the control stream
sd = socket( AF_INET, SOCK_DGRAM, 0 );
if( sd < 0 ) {
perror( "opening datagram socket" );
exit( 1 );
}
// Create a multicast socket
memset( ( char * ) &groupSock, 0, sizeof( groupSock ) );
groupSock.sin_family = AF_INET;
groupSock.sin_addr.s_addr = inet_addr( "225.1.1.1" );
groupSock.sin_port = htons( 5555 );
{
char loopch = 0;
if( setsockopt
( sd, IPPROTO_IP, IP_MULTICAST_LOOP, ( char * ) &loopch,
sizeof( loopch ) ) < 0 ) {
perror( "setting IP_MULTICAST_LOOP:" );
close( sd );
exit( 1 );
}
}
// Get the local interface and mark it as multicast interface
localInterface.s_addr = inet_addr( "192.168.12.240" );
if( setsockopt
( sd, IPPROTO_IP, IP_MULTICAST_IF, ( char * ) &localInterface,
sizeof( localInterface ) ) < 0 ) {
perror( "setting local interface multicast" );
exit( 1 );
}
// Now set the TTL
// In this case to 31
{
unsigned char ttl;
ttl = 31;
// Write TTL for IP Multicasrt packets into the control socket
if( setsockopt
( sd, IPPROTO_IP, IP_MULTICAST_TTL, ( void * ) &ttl,
sizeof( ttl ) ) < 0 ) {
perror( "setting TTL on local interface" );
exit( 1 );
}
}
// Do a testsend on the socket so one can validate the packets
datalen = 10;
if( sendto
( sd, databuf, datalen, 0, ( struct sockaddr * ) &groupSock,
sizeof( groupSock ) ) < 0 ) {
perror( "sending datagram message" );
}
}
________________________________________________________________________
NOTE:
This entry has been validated against the SDP version listed above. Use
caution when considering this advice for any other SDP version. For
supported releases, please reach out to QNX Technical Support if you have any questions/concerns. ________________________________________________________________________