⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alc_socket.c

📁 这个程序实现了FLUTE协议
💻 C
📖 第 1 页 / 共 2 页
字号:
			/* Join the multicast group */      			if(ch->s->addr_family == PF_INET) {	#ifdef SSM				if(ch->s->ssm) {					ch->source_imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr;										if(ch->intface == NULL) {						ch->source_imr.imr_interface.s_addr = htonl(INADDR_ANY);					}					else {						ch->source_imr.imr_interface.s_addr = inet_addr(ch->intface);					}										ch->source_imr.imr_sourceaddr.s_addr = inet_addr(ch->s->src_addr);	  					if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,							(char *)&ch->source_imr, sizeof(ch->source_imr)) < 0) {	    #ifdef WIN32						printf("setsockopt (IP_ADD_SOURCE_MEMBERSHIP) failed: %d\n", WSAGetLastError());						fflush(stdout);#else						printf("setsockopt (IP_ADD_SOURCE_MEMBERSHIP) failed: %d\n", errno);						fflush(stdout);#endif						close(ch->rx_sock);						return -1;					}				}				else {					ch->imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr;										if(ch->intface == NULL) {						ch->imr.imr_interface.s_addr = htonl(INADDR_ANY);					}					else {						ch->imr.imr_interface.s_addr = inet_addr(ch->intface);					}					if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,						(char *)&ch->imr, sizeof(ch->imr)) < 0) {	    #ifdef WIN32						printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", WSAGetLastError());						fflush(stdout);#else						printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", errno);						fflush(stdout);#endif						close(ch->rx_sock);						return -1;					}				}#else				ch->imr.imr_multiaddr.s_addr = ch->remote.sin_addr.s_addr;								if(ch->intface == NULL) {					ch->imr.imr_interface.s_addr = htonl(INADDR_ANY);				}				else {					ch->imr.imr_interface.s_addr = inet_addr(ch->intface);				}								if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,					(char *)&ch->imr, sizeof(ch->imr)) < 0) {	  #ifdef WIN32					printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", WSAGetLastError());					fflush(stdout);#else					printf("setsockopt (IP_ADD_MEMBERSHIP) failed: %d\n", errno);					fflush(stdout);#endif					close(ch->rx_sock);					return -1;				}#endif			}			else if(ch->s->addr_family == PF_INET6) {	#if defined(LINUX) && defined(SSM)				if(ch->s->ssm) {										if(ch->intface_name == NULL) {						ch->greqs.gsr_interface = 0;					}					else {						ch->greqs.gsr_interface = if_nametoindex(ch->intface_name);					}					memcpy(&ch->greqs.gsr_group, &ch->remote6, sizeof(ch->remote6));					source.sin6_family = AF_INET6;        					inet_pton(AF_INET6, ch->s->src_addr, &source.sin6_addr);					memcpy(&ch->greqs.gsr_source, &source, sizeof(source));	  					if(setsockopt(ch->rx_sock, IPPROTO_IPV6, MCAST_JOIN_SOURCE_GROUP,						(char *)&ch->greqs, sizeof(ch->greqs)) < 0) {	    						printf("setsockopt (MCAST_JOIN_SOURCE_GROUP) failed: %d\n", errno);						fflush(stdout);						close(ch->rx_sock);						return -1;					}				}				else {					ch->imr6.ipv6mr_multiaddr = ch->remote6.sin6_addr;										if(ch->intface_name == NULL) {						ch->imr6.ipv6mr_interface = 0;					}					else {						ch->imr6.ipv6mr_interface = if_nametoindex(ch->intface_name);					}					if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,						(char *)&ch->imr6, sizeof(ch->imr6)) < 0) {	    						printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", errno);						fflush(stdout);						close(ch->rx_sock);						return -1;					}				}#else				ch->imr6.ipv6mr_multiaddr = ch->remote6.sin6_addr;#ifdef LINUX				if(ch->intface_name == NULL) {					ch->imr6.ipv6mr_interface = 0;				}				else {					ch->imr6.ipv6mr_interface = if_nametoindex(ch->intface_name);				}#else				if(ch->intface_name == NULL) {					ch->imr6.ipv6mr_interface = 0;				}				else {					ch->imr6.ipv6mr_interface = atoi(ch->intface_name);				}				#endif					if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,					(char *)&ch->imr6, sizeof(ch->imr6)) < 0) {#ifdef WIN32					printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", WSAGetLastError());					fflush(stdout);#else					printf("setsockopt (IPV6_JOIN_GROUP) failed: %d\n", errno);					fflush(stdout);#endif					close(ch->rx_sock);					return -1;				}#endif			}		}	}  	return 0;}/* * This function closes tx or rx socket * * Params:	alc_channel_t *ch: Pointer to channel * * Return:	int: 0 in success, -1 otherwise * */int close_alc_socket(alc_channel_t *ch) {  	int mode;	int addr_type;	mode = ch->s->mode;	addr_type = ch->s->addr_type;  	if(mode == SENDER) {    #ifdef WIN32		closesocket(ch->tx_sock);#else		close(ch->tx_sock);#endif    	}  	if(mode == RECEIVER) {    		if(addr_type == 0) {      			if(ch->s->addr_family == PF_INET) {	#ifdef SSM				if(ch->s->ssm) {	  					if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP,						(char *)&ch->source_imr, sizeof(ch->source_imr)) < 0) {	    #ifdef WIN32						printf("setsockopt (IP_DROP_SOURCE_MEMBERSHIP) failed: %d\n", WSAGetLastError());						fflush(stdout);#else							printf("setsockopt (IP_DROP_SOURCE_MEMBERSHIP) failed: %d\n", errno);						fflush(stdout);#endif						close(ch->rx_sock);						return -1;					}				}				else {					if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,						(char *)&ch->imr, sizeof(ch->imr)) < 0) {	    #ifdef WIN32						printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", WSAGetLastError());						fflush(stdout);#else						printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", errno);						fflush(stdout);#endif						close(ch->rx_sock);						return -1;					}				}#else				if(setsockopt(ch->rx_sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,					(char *)&ch->imr, sizeof(ch->imr)) < 0) {	  #ifdef WIN32					printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", WSAGetLastError());					fflush(stdout);#else					printf("setsockopt (IP_DROP_MEMBERSHIP) failed: %d\n", errno);					fflush(stdout);#endif					close(ch->rx_sock);					return -1;				}#endif			}			else if(ch->s->addr_family == PF_INET6) {	#if defined(LINUX) && defined(SSM)				if(ch->s->ssm) {					if(setsockopt(ch->rx_sock, IPPROTO_IPV6, MCAST_LEAVE_SOURCE_GROUP,						(char *)&ch->greqs, sizeof(ch->greqs)) < 0) {	    						printf("setsockopt (MCAST_LEAVE_SOURCE_GROUP) failed: %d\n", errno);						fflush(stdout);						close(ch->rx_sock);						return -1;					}				}				else {					if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP,						(char *)&ch->imr6, sizeof(ch->imr6)) < 0) {	    						printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", errno);						fflush(stdout);						close(ch->rx_sock);						return -1;					}				}#else				if(setsockopt(ch->rx_sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP,					(char *)&ch->imr6, sizeof(ch->imr6)) < 0) {	  #ifdef WIN32					printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", WSAGetLastError());					fflush(stdout);#else					printf("setsockopt (IPV6_LEAVE_GROUP) failed: %d\n", errno);					fflush(stdout);#endif					close(ch->rx_sock);					return -1;				}#endif			}		}    #ifdef WIN32    		closesocket(ch->rx_sock);#else    		close(ch->rx_sock);#endif	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -