mcast_join_source_group函数
2024-09-06 23:40:49
#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
}
最新文章
- C++_系列自学课程_第_5_课_vector容器_《C++ Primer 第四版》
- Mybatis异常--java.lang.IllegalArgumentException: NO ENUM const class org.apache.ibatis.type.JdbcType.int
- Redis -- 03 持久化
- 第一个 Asp.Net vNext 应用程序
- iframe 内联框架
- Http协议中 常用的参数应用
- maven总结2
- loj 1308(点双连通分量应用)
- 全局函数VS成员函数
- hdu3068
- 怎么修改tomcat默认访问首页
- 【转】iOS开发24:使用SQLite3存储和读取数据
- Sql Server获得每个表的行数
- Microsoft.AlphaImageLoader滤镜讲--透明处理<;转>;
- 简化MonoTouch.Dialog的使用
- Python和SQL 2017的强大功能
- 什么是REST接口
- lua中 table 重构index/pairs元方法优化table内存占用
- PL/SQL控制结构
- C#微信扫码支付Demo
热门文章
- C++算法导论第九章O(n)期望选择序列第i小的数字
- 8.10-Day2T3 镇守府
- 6_11 四分树(UVa297)<;四分树>;
- 第二十五篇 玩转数据结构——链表(Linked List)
- 【安卓逆向】反编译ELF的另类技巧
- Mybatis plus中一个框多条件查询 SQL拼接
- 【音乐欣赏】《Happy Together (The Turtles Cover)》 - Unlike Pluto / Why Mona
- Go同步等待组/互斥锁/读写锁
- mysql客户端的导出数据库表和数据库数据等相关操作
- opencv python:Canny边缘提取