win10下UDP组播跨主机发送与接收C++

一、代码

发送端send.cpp

#include <stdio.h>  
#include <winsock2.h>  
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")
 
int main()
{
	int iRet = 0;
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
 
	SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);
 
	int iFlag = 0;	// 0-同一台主机 1-夸主机
	iRet = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&iFlag, sizeof(iFlag));
	if(iRet != 0){
		printf("setsockopt fail:%d", WSAGetLastError());
		return -1;
	}
 
	sockaddr_in addr;
	addr.sin_addr.S_un.S_addr = inet_addr("234.2.2.2");
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9411);
	
	char strSend[1024] = {0};
	static int iIdx = 0;
	while(1)  
	{     
		sprintf_s(strSend, "udp send group data:%d", iIdx++);
		iRet = sendto(sock, strSend, strlen(strSend) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr));
		if(iRet <= 0){
			printf("send fail:%d", WSAGetLastError());
		}else{
			printf("send data:%s\n", strSend);
		}
		Sleep(500); 
	}  
 
	closesocket(sock);
	WSACleanup();
 
	return 0;
}

 接收端recv.cpp

#include <stdio.h>  
#include <winsock2.h>  
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")
 
int main()
{
	int iRet = 0;
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
 
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
 
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	//addr.sin_addr.S_un.S_addr = INADDR_ANY;
	addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
	addr.sin_port = htons(9411);
 
 	bool bOptval = true;
 	iRet = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptval, sizeof(bOptval));
 	if(iRet != 0){
 		printf("setsockopt fail:%d", WSAGetLastError());
 		return -1;
 	}
 
	iRet = bind(sock, (sockaddr*)&addr, sizeof(addr));
	if(iRet != 0){
		printf("bind fail:%d", WSAGetLastError());
		return -1;
	}
	printf("socket:%d bind success\n", sock);
 
	// 加入组播  
	ip_mreq multiCast;
	//multiCast.imr_interface.S_un.S_addr = INADDR_ANY;
	multiCast.imr_interface.S_un.S_addr = inet_addr("192.168.0.104");
	multiCast.imr_multiaddr.S_un.S_addr = inet_addr("234.2.2.2");
	iRet = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));
	if(iRet != 0){
		printf("setsockopt fail:%d", WSAGetLastError());
		return -1;
	}
 
	printf("udp group start\n");
 
	int len = sizeof(sockaddr);
	char strRecv[1024] = {0};
	while(true)  
	{     
		memset(strRecv, 0, sizeof(strRecv));
		iRet = recvfrom(sock, strRecv, sizeof(strRecv) - 1, 0, (sockaddr*)&addr, &len);
		if(iRet <= 0){
			printf("recvfrom fail:%d", WSAGetLastError());
			return -1;
		}
		printf("recv data:%s\n", strRecv);
	}  
 
	closesocket(sock);
	WSACleanup();
 
	return 0;
}

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: WinC是一种Windows环境下的编程语言,UDP是一种网络通信方式。WinC可以使用UDP协议进行组通信。 UDP是用户数据报协议,是一种无连接的、不可靠的传输协议,适用于实时性要求较高的应用场景。组是一种多技术,它可以将一份数据同时传递给多个接收方,适用于多用户之间实时通信的场景。 在WinC中使用UDP协议进行组通信,需要以下几个步骤: 1. 创建套接字:使用WinC的Socket函数创建一个UDP套接字。 2. 设置套接字属性:使用WinC的Setsockopt函数设置套接字的属性,包括组的TTL(生存时间)、接口和端口等。 3. 绑定套接字:使用WinC的Bind函数将套接字与本地IP地址和端口绑定。 4. 加入组组:使用WinC的Setsockopt函数将套接字加入到指定的组组中。 5. 接收发送数据:使用WinC的Recvfrom函数接收其他组成员的数据,使用Sendto函数向组发送数据。 6. 关闭套接字:使用WinC的Closesocket函数关闭套接字。 通过以上步骤,可以在WinC环境中实现UDP通信。利用UDP协议和组技术,可以实现多用户间的实时通信,例如视频直、在线游戏等应用。同时,在WinC中使用组还可以节省网络带宽和系统资源,提高通信效率。 ### 回答2: Win C是一种支持UDP(multicast)的网络编程框架。UDP是一种在计算机网络中,通过将UDP数据报发送到一个特定的组地址,同时被多个目标主机接收的通信方式。在Win C中,我们可以使用以下步骤进行UDP的实现。 首先,我们需要创建一个UDP套接字(socket),用于发送接收数据。可以使用Win C提供的函数(如socket())在本地主机上创建套接字。 接下来,我们需要设置套接字的参数,以允许组通信。可以使用setsockopt()函数来设置套接字的属性。设置IP_MULTICAST_TTL参数来指定组数据包的Time-to-Live,即数据包可以通过的最大跃点数。设置IP_ADD_MEMBERSHIP参数来加入特定的组组,以便接收该组组的数据包。 之后,我们可以使用sendto()函数将数据报发送到指定的组地址和端口。发送数据报时,我们需要将组地址设置为目标地址。 为了能够接收数据,我们需要使用recvfrom()函数接收数据报。接收数据报时,我们需要将套接字绑定到一个本地端口,并指定一个组地址作为源地址。 最后,我们可以使用closesocket()函数关闭套接字,释放资源。 通过上述步骤,我们可以在Win C中实现UDP。通过使用该技术,我们可以在同一个组组中实现多个主机之间的高效通信,同时节省带宽和资源。无论是在局域网内还是广域网环境下,UDP都提供了一种快速、可靠和实时的数据传输方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aspiretop

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

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

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

打赏作者

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

抵扣说明:

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

余额充值