winSocket之UDP单播、组播、广播

本文介绍了WinSocket下UDP协议的三种通信方式:单播、组播和广播。单播是一对一通信,广播则是一对多,类似于传统的村口广播,而组播是一对多但具有分组特性,只让特定群体接收信息。文章提供了服务端和客户端的代码示例。
摘要由CSDN通过智能技术生成

首先,在此简单的说明一下自己对单播、组播、广播的理解(PS:肤浅的理解)

  • 单播:就是一对一通信
  • 广播:一对多的通信,类似村口广播,全村都能听见
  • 组播:就是一对多通信,通俗的讲,就是分组,村里喊一部分人来开发,不是所有人都来开会。

服务端或者说接收端代码:

	
	//头文件
	#include <WinSock2.h>
	#pragma comment(lib,"ws2_32.lib")
	
	//调用WSAStartup函数
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
   
		std::cout << "WSAStartup error" << std::endl;
		return;
	}

	//创建Socket
	m_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (m_socket == SOCKET_ERROR)
	{
   
		std::cout << "socket error" << std::endl;
		return;
	}

	//绑定地址信息
	m_RecvAddr.sin_family = AF_INET;
	m_RecvAddr.sin_port = htons(绑定端口);
	m_RecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	
	UCHAR uLoop = 0; // 0-同一台主机,1-跨主机
	ULONG ul = 1;
	int   nTimeOut = 1000;

	bool bOptval = true;
	//用于端口接收单播、组播、广播
	int ret = setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&am
以下是使用Winsock加入组播的示例代码: ```c #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #define MCAST_ADDR "239.0.0.1" // 组播地址 #define MCAST_PORT 8888 // 组播端口 int main() { // 初始化Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed with error: %d\n", WSAGetLastError()); return 1; } // 创建套接字 SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == INVALID_SOCKET) { printf("socket failed with error: %d\n", WSAGetLastError()); WSACleanup(); return 1; } // 设置套接字为允许发送组播数据 int ttl = 1; if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (const char*)&ttl, sizeof(ttl)) != 0) { printf("setsockopt IP_MULTICAST_TTL failed with error: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 加入组播组 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) != 0) { printf("setsockopt IP_ADD_MEMBERSHIP failed with error: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 绑定套接字到本地地址和端口 struct sockaddr_in local_addr; local_addr.sin_family = AF_INET; local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(MCAST_PORT); if (bind(sock, (struct sockaddr*)&local_addr, sizeof(local_addr)) != 0) { printf("bind failed with error: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); return 1; } // 接收组播数据 struct sockaddr_in from_addr; char buf[1024]; while (1) { int from_len = sizeof(from_addr); int ret = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&from_addr, &from_len); if (ret > 0) { buf[ret] = '\0'; printf("Received: %s\n", buf); } } // 关闭套接字并清理Winsock closesocket(sock); WSACleanup(); return 0; } ``` 在上面的代码中,首先初始化Winsock,创建一个UDP套接字,并将其设置为允许发送组播数据。然后,使用IP_ADD_MEMBERSHIP选项将套接字加入组播组,并绑定到本地地址和端口。最后,使用recvfrom函数接收组播数据。注意,在实际使用中,你需要根据实际情况修改组播地址、端口和接收数据的方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值