UDP多播进行Linux与Windows数据交互

对于Linux上与Windows数据交互有很多方法 ,此处我来探讨利用多播进行Linux上与Windows上的数据交互
首先说明多播的一个性质。 简要来讲,多播就是相当于只发送一次数据包,但是传播多次。多播主要使用的是D类IP地址: 224.0.0.0 ~ 239.255.255.255

创建多播的方式

多播的发送端 Linux

	int snd_sock;
	struct sockaddr_in snd_addr;
	int time_live = 64;			//多播传输的次数,每经过一个主机,该变量-1
	snd_sock = socket(AF_INET,SOCK_DGRAM,0;		//多播利用的是UDP传输协议
	///此处省略对于套接字异常问题的处理
	memset(&snd_addr,0,sizeof(snd_addr));
	snd_addr.sin_family = AF_INET;		//IPV4
	snd_addr.sin_addr.s_addr = inet_addr("224.1.1.2");		//任意的D类多播地址
	snd_addr.sin_port = htons(atoi("8888"));			//任意的非知名端口号
	
	///如果需要频繁的发送数据 建议创建已连接的套接字
	connect(snd_sock,(struct sockaddr*)&snd_addr,sizeof(snd_addr));
			
	///多播的发送端主要为连接到 多播地址以及设置TTL
	setsockopt(snd_sock,IPPROTO_IP,IP_MULTICAST_TTL,(void *)&time_live,sizeof(time_live));
	
	///接下来则可以进行数据交互了
	sendto(snd_sock,"How are you?",strlen("How are you?"),0,NULL,0);
	//....此处随意发送数据
	///注意 如果创建了已连接的套接字 则可以直接使用 write写入数据

多播的接收端 Windows

	WSADATA wasData;
	SOCKET recvSock;
	SOCKADDR_IN recvAddr;
	unsigned int strLen;
	char buf[100];			//此处最好宏定义接收最大长度 ,如果Linux中发送数据也定义了变量,应保持一致,因为UDP发送数据不存在边界
	struct ip_mreq joinAddr;		//多播的关键! 该结构用于加入多播组

	///为了简便  放弃了对于异常的处理 正常编写程序应该对于每个函数的返回值进行检测
	WSAStartup(MAKEWORD(2,2),&wsaData);

	recvSock = socket(AF_INET,SOCK_DGRAM,0);
	
	///初始化地址信息并加入多播组
	memset(&recvAddr,0,sizeof(recvAddr));	
	recvAddr.sin_family = AF_INET;
	recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);	//自动获取地址	
	recvAddr.sin_port = htons(atoi("8888"));			//端口号保持一致
	
	bind(recvSock,(struct SOCKADDR*)&recvAddr,sizeof(recvAddr));
	
	joinAddr.imr_multiaddr.s_addr = inet_addr("224.1.1.2");	//与Linux端的多播地址保持一致
	joinAddr.imr_interface.s_addr = htonl(INADDR_ANY);		//设置本机地址
	
	///加入多播
	setsockopt(recvSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void *)&joinAddr,sizeof(joinAddr));
	
	///数据交互
	recvfrom(recvSock,buf,sizeof(buf),0,NULL,0);

完整程序 点击:链接:https://pan.baidu.com/s/1MutdiT4u8nwNhqj5U7HwYg
提取码:cdu1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

David_TD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值