Skip to content

Commit 07dd872

Browse files
committed
Add multicast helper function
1 parent bb675b8 commit 07dd872

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

base/hsocket.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,58 @@ HV_INLINE int so_linger(int sockfd, int timeout DEFAULT(1)) {
283283
#endif
284284
}
285285

286+
HV_INLINE int udp_multicast_loop(int sockfd, int value DEFAULT(1))
287+
{
288+
return setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, (void *)&value, sizeof(int));
289+
}
290+
HV_INLINE int udp_multicast_loop6(int sockfd, int value DEFAULT(1))
291+
{
292+
return setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (void *)&value, sizeof(int));
293+
}
294+
295+
HV_INLINE int udp_multicast_ttl(int sockfd, int value)
296+
{
297+
return setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&value, sizeof(int));
298+
}
299+
HV_INLINE int udp_multicast_ttl6(int sockfd, int value)
300+
{
301+
return setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (void *)&value, sizeof(int));
302+
}
303+
304+
HV_INLINE int udp_joingroup(int sockfd, const char* group_ip, const char* intf_ip DEFAULT(ANYADDR))
305+
{
306+
struct ip_mreq mreq;
307+
inet_pton(AF_INET, group_ip, &mreq.imr_multiaddr);
308+
inet_pton(AF_INET, intf_ip, &mreq.imr_interface);
309+
return setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mreq, sizeof(mreq));
310+
}
311+
312+
HV_INLINE int udp_leavegroup(int sockfd, const char* group_ip, const char* intf_ip DEFAULT(ANYADDR))
313+
{
314+
struct ip_mreq mreq;
315+
inet_pton(AF_INET, group_ip, &mreq.imr_multiaddr);
316+
inet_pton(AF_INET, intf_ip, &mreq.imr_interface);
317+
return setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void *)&mreq, sizeof(mreq));
318+
}
319+
320+
// intf_idx 填写字符串整数 为了和ipv4保持一致
321+
HV_INLINE int udp_joingroup6(int sockfd, const char* group_ip, const char* intf_idx DEFAULT("0"))
322+
{
323+
struct ipv6_mreq mreq;
324+
inet_pton(AF_INET6, group_ip, &mreq.ipv6mr_multiaddr);
325+
mreq.ipv6mr_interface = atoi(intf_idx);
326+
return setsockopt(sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (void *)&mreq, sizeof(mreq));
327+
}
328+
329+
HV_INLINE int udp_leavegroup6(int sockfd, const char* group_ip, const char* intf_idx DEFAULT("0"))
330+
{
331+
struct ipv6_mreq mreq;
332+
inet_pton(AF_INET6, group_ip, &mreq.ipv6mr_multiaddr);
333+
mreq.ipv6mr_interface = atoi(intf_idx);
334+
return setsockopt(sockfd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (void *)&mreq, sizeof(mreq));
335+
}
336+
337+
286338
END_EXTERN_C
287339

288340
#endif // HV_SOCKET_H_

0 commit comments

Comments
 (0)