使用Winsock:组播编程

基于Winsock的UDP组播通信入门 Winsock初始化过程:首先确保包含对应版本的头文件,然后保证链接对应的库文件(可以在代码中使用#pragma comment(lib, "WS2_32"),或在编译器项目属性中链接器->输入->附加依赖项中添加ws2_32.lib);接收端在本地绑定对应的固定端口,然后加入到组播的群组,最终实现数据的共享。否则根据发现的问题,提炼概念,百度或请人求教。UDP即用户数据报协议(UDP,User Datagram Protocol),无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 阅读详情

通过Windows套接字启用多播编程。 Windows套接字通过使用套接字选项或IOCTL,在IPv6和Internet组管理协议版本2(IGMPv2)和3(IGMPv3)上启用多播侦听器发现(MLD)版本1(MLDv1)和2(MLDv2)。 本节介绍Windows实现,解释如何使用Windows套接字启用多播编程,并提供编程示例以说明其用法。

IGMP的第二版本(以下称为IGMPv2)使主机能够加入和离开由特定网络接口上的IPv4多播地址标识的多播组。 Windows套接字使应用程序能够在特定套接字上加入和离开这些组。 然而,IGMPv2的缺点是加入IGMPv2组的任何IPv4源地址都可以传输给所有成员,可能使该组泛滥并使其不能用于需要主要源的传输,例如因特网无线电台。 IGMPv2的问题在于它无法选择性地选择单个IPv4源地址(甚至几个源),并且无法阻止给定多播组的发送者(例如流氓广播者或拒绝服务的犯罪者)。 IGMPv3解决了这些缺点。

使用Windows套接字和IGMPv3,应用程序可以选择特定的多播IPv4源地址和多播组对。 此外,Windows套接字使开发人员能够有选择地允许给定源/组对中的其他广播公司,或使应用程序能够阻止特定的广播公司。 Windows Vista及更高版本支持IGMPv3。

IPv6上的第一个版本的MLD(称为MLDv1)与IGMPv2非常相似,并且受到相同的限制。 MLDv1允许主机在特定网络接口上加入和离开由IPv6多播地址标识的多播组。 Windows套接字使应用程序能够在特定套接字上加入和离开这些组。 但是,加入MLDv1组的任何IPv6源地址都可以传输给所有成员,可能会使该组泛滥并使其无法用于需要主源的传输。 MLDv1的问题在于它无法选择性地选择单个IPv6源地址(甚至是几个源),并且无法阻止给定多播组的发送者(例如流氓广播者或拒绝服务的犯罪者)。 MLDv2解决了这些缺点。

使用Windows套接字和MLDv2,应用程序可以选择特定的多播IPv6源地址和多播组对。 此外,Windows套接字使开发人员能够有选择地允许给定源/组对中的其他广播公司,或使应用程序能够阻止特定的广播公司。 Windows Vista及更高版本支持MLDv2。

在Windows中开发多播应用程序时,应用程序员可以采用两种方法。 第一种方法是基于变化的; 根据需要,即使在传输过程中,也可以使用套接字选项添加或删除组播源。 第二种方法是基于最终状态; 源地址和任何包含/排除的地址都使用IOCTL指定。 每种方法都是有效的多播实践,但开发人员可能会发现使用套接字选项和基于更改的方法更直观,更灵活。
 

 

 

一、MLD和IGMP使用Windows套接字

Windows套接字通过使用套接字选项和IOCTL,启用IPv6上的多播侦听器发现(MLD)和IPv4上的Internet组管理协议(IGMP)以用于多播应用程序。 此页面描述了启用多播编程的套接字选项,并描述了它们的使用方式。 有关每个套接字选项的定义,请参阅“套接字选项”页面。

有关使用IOCTL进行多播编程的信息,请参阅本节后面的基于最终状态的多播编程。

在Windows Vista及更高版本中,一组套接字选项可用于支持IPv6和IPv4地址的多播编程。 这些套接字选项与IP无关,可以在IPv6和IPv4上使用。 在IPv6上,这些套接字选项使用MLDv2。 在IPv4上,这些套接字选项使用IGMPv3。 这些与IP无关的选项是Windows Vista及更高版本上多播编程的首选套接字选项。 Windows套接字使用以下套接字选项:

Socket optionArgument type
MCAST_BLOCK_SOURCEGROUP_SOURCE_REQ structure
MCAST_JOIN_GROUPGROUP_REQ structure
MCAST_JOIN_SOURCE_GROUPGROUP_SOURCE_REQ structure
MCAST_LEAVE_GROUPGROUP_REQ structure
MCAST_LEAVE_SOURCE_GROUPGROUP_SOURCE_REQ structure
MCAST_UNBLOCK_SOURCEGROUP_SOURCE_REQ structure

一组套接字选项可用于支持仅IPv6地址的多播编程。 这些套接字选项使用MLDv1或MLDv2。 使用的MLD版本取决于Windows的版本。 Windows Vista及更高版本支持MLDv2。 Windows套接字使用以下套接字选项:

Socket optionArgument type
IPV6_ADD_MEMBERSHIPipv6_mreq structure
IPV6_DROP_MEMBERSHIPipv6_mreq structure

一组套接字选项可用于支持仅IPv4地址的多播编程。 这些套接字选项使用IGMPv3或IGMPv2。 使用的IGMP版本取决于Windows的版本。 Windows Vista及更高版本支持IGMPv3。 Windows套接字使用以下套接字选项:

Socket optionArgument type
IP_ADD_MEMBERSHIPip_mreq structure
IP_ADD_SOURCE_MEMBERSHIPip_mreq_source structure
IP_BLOCK_SOURCEip_mreq_source structure
IP_DROP_MEMBERSHIPip_mreq structure
IP_DROP_SOURCE_MEMBERSHIPip_mreq_source structure
IP_UNBLOCK_SOURCEip_mreq_source structure

当IGMPv3可用时,由于路由器可以处理过滤,因此可以更有效地处理IP_ADD_SOURCE_MEMBERSHIP,IP_BLOCK_SOURCE,IP_DROP_SOURCE_MEMBERSHIP和IP_UNBLOCK_SOURCE选项。 只有IGMPv2可用时,主机必须处理过滤。

大多数应用程序可能分为两类:任意源和受控源。

  • 任何源应用程序默认接受所有源,允许根据需要关闭各个源。 任何源应用程序的示例是允许所有收件人参与的视频会议呼叫。
  • 受控源应用程序将源限制为给定列表,例如Internet广播站,或广播显着事件。 使用套接字选项的过程对于每个选项略有不同。

在Windows Vista及更高版本中,以下步骤适用于任何源应用程序:

使用** MCAST \ _ _ _ JOIN \ _GROUP **加入群组。 如果需要,请使用** MCAST \ _BLOCK \ _SOURCE **关闭给定的源。 如果需要,使用** MCAST \ _UNBLOCK \ _SOURCE **重新允许被阻止的源。 使用** MCAST \ _LEAVE \ _GROUP **离开该组。

在Windows Vista及更高版本中,以下步骤适用于受控源应用程序:

使用** MCAST \ _JOIN \ _SOURCE \ _GROUP **加入每个组/源对。 如果所有源使用相同的组地址,请使用** MCAST \ _LEAVE \ _SOURCE \ _GROUP **离开每个组/源,或使用** MCAST \ _LEAVE \ _GROUP **保留所有源。

以下步骤适用于任何源应用程序:

使用** IP \ _ADD \ _MEMBERSHIP **加入组(** IPV6 \ _ADD \ _MEMBERSHIP **用于IPv6)。 如果需要,使用** IP \ _BLOCK \ _SOURCE **关闭给定的源。 如果需要,使用** IP \ _UNBLOCK \ _SOURCE **重新允许被阻止的源。 使用** IP \ _DROP \ _MEMBERSHIP **离开组(** IPV6 \ _DROP \ _MEMBERSHIP **用于IPv6)。

以下步骤适用于受控源应用程序:

使用** IP \ _ADD \ _SOURCE \ _MEMBERSHIP **加入每个组/源对。 如果所有源使用相同的组地址,请使用** IP \ _DROP \ _SOURCE \ _MEMBERSHIP **保留每个组/源,或使用** IP \ _DROP \ _MEMBERSHIP **保留所有源。

设置这些套接字选项的顺序具有关联规则。 有关多播套接字选项的信息和故障排除信息,请参阅多播套接字选项行为。

 

 

二、组播套接字选项行为

此页面描述了基于各种套接字选项设置状态的多播套接字选项的行为。

例如,此页面描述了在已在同一网络接口上使用指定的组/源对设置了IP_ADD_SOURCE_MEMBERSHIP选项的套接字上设置IP_ADD_SOURCE_MEMBERSHIP套接字选项时的行为。 允许在不同网络接口上的同一组上调用IP_ADD_SOURCE_MEMBERSHIP。

此页面有助于正确设计和排除Windows套接字多播应用程序。

初始化套接字选项冲突的沟洫套接字选项错误返回备注
IP_ADD_MEMBERSHIP${REMOVE}$IP_ADD_MEMBERSHIPWSAEADDRNOTAVAIL不要在同一网络接口上多次使用同一组调用IP_ADD_MEMBERSHIP。
IP_ADD_SOURCE_MEMBERSHIPWSAEADDRNOTAVAIL不要使用先前在同一网络接口上使用IP_ADD_MEMBERSHIP调用的同一组调用IP_ADD_SOURCE_MEMBERSHIP。
IP_DROP_SOURCE_MEMBERSHIPWSAEINVAL请改用IP_BLOCK_SOURCE。
IP_UNBLOCK_SOURCEWSAEINVAL尝试取消阻止先前未在同一网络接口上阻止的组/源对时返回错误。
IP_DROP_MEMBERSHIPAny subsequent call on the same group or group/source pairWSAEINVAL对当前不在包含列表中的组或组/源对进行套接字选项调用(由于成员资格丢失或其他原因)导致错误。
IP_ADD_SOURCE_MEMBERSHIP${REMOVE}$IP_ADD_MEMBERSHIPWSAEADDRNOTAVAIL不要使用先前在同一网络接口上使用IP_ADD_SOURCE_MEMBERSHIP调用的同一组调用IP_ADD_MEMBERSHIP。
IP_ADD_SOURCE_MEMBERSHIPWSAEADDRNOTAVAIL不要使用先前在同一网络接口上使用IP_ADD_SOURCE_MEMBERSHIP调用的相同组/源对调用IP_ADD_SOURCE_MEMBERSHIP。
IP_UNBLOCK_SOURCEWSAEINVAL尝试取消阻止先前未在同一网络接口上阻止的组/源对时返回错误。
IP_DROP_SOURCE_MEMBERSHIP${REMOVE}$IP_UNBLOCK_SOURCEWSAEINVAL尝试取消阻止先前未在同一网络接口上阻止的组/源对时返回错误。
IP_DROP_SOURCE_MEMBERSHIPWSAEADDRNOTAVAIL尝试删除不在同一网络接口上的包含列表中的组/源对时返回错误。
IP_BLOCK_SOURCE${REMOVE}$IP_BLOCK_SOURCEWSAEADDRNOTAVAIL尝试阻止已在同一网络接口上阻止的组/源对时返回错误。
IP_ADD_SOURCE_MEMBERSHIPWSAEINVAL请改用IP_UNBLOCK_SOURCE。
IP_ADD_MEMBERSHIPWSAEINVAL请改用IP_UNBLOCK_SOURCE。
IP_UNBLOCK_SOURCEIP_UNBLOCK_SOURCEWSAEADDRNOTAVAIL尝试取消阻止同一网络接口上不在阻止列表中的组/源对时返回错误。

 

 

三、多播编程示例

以下示例代码说明了如何使用套接字选项将多播功能包含到Windows套接字应用程序中。

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <mswsock.h>

#define u_int32 UINT32  // Unix uses u_int32

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")


int                  /* OUT: whatever setsockopt() returns */
join_source_group(int sd, u_int32 grpaddr, 
   u_int32 srcaddr, u_int32 iaddr)
{
   struct ip_mreq_source imr; 
   
   imr.imr_multiaddr.s_addr  = grpaddr;
   imr.imr_sourceaddr.s_addr = srcaddr;
   imr.imr_interface.s_addr  = iaddr;
   return setsockopt(sd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *) &imr, sizeof(imr));  
}

int
leave_source_group(int sd, u_int32 grpaddr, 
   u_int32 srcaddr, u_int32 iaddr)
{
   struct ip_mreq_source imr;

   imr.imr_multiaddr.s_addr  = grpaddr;
   imr.imr_sourceaddr.s_addr = srcaddr;
   imr.imr_interface.s_addr  = iaddr;
   return setsockopt(sd, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, (char *) &imr, sizeof(imr));
}

 

 

四、基于最终状态的组播编程

本节介绍使用IOCTL而不是套接字选项的基于最终状态的多播编程。 有关基于最终状态的多播编程与基于更改的多播编程的不同之处的概述,请参阅多播编程。

下表描述了用于Windows上多播编程的Windows套接字IOCTL。

IOCTLArgument type
SIOCSMSFILTERGROUP_FILTER structure
SIOCGMSFILTERGROUP_FILTER structure
SIO_GET_MULTICAST_FILTERip_msfilter structure
SIO_SET_MULTICAST_FILTERip_msfilter structure

请注意,SIOCSMSFILTER和SIOCGMSFILTER IOCTLS在Windows Vista及更高版本上可用。

使用这些IOCTL进行多播编程在处理大型源列表时具有性能优势。 有关与使用SIO_GET_MULTICAST_FILTER或SIO_SET_MULTICAST_FILTER相关的参数和设置的更多信息,请参阅GROUP_FILTER参考页。 有关与使用SIO_GET_MULTICAST_FILTER或SIO_SET_MULTICAST_FILTER相关的参数和设置的详细信息,请参阅ip_msfilter参考页。
 

 

五、将广播应用程序移植到IPv6

本节介绍将IPv6广播应用程序移植到Windows套接字可用的多播功能的最佳实践。

将IPv4与IPv6进行比较

准备将IPv4广播应用程序移植到IPv6时最值得注意的考虑因素是:IPv6没有实现广播的概念。 相反,IPv6使用多播。

IPv6组播可以模拟IPv4中的传统广播功能。 设置IPV6_ADD_MEMBERSHIP套接字选项,并将IPv6地址设置为链路本地范围,所有节点地址(FF02 :: 1)等效于使用SO_BROADCAST套接字选项在IPv4广播地址上进行广播。 该地址有时称为全节点组播组。 对于只想要IPv6广播仿真的应用程序,该方法在操作上是等效的。 然而,与IPv6的一个显着区别是,默认情况下不接收全节点多播组地址上的多播(默认接收IPv4广播)。 应用程序编程人员必须使用IPV6_ADD_MEMBERSHIP套接字选项来启用来自任何源的多播接收,包括全节点多播组地址。

注意

在IPv6中,接口选择在传递给多播套接字选项或IOCTL的参数结构中指定。

但是,为了向多个主机传输更丰富,更强大,更具选择性和更易管理的应用程序,应用程序开发人员应考虑转向多播模型。

 

转向多播

通过多播,应用程序员可以选择性地选择特定的源/组对,从而实现选择性接收模型。 IPv6上的多播侦听器发现(MLD)和IPv4上的Internet组管理协议(IGMPv3)版本3支持多播编程。 此外,多播使应用程序能够专门阻止(或解除阻塞)组内的发送者,从而进一步保护应用程序免受流氓广播公司的攻击。 此功能适用于IPv4(需要IGMPv3)以及IPv6(需要MLDv2)。

应用程序员使用多播有两种主要方案:从IPv4广播(或多播)应用程序移植到IPv6,以及创建新IPv6组播应用程序的方案。

对于移植现有应用程序,有两种选择可以转移到IPv6多播:使用套接字选项和使用IOCTL。

  • 使用套接字选项是一种基于更改的方法,它使开发人员能够根据需要更改套接字属性(例如阻止或取消阻止发件人,添加新源等)。 这种方法更直观,也是推荐的方法。 有关基于更改的多播编程方法的更多信息,请参阅使用Windows套接字的MLD和IGMP。
  • 使用IOCTL是一种基于最终状态的方法,因为它使开发人员能够通过一次调用提供完全配置的套接字状态,包括包含和排除列表。 有关基于最终状态的方法的更多信息,请参阅基于最终状态的多播编程。
  •  

对于那些创建新IPv6组播应用程序的人,建议的做法是使用套接字选项,而不是使用IOCTL。

还有另一种使用IPv6创建多播应用程序的方法,这需要使用WSAJoinLeaf函数。 虽然使用WSAJoinLeaf函数不是推荐的做法,但有些情况可能会指示其使用。 例如,在Windows Server 2003及更早版本上使用套接字选项的一个缺点是它们是特定于IP版本的。 在这些旧版本的Windows上,不同的套接字选项必须适用于IPv6和IPv4。 在Windows Vista及更高版本中,支持可与IPv4和IPv6一起使用的新套接字选项。 相反,WSAJoinLeaf函数是IP版本和协议不可知的,因此它可以是一种有用的方法,用于构建必须在Windows Server 2003及更早版本上使用多个IP版本的应用程序。 在需要协议和IP版本不可知性的某些情况下,使用WSAJoinLeaf函数可能更合适。

 

TCP与UDP挖掘机(二)套接字选项 套接字选项 用于IP层的套接字选项(IPPROTO_IP) 参数 解释 IP_ADD_MEMBERSHIP 加入组播(广播)组。每个套接字最多可以连接一组IP_ADD_MEMBERSHIPS组。 IP_ADD_SOURCE_MEMBERSHIP 加入特定于源的组播组。 每个套接字最多可以连接一组IP_MAX_MEMBERSHIPS组。 IP_BLOCK_SOURCE 阻止从给定源到给定多播组的数据... 阅读详情

相关推荐

多播套接字选项分析

一、IP_ADD_MEMBERSHIP、IPV6_JOIN_GROUP和MCAST_JOIN_GROUP 二、IP_DROP_MEMBERSHIP、IPV6_LEAVE_GROUP和MCAST_LEAVE_GROUP 三、IP_BLOCK_SOURCE和MCAST_BLOCK_SOURCE 四、IP_UNBLOCK_SOURCE和MCAST_UNBLOCK_SOURC

xiaomiCJH的博客 2075

UDP组播接收端的绑定问题bind(),IP_ADD_MEMBERSHIP

UDP组播接收的代码如下: struct sockaddr_in localSock; struct ip_mreq group; int sd; int datalen; char databuf[1024]; int main (int argc, char *arg...

photon222的博客 8985

VB6 通过winsock控件数组实现客户端和服务器多对一通信

在VB6中使用winsock控件需要引用Microsoft Winsock Control 6.0部件使用winsock控件可以实现客户端和服务器间C/S结构的通信,如果把客户端和服务器放置于同一台电脑中,并且将客户端winsock的RemoteHost设置为本机IP,则可以实现客户端程序和服务端程序间的自由通信。在应用程序之间采用winsock通信比内存共享等方法更简单快捷,同时也更安全。在客户端中添加一个窗体,拖拽一个winsock控件到该窗体上。Private Sub Form_Load() Me.

数字地质 1万+

【Linux C | 网络编程】多播套接字选项 | 加入/离开 多播组/源特定多播组 及 C语言例子

👉本文介绍了网络编程中多播相关的9个套接字选项,并给出了一些选项使用的C语言例子

wkd_007的博客 2045

【网络开发】winsock组播

//客户端 #include  #include  #include  #pragma comment(lib,"ws2_32.lib") #include  #include int main() {     //初始化套接字     WSADATA wsaData;     if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)     {         prin

ZhangPY的专栏 840

MFC环境下的组播功能实现指南

简介:组播是一种高效的数据传输技术,能在网络中节省资源,特别适合用于向多个接收者发送信息。本示例深入讲解了如何在Microsoft Foundation Classes (MFC)框架下实现组播功能,包括关键步骤如加入组、发送和接收数据。介绍了组播的基础概念、核心组件和API,如Winsock库的使用、加入组播组、创建和绑定套接字、发送和接收组播数据以及MFC事件驱动编程。此外,还强调了错误处理的重要性。

weixin_42584507的博客 1111

UDP单播 组播 广播 区别及简单实现

无论是tcp还是udp 服务器都必须绑定prot、Ip,客户端可以有选择性。 udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件 1、接收方设置组播属性及组播号 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致 广播需具备的条件 1、接收方设置广播属性 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致 组播和单...

huangtianyi1994的博客 1万+

MPC-CBF 控制原理详解

假设系统满足如下离散时间动力学模型xt1fxtutxt∈Xut∈Uxt1​fxt​ut​xt​∈Xut​∈Uxtx_txt​:状态变量,定义域为可行状态集X⊆RnX⊆Rnutu_tut​:控制输入,定义域为控制约束集U⊆RmU⊆Rm系统需满足安全约束,由如下控制障碍函数(CBF)hX→RhX→RCx∈X∣hx≥0C:=x∈X∣hx≥。

m0_54691290的博客 1179

winsock 多播(组播)

通过两个程序示例,说明组播的原理。

馋嘴猪没胃口 4316

SpringCloud2025+SpringBoot3.5.0动态路由503问题排查与负载均衡依赖解析

本文详细排查了SpringCloud 2025与SpringBoot 3.5.0环境下,Spring Cloud Gateway动态路由返回503错误的根本原因。核心问题在于新版网关未默认集成负载均衡器,导致无法解析lb://服务名。通过对比静态路由与动态路由,定位到需显式引入spring-cloud-starter-loadbalancer依赖,并提供了完整的解决方案与最佳实践配置。

s3t4u的博客 504

从零构建物联网监控系统:STM32+迪文屏+WiFi模组的实战解析

本文详细解析了基于STM32微控制器、迪文串口屏和WiFi模组构建物联网监控系统的完整方案。从硬件选型、系统架构设计到数据交互实现,提供了包括迪文屏GUI开发、STM32通信协议、低功耗优化等实战经验,帮助开发者快速掌握物联网监控系统的核心技术。

docker7nomad的博客 728

组播应用与编程

<br /><br />组播技术被认为是WWW技术推广之后出现的最激动人心的网络技术之一。1992年出现支<br />持IP组播的Mbone(组播主干网)和Mbone桌面工具;1993-1996年IP Multicast成为业界关注<br />的焦点,然而因发展条件不成熟使得IP组播只为业界所关注;进入1999年以来,IP组播具备<br />了发展的三个关键条件:支持组播的路由协议;基于开放标准的可测试管理协议;因商业发<br />展机遇而进入高速发展阶段。又一次掀起了组播实践的高潮,下面将有关组播应用作简

markman101---神即是道 道法自然 如来 3405

文华财经公式编程:麦语言简介及基础语法

文华财经公式语言(麦语言)是一种专门用于金融领域的编程语言,它是由文华财经公司开发的。提供了丰富的金融计算函数和数据处理功能,可以用于金融市场的数据分析、模型建立和交易策略的开发。例1:A:CLOSE;// 定义变量A为收盘价(盘中k线没有走完的时候A为最新价)。例2:MA5:=MA(C,5);// 定义收盘价的5周期均线(C为CLOSE简写)。例3:A:=REF(C,1);// 取得前一根k线的收盘价。

超哥量化的博客 1万+

组播通信C++ 代码实现

组播定义:组播技术是IP网络数据传输三种方式之一,在介绍Ip组播技术之前,先对IP网络数据传输的单播、组播和广播方式做一个简单的介绍。 单播: 在发送者和每一接收者之间实现点对点网络 连接。如果一台发送者的接收者同时给多个的接收者传输相同的数据,也必须相应的复制多份的相同数据包。如果有大量主机希望获得数据包的同一份拷贝时,将导致发送者负担沉重、延迟长、网络阻塞、为保证一定的服务质量需...

csp123258的专栏 4037

离线反激转换器反馈环路设计:从理论到实践的Type II补偿器详解

在开关电源设计中,反馈环路稳定性是决定电源性能与可靠性的核心。其本质是通过补偿网络对功率级的小信号特性进行校正,以构建一个具有足够相位裕度和增益裕度的闭环系统。反激转换器作为一种广泛应用的隔离拓扑,其功率级在连续导通模式(CCM)和非连续导通模式(DCM)下呈现不同的零极点特性,这直接决定了补偿器的选型。Type II补偿器因其传递函数中固有的积分环节、低频零点与高频极点,恰好能与反激功率级的1P2Z(一个极点、两个零点)特性形成互补,有效塑造理想的回路增益曲线,实现快速稳定的动态响应。本文聚焦于采用TL4

weixin_30162121的博客 501

17、激光切割焦点位置和入射角对切割质量的影响研究

本研究通过响应面方法(RSM)结合Box-Behnken设计,系统分析了激光功率、切割速度和气体压力对SS 304不锈钢激光切割质量的影响,重点探讨了三种不同喷嘴在不同聚焦条件下的切缝比和条纹深度变化规律。实验结果表明,激光功率、切割速度和气体压力对切割质量具有显著影响,且不同喷嘴因焦点位置差异表现出不同的响应趋势。通过回归建模与优化,确定了最小激光功率、适中切割速度和最大气体压力为最优参数组合,可实现最小切缝比和较优条纹深度。研究为实际激光切割工艺提供了科学的参数选择依据和操作流程建议,有效提升了切割精度

mm9012的博客 126

探索UDP组播魅力:Windows平台的高效实践工具

探索UDP组播魅力:Windows平台的高效实践工具 【下载地址】Windows下UDP组播多播发送和接收程序 本资源包含一个简单实用的C++程序示例,展示了如何在Windows操作系统环境下实现UDP协议下的组播发送与接收功能。组播技术允许数据包被有效地发送到多个接收端,而无需为每个目标单独发送数据,这对于需要同时向多...

gitblog_09750的博客 1042

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoint有诸多细节需要优化,特此整理成技术文档。本文档描述了实验pytorch-superpoint与pytorch-superglue项目训练自己的图像配准模型。

a486259的博客 9504

对于UDP组播的一些认识

 对于UDP组播的一些认识利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接

Mckay的专栏 1642

30天入门 SAP BTP 开发系列之八:动手在 SAP BTP 上开发第一个 ABAP 透明表

ABAP Cloud 环境下创建透明表的方法与数据迁移实践 本文介绍了在 SAP BTP ABAP 环境中创建透明表并迁移数据的完整流程。与传统的 SE11 事务码不同,ABAP Cloud 需通过 ABAP Development Tool 创建数据库表,使用代码定义表结构。作者详细演示了如何: 在开发包中创建名为 Z优快云_TRAVEL 的透明表 使用 ABAP 代码定义表字段和约束 通过 ABAP 类实现数据从标准表/DMO/TRAVEL 到新建表的迁移 验证数据迁移结果 文中还提供了相关技术概念的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1785

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

UDP协议组播

利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接受到.UD

legendox的专栏 1901

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

组播技术的初级使用

最近在研究一个局域网监控的系统,该系统中使用到了组播技术,这个也是我对组播技术的第一次接触,所以就写下了如下的初级认识吧! 组播(多播) 一种通讯模式。主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接收到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将

飞翔吧胖子的专栏 1111

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Windows下的网络编程Winsock

相比于基础,网络编程就要复杂一些,但其实也有固定格式,记住即可。

森明帮大于黑虎帮的博客 6914

IP组播技术及其在视频监控系统中的应用

1  引言    IP组播和WWW虽处于同一时期,但组播的发展远远慢于WWW,主要原因是IP组播通信模式要求路由器能提供每个群组和每个源的信息状态,随着PIM-SM、PIM-DM、MBGP、MSDP等组播路由协议的出现,使组播IP包能正确而又迅速地发送给成千上万的接收者,IP组播的技术和应用开始快速发展。2  IP组播2.1  IP组播及其优缺点    IP 组播[1]是将 IP

Jitonm's Zone 2752

Windows下UDP组播(多播)发送和接收程序

Windows下UDP组播(多播)发送和接收程序 【下载地址】Windows下UDP组播多播发送和接收程序 本资源包含一个简单实用的C++程序示例,展示了如何在Windows操作系统环境下实现UDP协议下的组播发送与接收功能。组播技术允许数据包被有效地发送到多个接收端,而无需为每个目标单独发送数据,这对于需要同时向多个节...

gitblog_09721的博客 1660

组播收发数据

组播的收发

wyyy2088511的博客 578
上一篇: 使用Winsock:Winsock入门
下一篇: I/P/B/SI/SP帧和PTS/DTS的关系
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值