ocs init
This commit is contained in:
59
plat/iptrans/src/mcast_join.c
Normal file
59
plat/iptrans/src/mcast_join.c
Normal file
@@ -0,0 +1,59 @@
|
||||
|
||||
#include "./include/iptrans.h"
|
||||
|
||||
/*@ignore@*/
|
||||
int
|
||||
mcast_join(int sockfd, struct sockaddr *sa, socklen_t salen,
|
||||
const char *ifname,u_int ifindex)
|
||||
{
|
||||
//u_char flag=1;
|
||||
//int len;
|
||||
//struct hostent *myhost;
|
||||
|
||||
switch(sa->sa_family)
|
||||
{
|
||||
case AF_INET:{
|
||||
struct ip_mreq mreq;
|
||||
struct ifreq ifreq;
|
||||
memcpy(&mreq.imr_multiaddr,
|
||||
&((struct sockaddr_in *)sa)->sin_addr,
|
||||
sizeof(struct in_addr));
|
||||
if(ifindex>0){
|
||||
if(if_indextoname(ifindex,ifreq.ifr_name)==NULL){
|
||||
// errno=ENXIO;
|
||||
return(-1);
|
||||
}
|
||||
goto doioctl;
|
||||
}
|
||||
else if(ifname !=NULL){
|
||||
strncpy(ifreq.ifr_name,ifname,IFNAMSIZ);
|
||||
doioctl:
|
||||
if(ioctl(sockfd,SIOCGIFADDR,&ifreq)<0)
|
||||
return (-1);
|
||||
memcpy(&mreq.imr_interface.s_addr,
|
||||
&((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr,
|
||||
sizeof(struct in_addr));
|
||||
return (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,
|
||||
&mreq,sizeof(mreq)));
|
||||
}
|
||||
else
|
||||
mreq.imr_interface.s_addr=htonl(INADDR_ANY);// inet_addr(name);
|
||||
// setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&flag,sizeof(flag));
|
||||
return (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,
|
||||
&mreq,sizeof(mreq)));
|
||||
}
|
||||
default:
|
||||
// errno=EPROTONOSUPPORT;
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
mcast_set_loop(int sockfd, int onoff)
|
||||
{
|
||||
u_char flag;
|
||||
flag=onoff;
|
||||
return (setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_LOOP,
|
||||
&flag,sizeof(flag)));
|
||||
}
|
||||
/*@end@*/
|
||||
Reference in New Issue
Block a user