linux下怎么使用C语言编写接收和发送udp组播数据?

一,发送端

代码如下:

先调用initUdpMultiCastSender初始化,

 

int initUdpMultiCastSender(uint32_t localip,uint16_t localport)
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if (-1 == sockfd)
	{
		printf("[initUdpMultiCastSender]socket fail\n");
		return -1;
	}

	struct sockaddr_in myaddr;
	memset(&myaddr,0,sizeof(myaddr));
	myaddr.sin_family = AF_INET;
	myaddr.sin_port = htons(localport);
	myaddr.sin_addr.s_addr = localip;
	int bindret = bind(sockfd,(struct sockaddr *)(&myaddr),sizeof(struct sockaddr));
	if (-1 == bindret)
	{
		perror("[initUdpMultiCastSender]bind fail\n");
		close(sockfd);
		return -1;
	}
	return sockfd;
}

后使用sendUdpMultiCast发送数据,

 

int sendUdpMultiCast(int sockfd,char *pMultiCastIp,uint16_t multicastPort,void *data,uint32_t len)
{
	struct sockaddr_in destAddr;
	destAddr.sin_family = AF_INET;
	destAddr.sin_addr.s_addr = inet_addr(pMultiCastIp);
	destAddr.sin_port = htons(multicastPort);
	int sendLen = sendto(sockfd,data,len,0,(struct sockaddr *)(&destAddr),sizeof(struct sockaddr));
	return sendLen;
}

 

发送端的代码,整体的思路就是创建socket->绑定本地ip,port(注意,该port不是组播port,而是本地port,指定个未使用的即可)->发送数据(注意,发送的ip和port为组播ip,port)

 

 

二、接收端

 

 

	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if (-1 == sockfd)
	{
		perror("socket fail\n");
		return -3;
	}
	printf("socket succ\n");

	struct ip_mreq mreq;
	memset(&mreq,0,sizeof(struct ip_mreq));
	mreq.imr_interface.s_addr = htonl(INADDR_ANY);
	mreq.imr_multiaddr.s_addr = inet_addr(pUdpMultiCastIp);

	int setoptret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq));
	if (-1 == setoptret)
	{
		perror("setsockopt fail\n");
		return -4;
	}
	printf("setsockopt ip_add_membership succ\n");

	struct sockaddr_in peeraddr;
	memset(&peeraddr,0,sizeof(struct sockaddr_in));
	peeraddr.sin_family = AF_INET;
	peeraddr.sin_addr.s_addr = inet_addr(pUdpMultiCastIp);
	peeraddr.sin_port = htons(udpMultiCastPort);

	int bindRet = bind(sockfd,(struct sockaddr *)(&peeraddr),sizeof(struct sockaddr));
	if (-1 == bindRet)
	{
		perror("bind fail\n");
		return -5;
	}
	printf("bind succ\n");

	while(1)
	{
		char buffer[1024] = {0};
		socklen_t addrLen = sizeof(struct sockaddr);
		printf("ready 2 recv\n");
		int recvRet = recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)(&peeraddr),&addrLen);
		if (-1 == recvRet)
		{
			perror("recvfrom fail\n");
			break;
		}
		printf("recvfrom succ,buffer is %s\n",buffer);
	}


接收端的代码,整体的思路就是创建socket->加入组播(本地地址和组播地址赋值给mreq)->绑定ip,port(注意,该ip和port是组播ip和组播port)->接收数据(注意,接收的ip和port为组播ip,port)

 

 

 

 

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值