对于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