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只返回发生事件的句柄和数量,相对要高效很多

reinterprent_cast<>低阶的转型,不做类型检查和转换,很危险,通常用作指针的转换。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值