@@ -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+
286338END_EXTERN_C
287339
288340#endif // HV_SOCKET_H_
0 commit comments