#include    <errno.h>
#include <net/if.h>
#include <sys/socket.h> #define SA struct sockaddr int mcast_join_source_group(int sockfd, const SA *src,
socklen_t srclen,const SA *grp, socklen_t grplen,
const char *ifname, u_int ifindex)
{
#ifdef MCAST_JOIN_SOURCE_GROUP
struct group_source_req req;
if (ifindex > ) {
req.gsr_interface = ifindex;
} else if (ifname != NULL) {
if ( (req.gsr_interface = if_nametoindex(ifname)) == ) {
errno = ENXIO; /* i/f name not found */
return(-);
}
} else {
req.gsr_interface = ;
}
if (grplen > sizeof(req.gsr_group) ||
srclen > sizeof(req.gsr_source)) {
errno = EINVAL;
return -;
}
memcpy(&req.gsr_group, grp, grplen);
memcpy(&req.gsr_source, src, srclen);
return (setsockopt(sockfd, family_to_level(grp->sa_family),
MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)));
#else
switch (grp->sa_family) {
#ifdef IP_ADD_SOURCE_MEMBERSHIP
case AF_INET: {
struct ip_mreq_source mreq;
struct ifreq ifreq; memcpy(&mreq.imr_multiaddr,
&((struct sockaddr_in *) grp)->sin_addr,
sizeof(struct in_addr));
memcpy(&mreq.imr_sourceaddr,
&((struct sockaddr_in *) src)->sin_addr,
sizeof(struct in_addr)); if (ifindex > ) {
if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {
errno = ENXIO; /* i/f index not found */
return(-);
}
goto doioctl;
} else if (ifname != NULL) {
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
doioctl:
if (ioctl(sockfd, SIOCGIFADDR, &ifreq) < ) {
return(-);
}
memcpy(&mreq.imr_interface,
&((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,
sizeof(struct in_addr));
} else {
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
} return(setsockopt(sockfd, IPPROTO_IP,
IP_ADD_SOURCE_MEMBERSHIP,&mreq, sizeof(mreq)));
}
#endif #ifdef IPV6
/* IPv6 source-specific API is MCAST_JOIN_SOURCE_GROUP */
case AF_INET6: {}
#endif
default: {
errno = EAFNOSUPPORT;
return(-);
}
}
#endif
}

最新文章

  1. C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》
  2. Mybatis异常--java.lang.IllegalArgumentException: NO ENUM const class org.apache.ibatis.type.JdbcType.int
  3. Redis -- 03 持久化
  4. 第一个 Asp.Net vNext 应用程序
  5. iframe 内联框架
  6. Http协议中 常用的参数应用
  7. maven总结2
  8. loj 1308(点双连通分量应用)
  9. 全局函数VS成员函数
  10. hdu3068
  11. 怎么修改tomcat默认访问首页
  12. 【转】iOS开发24:使用SQLite3存储和读取数据
  13. Sql Server获得每个表的行数
  14. Microsoft.AlphaImageLoader滤镜讲--透明处理&lt;转&gt;
  15. 简化MonoTouch.Dialog的使用
  16. Python和SQL 2017的强大功能
  17. 什么是REST接口
  18. lua中 table 重构index/pairs元方法优化table内存占用
  19. PL/SQL控制结构
  20. C#微信扫码支付Demo

热门文章

  1. C++算法导论第九章O(n)期望选择序列第i小的数字
  2. 8.10-Day2T3 镇守府
  3. 6_11 四分树(UVa297)&lt;四分树&gt;
  4. 第二十五篇 玩转数据结构——链表(Linked List)
  5. 【安卓逆向】反编译ELF的另类技巧
  6. Mybatis plus中一个框多条件查询 SQL拼接
  7. 【音乐欣赏】《Happy Together (The Turtles Cover)》 - Unlike Pluto / Why Mona
  8. Go同步等待组/互斥锁/读写锁
  9. mysql客户端的导出数据库表和数据库数据等相关操作
  10. opencv python:Canny边缘提取