linux之UDP组播通信

需包含头文件<sys/socket.h>

socket(AF_INET,SOCK_DGRAM,0)

setsockopt(fd,sol)

struct sockaddr_in addr;    

	int fd;

	u_int yes=1; /*** MODIFICATION TO ORIGINAL */    

	/* create what looks like an ordinary UDP socket */  

	if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     

	{    

		perror("socket");    

		exit(1);    

	}    

	if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)     

	{    

		perror("Reusing ADDR failed");    

		exit(1);    

	}    

	/*** END OF MODIFICATION TO ORIGINAL */    

	/* set up destination address */    

	memset(&addr,0,sizeof(addr));    

	addr.sin_family=AF_INET;    

	addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    

	addr.sin_port=htons(dwport); 

	/* bind to receive address */    

	if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    

	{    

		perror("bind");    

		exit(1);    

	}    

	/* use setsockopt() to request that the kernel join a multicast group */    

	mreq.imr_multiaddr.s_addr=inet_addr(szMultiAddr);    

	mreq.imr_interface.s_addr=inet_addr(szLocalIP);//htonl(INADDR_ANY); 

	if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)     

	{    

		printf("setsockopt multi error ");    

		exit(1);    

	}    
fd_set set ;
int handle;
struct timeval tv;
FD_ZERO(&set);
FD_SET(handle,&set);
tv.tv_sec =5
select(fd+1,&set,NULL,NULL,tv);
nret =FD_ISSET(handle,&set);
if(nret>0)
	receive data;

select与epoll区别

1.select支持1024个文件描述符,采用轮询文件描述符,看是否有可读或者可写的数据。epoll采用回调机制实现,适用于大规模并发。

2.select需要将文件句柄从内核空间拷贝到用户空间,造成资源浪费,并且需要遍历整个数组才能知道那个句柄发生了事件。

3.epoll只返回发生事件的句柄和数量,相对要高效很多



猜你喜欢

转载自blog.csdn.net/weixin_36704535/article/details/80266143