windows下IPv6组播(C++、MFC)
Server
#include <stdio.h>
#include <Ws2tcpip.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 6060
#define IP "ff02::2"
#define BUF_LEN 256
int main(int argc, char* argv[])
{
WSADATA wsaData;
WORD wVersionRequested; // 版本
wVersionRequested = MAKEWORD(1, 1); //版本信息
WSAStartup(wVersionRequested, &wsaData); //初始化Windows套接字库
//使用此结构来指定将套接字连接到的本地或远程端点地址
struct sockaddr_in6 addr = { AF_INET6, htons(PORT) }; //创建一个UDP套接字
int l_nServer;
if ((l_nServer = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
{
perror("创建失败");
return -1;
}
bind(l_nServer, (struct sockaddr*)&addr, sizeof(addr));
//ipv6_mreq结构提供了用于IPv6地址的多播组的信息。
struct ipv6_mreq group;
//将接口索引指定为0,则使用默认的多播接口。
group.ipv6mr_interface = 0;
//IPv6组播组的地址。
inet_pton(AF_INET6, IP, &group.ipv6mr_multiaddr);
//将套接字加入到指定接口上提供的多播组。此选项仅对数据报和原始套接字有效(套接字类>型必须为SOCK_DGRAM或SOCK_RAW)。
setsockopt(l_nServer, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char*)&group, sizeof(group));
int l_naddLen = sizeof(addr);
int l_nReadLen = 0;
char msgbuf[BUF_LEN];
printf("等待接收\n");
while (1)
{
l_nReadLen = recvfrom(l_nServer, msgbuf, BUF_LEN, 0, (struct sockaddr*)&addr, &l_naddLen);
if (l_nReadLen < 0)
{
perror("接收失败");
exit(1);
}
msgbuf[l_nReadLen] = '\0';
printf("%s\n", msgbuf);
strcpy_s(msgbuf, "world");
int l_nLen = sendto(l_nServer, msgbuf, strlen(msgbuf), 0, (struct sockaddr*)&addr, sizeof(addr));
if (l_nLen < 0)
{
perror("发送失败");
exit(1);
}
printf("Send %s\n", msgbuf);
} return 0;
}
Cilect
#include <stdio.h>
#include <Ws2tcpip.h>
#include <winsock2.h>
#define HELLO_PORT 7905
#define HELLO_GROUP "224.0.0.1"
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(1, 1);
// Initialize Windows socket library
WSAStartup(0x0202, &wsaData);
int l_nCilect;
struct sockaddr_in6 addr = { AF_INET6, htons(6060) };
/* 创建一个UDP套接字 */
if ((l_nCilect = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
{
perror("创建失败");
exit(1);
}
inet_pton(AF_INET6, "ff02::2", &addr.sin6_addr);
char message[128];
int l_naddLen = sizeof(addr);
while (1)
{
strcpy_s(message, "hello");
int l_nLen = sendto(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, sizeof(addr));
if (l_nLen < 0)
{
perror("发送失败");
exit(1);
}
printf("Send %s\n", message);
Sleep(1000);
int l_nReadLen = recvfrom(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, &l_naddLen);
if (l_nReadLen < 0)
{
perror("接收失败");
exit(1);
}
message[l_nReadLen] = '\0';
printf("%s\n", message);
}
return 0;
}
windows下IPv6组播(C++、MFC)的更多相关文章
- linux下播放组播流出现setsockopt:No such device错误
在linux下播放组播流出现setsockopt:No such device错误是因为多播IP没有add路由表里面 可以采用如下命令完成: root@android:/ # busybox rout ...
- SDN网络IPv6组播机制支持实时视频业务海量用户扩展
以 OpenFlow 技术为核心的软件定义网络(SDN)框架具有集中控制的功能能够自己感知网络拓扑的变化,在细粒度的路径选择.接入控制.负载均衡方面有着天然的优势,为 IPv6 组播功能的实现提供了好 ...
- 关于组播数据包“发不出去",c#无法接收
问题一:发不出去 最近做一个小东西改进方案需要用到组播,简单来说就是我先作为服务器端组播发送设备编号,然后组播成员作为客户端接收消息后先确认对方是不是在呼叫我.是的话就返回一个消息,这样我服务器端就可 ...
- IP组播技术介绍及实现例子
引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...
- CCIE路由实验(6) -- 组播Multicasting
1.组播IGMP的各种情况2.PIM Dense-Mode3.PIM Sparse-Mode4.PIM双向树和SSM5.动态RP之auto-rp6.动态RP之BSR7.Anycast RP8.域间组播 ...
- IP组播
1 IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者. 说明: 本章 ...
- IP组播技术
1 概述 1.1 产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...
- 组播基本概念、IGMP、IGMP监听学习笔记
前言 一直对组播这个概念迷迷糊糊,特别是交换机处理组播的方式,非常想搞懂但是懒癌发作.这几天终于耐心地看了下有关组播的资料,大致了解了一下同一广播域内组播的相关知识.组播占了计算机网络的一大部分,特别 ...
- 【miscellaneous】VLC组播与接收
搭建组播服务器 第一步:运行程序后选择"媒体--串流": 第二步:通过"添加"选择需要播放的文件(以wmv文件为例),单击"串流": 第三 ...
- TCP/IP 笔记 - 广播和本地组播
在之前第二章介绍IP寻址的时候有介绍到,IP地址有4种:单播.组播.广播.任播. 单播,客户端与服务器之间点到点连接通信: 组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信: ...
随机推荐
- 重新点亮linux 命令树————selinux[二十六]
简介 简单整理selinux. 正文 selinux 是安全增强软件. 以前是系统安全是用户权限配置(用户自主控制),但是害怕用户自己设置问题,故而增加了一个selinux,也就是强制访问控制. 一般 ...
- 牛客网-SQL专项训练3
①这里有一张user表包含如下信息: 现在要把name列的所有值都转换为大写,并将字段重命名为names,像下面这样: SQL语句为:SELECT UCASE(name) AS names FROM ...
- 阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程
简介:阿里云企业云原生 IT 成本治理方案助力企业落地企业 IT 成本治理的理念.工具与流程,让企业在云原生化的过程中可以数字化地实现企业 IT 成本管理与优化,成为 FinOps 领域的践行者与领 ...
- Oracle数据到MaxCompute乱码问题详解
简介:集成Oracle数据到MaxCompute,乱码问题分析: 为什么,在oracle数据不乱码,集成到MaxCompute就乱码了? 问题在哪里? 1.1 乱码现象 DataWorks的数据离线 ...
- 如何避免 Go 命令行执行产生“孤儿”进程?
简介: 在 Go 程序当中,如果我们要执行命令时,通常会使用 exec.Command ,也比较好用,通常状况下,可以达到我们的目的,如果我们逻辑当中,需要终止这个进程,则可以快速使用 cmd.Pro ...
- [MySQL] 导入数据库和表的两种方式
如果是导入 mysqldump 导出的 sql 文件,使用 mysql 命令再导入就可以了. 下面是另一种可选方式: use xxdb source /var/lib/mysql/xxtable.sq ...
- Region-区域(默认和新增)适配器
Prism内置了几个区域适配器 ContentControlRegionAdapter ItemsControlRegionAdapter SelectorRegionAdapter ComboBox ...
- dotnet 如何将 Microsoft.Maui.Graphics 对接到 UNO 框架
本文将和大家介绍如何将 Microsoft.Maui.Graphics 对接到 UNO 框架里面.一旦完成 Microsoft.Maui.Graphics 对接,即可让 UNO 框架复用现有的许多绘制 ...
- WPF 对接 Vortice 绘制 WIC 图片
本文告诉大家如何通过 Vortice 在 Direct2D 里面绘制图片,图片的来源是 WIC 加载出的图片 在上一篇博客 WPF 对接 Vortice 调用 WIC 加载图片 告诉了大家如何对接 V ...
- SQL语法之:连表查询:union all
1.准备 两条sql查询出来的字段数必须一致 表1 字段: 数据: 表2 字段: 数据: 2.使用 1.两张表结构完全一样,查询字段顺序也一样 select ID,NAME,SEX,AGE,NAME2 ...