IP多播技术及其编程(转载自http://www.zq.com.cn/)

多网卡按进程或目标IP指定使用特定网卡 电脑有多网卡的情况下,按进程、目标IP或目标端口指定使用特定网卡 阅读详情

IP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、“push”技术(如股票行情等)和虚拟现实游戏等方面。

  一、IP多播技术简介

  1.IP多播地址和多播组
  IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

  使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。

  2.IP多播技术的硬件支持
  要实现IP多播通信,要求介于多播源和接收者之间的路由器、集线器、交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。

  (1)主机
  支持IP多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4和Windows 2000等,运行这些操作系统的主机都可以进行IP多播通信。此外,新生产的网卡也几乎都提供了对IP多播的支持。
  (2)集线器和交换机
  目前大多数集线器、交换机只是简单地把多播数据当成广播来发送接收,但一些中、高档交换机提供了对IP多播的支持。例如,在3COM SuperStack 3 Swith 3300交换机上可启用802.1p或IGMP多播过滤功能,只为已侦测到IGMP数据包的端口转发多播数据包。
  (3)路由器
  多播通信要求多播源节点和目的节点之间的所有路由器必须提供对Internet组管理协议(IGMP)、多播路由协议(如PIM、DVMRP等)的支持。

  当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMP v2的主机(如Windows 98/2000计算机)退出某个多播组时,还会向路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。

  使用多播路由协议,路由器可建立起从多播源节点到所有目的节点的多播路由表,从而实现在子网间转发多播数据包。例如,PIM(协议独立多播)就是一种多播路由协议,它有两种类型:稀疏模式(sparse-mode)和密集模式(dense-mode)。以Cisco 2621路由器为例,启用IP多播转发功能的基本设置如下:

  c2621(config)# ip multicast-routing 启动IP多播,使路由器成为一个多播路由器
  c2621(config)# int f0/0 配置快速以太网端口0
  c2621(config-if)# ip pim dense-mode(或sparse-mode)启动PIM,同时激活IGMP协议
  c2621(config-if)# int f0/1 配置快速以太网端口1
  c2621(config-if)# ip pim dense-mode(或sparse-mode)

  二、IP多播应用的编程方法

  在实际应用中,编程人员通常需要自己编制底层网络应用程序来实现网上的底层通信,如具体实现IP多播通信的功能。编制底层网络应用程序通常要借助于网络数据通信编程接口,而在不同的操作系统中所提供的网络编程接口是有所不同的,如在Microsoft Windows环境下的网络编程接口就是Windows套接字(Windows Socket,简称Winsock)。
Winsock提供了包括TCP/IP、IPX等多种通信协议下的编程接口。不同的Windows版本支持不同的Winsock版本,其中Windows 95等早期版本本身只支持Winsock1.1(16位)下的编程(可以通过安装相关的软件包使其支持Winsock2.0),而Windows98、Windows NT4.0、Windows 2000则直接支持Winsock2.0(32位)。Winsock2.0是Winsock1.1的扩展,除兼容Winsock1.1 API外,还定义了一套可支持IP多播的与协议无关的API。

  使用Winsock 2.0实现IP多播的一般步骤如下:

  1.初始化Winsock资源
  在使用Winsock之前,必须调用WSAStartup()函数初始化Windows Sockets DLL。它允许应用程序或DLL指定Windows Sockets API要求的版本。

  2.创建套接字
  调用WSASocket()函数可以创建一个使用UDP协议的套接字,它是加入多播组的初始化套接字,并且以后数据的发送和接收都在该套接字上进行。针对IP多播通信,可将参数dwFlags设置为WSA_FLAG_MULTIPOINT_C_LEAF、WSA_FLAG_MULTIPOINT_D_LEAF和WSA_FLAG_OVERLAPPED的位和,指明IP多播通信在控制层面和数据层面都是“无根的”,只存在叶节点,它们可以任意加入一个多播组,而且从一个叶节点发送的数据会传送到每一个叶节点(包括它自己);创建的套接字具有重叠属性。

  3.设置套接字的选项
  调用setsockopt()函数为套接字设置SO_REUSEADDR选项,以允许套接字绑扎到一个已在使用的地址上。

  4.绑定套接字
  调用bind()函数绑定套接字,从而将创建好的套接字与本地地址和本地端口联系起来。对于多播通信来说,发送和接收数据通常采用同一个端口。

  5.设置多播套接字的模式
  WSAIoctl()函数的命令码SIO_MULTICAST_LOOP用来允许或禁止多播通信时发送出去的通信流量是否也能够在同一个套接字上被接收(即多播返回)。值得注意的是,在Windows 95/98/NT 4中,默认是允许多播返回,但不能设置禁止,否则会出错;只有在Windows 2000以上版本中,才能设置允许/禁止多播返回。
  WSAIoctl()函数的命令码SIO_MULTICAST_SCOPE用来设置多播传播的范围,即生存时间TTL。每当多播路由器转发多播数据包时,数据包中的TTL值都会被减1,若数据包的TTL减少到0,则路由器将抛弃该数据包。TTL的值是多少,多播数据便最多能经过多少个多播路由器。例如,TTL值为0,则多播只能在本地主机的多个套接字间传播,而不能传播到“网线”上;TTL值为1(默认值),则多播数据遇到第一个路由器,便会被它“无情”地丢弃,不允许传出本地网络之外,即只有同一个网络内的多播组成员才能收到多播数据。

  6.加入一个多播组
  调用WSAJoinLeaf()函数可加入一个多播组并指定角色(发送者/接收者)。调用时,参数dwFlags可指定套接字作为发送者(JL_SENDER_ONLY)、接收者(JL_RECEIVER_ONLY)或身兼两者(JL_BOTH)。调用成功后会返回一个多播套接字,调用closesocket()函数关闭该套接字就离开了多播组,此时可以调用WSAJoinLeaf()函数再次加入多播组。注意,对多播组数据的接收和发送不能在该套接字上完成。

  7.向多播组发送数据
  调用sendto()函数,可在指定的UDP套接字上向指定的多播组发送多播数据。调用时,参数to应指向多播组的IP地址。值得注意的是,若一个应用程序只是打算给多播组发送数据,便不必加入一个多播组。

  8.等待事件
  调用WSAAsyncSelect()函数,使套接字置于非阻塞模式,这时应用程序就可在该套接字上接收以Windows消息为基础的网络事件通知。例如,若参数lEvent值为FD_READ,则应用程序可在套接字上接收到“数据正等待被读入”的通知。
  9.从多播组接收数据
  调用recvfrom函数,可在指定的UDP套接字上读取输入数据。多播通信中数据的发送与接收一般采用同一个端口,因此其发送套接字和接收套接字是一样的。

  10.关闭套接字,释放Winsock资源。
  在多播通信结束后,先调用closesocket()函数关闭多播套接字和UDP套接字,然后调用WSACleanup()函数结束对Windows Sockets DLL的使用。

  三、应用实例


  为了说明IP多播技术的应用方法,本人在Visual C++.NET环境下设计了一个简单的基于Windows Socket 2的IP多播应用程序,通过该例子读者可以掌握IP多播应用程序设计的一般方法。该程序的具体设计方法如下:

  1.在Visual Studio.NET中建立一个基于对话框的MFC项目CMulticastSocket。注意在“高级功能”设置中不要选择“Windows套接字”,这是因为MFC只支持Windows Socket 1而不支持Windows Socket 2。为了能使用Winsock 2 API编程,在程序中应包含“winsock2.h”头文件,并在项目中加入ws2_32.lib的静态库,该静态库应设置在项目属性的“链接器”/“输入”/“附加依赖项”中。

  2.在对话框(类名CCMulticastSocketDlg)资源中,设置它的Caption为“WinSock 2多播应用程序”,并添加以下控件:

  静态文本:Caption为“接收到的信息:”;
  编辑框:ID为IDC_RECEIVE_EDIT,Read Only、Auto Vscroll、Vertical Scroll和Multiline属性值都为True
  静态文本:Caption为“发送的信息:”
  编辑框:ID为IDC_SEND_EDIT
  第一个按钮:Caption为“加入多播组(&J)”,ID为IDC_JOIN_BUTTON
  第二个按钮:Caption为“多播发送(&S)”,ID为IDC_SEND_BUTTON
  第三个按钮:Caption为“离开多播组(&L)”,ID为IDC_LEAVE_BUTTON
  第四个按钮:Caption为“退出(&Q)”,ID为IDC_QUIT_BUTTON


  为两个编辑框分别添加相关联的CString类型的变量m_SendMessage和m_ReceiveMessage;为四个按钮添加相应的消息处理函数;为对话框添加定时器消息(用于定时显示接收到的消息)及其消息处理函数。


  3.添加一个新的对话框资源,设置它的Caption为“加入多播组”,保留默认的两个按钮控件,同时添加添加以下控件:

  静态文本:Caption为“IP多播组地址:”
  编辑框:ID为IDC_IPADDRESS_EDIT
  静态文本:Caption为“IP多播端口:”
  编辑框:ID为IDC_PORT_EDIT
  静态文本:Caption为“生存时间:”
  编辑框:ID为IDC_TTL_EDIT
  复选框:Caption为“多播返回:”,ID为IDC_LOOPBACK_CHECK,Left Text属性值为True。


  为该对话框添加新的类CJoinGroupDlg,它的基类为CDialog,然后为该对话框中的三个编辑框分别添加相
关联的变量,即CSting m_IPAddress、UINT m_nPort、UINT m_nTTL;为复选框添加相关联的BOOL类型的变量m_Loopback。


  4.在CMulticastSocketDlg.h文件的前面添加CJoinGroupDlg的头文件:#include “JoinGroupDlg.h”,并在CCMulticastSocketDlg类中添加了一个CJoinGroupDlg类实例对象m_JoinDlg。


  5.为了能在对话框中接收网络事件通知,应增加一个用户自定义的消息及消息处理函数,具体实现方法如下:在CMulticastSocketDlg.h文件的前面自定义消息:#define WM_SOCK_MSG(WM_USER+166),并在afx_msg块中说明消息处理函数:afx_msg LRESULT OnSocketMsg (WPARAM wParam,LPARAM lParam);在CMulticastSocketDlg.cpp文件中的消息映射块中,使用ON_MESSAGE (WM_SOCK_MSG,OnSocketMsg)宏指令将消息映射到消息处理函数中,并具体实现消息处理函数:LRESULT CCMulticastSocketDlg:: OnSocketMsg(WPARAM wParam,LPARAM lParam){…}。

该程序的主要代码可参见程序清单,相关函数的详细说明可参看Microsoft MSDN帮助系统。为了节省篇幅,程序中省略了部分自动生成的和用于错误处理的代码。

程序清单:

// CMulticastSocketDlg.cpp : 实现文件
#include "stdafx.h"
#include "winsock2.h"
#include "CMulticastSocket.h"
#include "CMulticastSocketDlg.h"
……
DWORD cbRet;
SOCKET Sock,SockM; file://UDP套接字,多播套接字
BOOL bFlag,bJoin;
SOCKADDR_IN local,Remote,From; file://分别指向本地、多播组和数据来源的IP地址与端口
int Fromlen;
char ReceiveBuf[32000]; file://接收缓冲区
BOOL bDataReceived;
……
BEGIN_MESSAGE_MAP(CCMulticastSocketDlg, CDialog)
……
ON_BN_CLICKED(IDC_JOIN_BUTTON, OnBnClickedJoinButton)
ON_BN_CLICKED(IDC_LEAVE_BUTTON, OnBnClickedLeaveButton)
ON_BN_CLICKED(IDC_QUIT_BUTTON, OnBnClickedQuitButton)
ON_BN_CLICKED(IDC_SEND_BUTTON, OnBnClickedSendButton)
ON_WM_TIMER()
ON_MESSAGE(WM_SOCK_MSG,OnSocketMsg)
END_MESSAGE_MAP()

BOOL CCMulticastSocketDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
SetTimer(1,100,NULL); file://设置定时器
Fromlen=sizeof(From);
bDataReceived=TRUE;
bJoin=FALSE;
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
……
void CCMulticastSocketDlg::OnBnClickedJoinButton() file://加入多播组
{
if(m_JoinDlg.DoModal()==IDOK)
{
WORD wVersionRequested;
WSADATA wsaData;
int 北京中庆;
wVersionRequested = MAKEWORD(2,2);
北京中庆 = WSAStartup(wVersionRequested, &wsaData); file://初始化WinSock2资源
if(北京中庆!= 0){
AfxMessageBox("不能加载Windows套接字动态链接库,MB_OK");
return;
}
if (LOBYTE(wsaData.wVersion) !=2 || HIBYTE(wsaData.wVersion) !=2){
AfxMessageBox("WinSock DLL不支持2.0版本,MB_OK");
WSACleanup( );
return;
}
file://创建一个套接字
Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,
(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED
| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);

bFlag=TRUE; file://设置套接字选项,使套接字为可重用端口地址
setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag));

file://将套接字绑定到用户指定端口及默认的接口
memset(&local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_port=htons((USHORT)m_JoinDlg.m_nPort);
local.sin_addr.s_addr=htonl(INADDR_ANY);
bind(Sock,(struct sockaddr FAR *)&local,sizeof(local));

file://设置多播数据报传播范围(生存时间TTL)
WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_JoinDlg.m_nTTL,sizeof(int),
NULL,0,&cbRet,NULL,NULL);
file://设置多播返回(LOOKBACK)
BOOL nLoopBack=m_JoinDlg.m_Loopback;
WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),
NULL,0,&cbRet,NULL,NULL);

memset(&Remote,0,sizeof(Remote));
Remote.sin_family=AF_INET;
Remote.sin_addr.s_addr=inet_addr(m_JoinDlg.m_IPAddress);
Remote.sin_port=htons(m_JoinDlg.m_nPort);
file://加入到指定的多播组,并指定为既作为发送者又作为接收者(JL_BOTH)
SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),
NULL,NULL,NULL,NULL,JL_BOTH);
WSAAsyncSelect(Sock,m_hWnd,WM_SOCK_MSG,FD_READ); file://注册网络消息及其网络事件
bJoin=TRUE;
}
}

void CCMulticastSocketDlg::OnBnClickedSendButton() file://多播发送
{
if(bJoin){
UpdateData(TRUE);
const char* strMessage=LPCTSTR(m_SendMessage);
int nSize=m_SendMessage.GetLength()+1;
sendto(Sock,strMessage,nSize,0,(sockaddr*)&Remote,sizeof(Remote));
}
else
AfxMessageBox("请先加入多播组!");
m_SendMessage="";
UpdateData(FALSE);
}

void CCMulticastSocketDlg::OnBnClickedLeaveButton()
{ file://离开多播组
closesocket(SockM);
closesocket(Sock);
WSACleanup();
m_SendMessage="";
m_ReceiveMessage="";
bDataReceived=TRUE;
bJoin=FALSE;
UpdateData(FALSE);
}

void CCMulticastSocketDlg::OnBnClickedQuitButton()
{ file://退出
DestroyWindow();
}

void CCMulticastSocketDlg::OnTimer(UINT nIDEvent) file://定时器处理函数,实现接收信息的定时更新
{
if(bDataReceived)
{
m_ReceiveMessage+=ReceiveBuf;
m_ReceiveMessage+="/r/n";
bDataReceived=FALSE;
UpdateData(FALSE);
}
CDialog::OnTimer(nIDEvent);
}

LRESULT CCMulticastSocketDlg::OnSocketMsg(WPARAM wParam,LPARAM lParam)
{
file://检索网络事件
switch(WSAGETSELECTEVENT(lParam)){
case FD_READ:
recvfrom(Sock,ReceiveBuf,32000,0,(sockaddr *)&From,&Fromlen);
bDataReceived=TRUE; file://设置已接收到一条信息标志
break;
}
return TRUE;
}

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

相关推荐

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

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

数字地质 1万+

WinSock2 IP组播(多播)示例

#include #include #include #include #pragma comment( lib, "ws2_32.lib" ) #define MCASTADDR "234.5.6.7"#define MCASTPORT 25000#define BUFSIZE   1024#define DEFAULT_COUNT 500 BOOL bSender = FALSE,

Gamebaby Rock Sun的博客 1594

java网络通信,UDP组播数据收发类及应用示例,可以指定组播收发数据的网卡即组播数据所在网络

通常在主机多网卡的情况下,需要指定组播数据收发的网卡,即向那个网络发送组播数据,从那个网络接收组播数据,否则容易产生接收不到组播数据的情况。代码中给出的组播收发类直接调用即可,收发类可分开使用,通过构造函数的重载,可传参网卡IP,也可在单网卡时不传参。MultiCastRecver为组播数据接收类,MultiCastSender为组播数据发送类,TestMultiCast为收发数据的测试类。

【亲测免费】 WinIPBroadcast 开源项目教程

WinIPBroadcast 开源项目教程 1. 项目的目录结构及介绍 WinIPBroadcast 项目的目录结构如下: WinIPBroadcast/ ├── .gitignore ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── WinIPBroadcast.c ├── WinIPBroadcast.sln ├── WinIPBroadca...

gitblog_00403的博客 808

基于MFC对话框的UDP组播收发源代码程序

基于MFC对话框的UDP组播收发源代码程序,含发送和接收2个工程。点击发送端按钮,接收端可异步接收,经测试,Release编译后可成功运行。

UDP 组播 vc 例子

组播主要有以下几个步骤:1. 建立支持数据报的scoket2. 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)3. 通过setsockopt IP_ADD_MEMBERSHIP加入一个组播组4. 然后就能通过sendto / recvfrom进行数据的收法5. 通过 setsockopt IP_DROP_MEMBERSHIP离开一个组播组6. 关闭socket如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据五.winsock 2组播 winsock 2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据socket的模式,组播的实现构架有很大的关系) winsock 2组播的主要有以下几个步骤1. 建立支持数据报的socket(用WSASocket建立socket,同2. 时设置组播的一些属性)3. 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)4. 通过WSAJoinLeaf加入一个组播组5. 通过sendto / recvfrom进行数据的收发6. 直接关闭socket,7. 退出组播组

使用Hook拦截socket函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例

许多游戏有局域网联机功能,为了能在互联网环境下实现联机,可以搭建虚拟局域网,但有时游戏中却找不到的房间,这通常是由于UDP广播没有被发送到虚拟局域网,本文以文明6这款游戏为例,使用Hook技术,拦截socket函数实现UDP广播的的转发,解决找不到房间的问题。

PeaZomboss的博客 5909

MFC实现的广播和组播的例子

MFC实现的播和广播的例子……主要是udp发送和接收组播和广播包……

广播包发送

       默认系统是禁止发送广播包的,需要设置SOL_SOCKET选项来打开广播包发送。这主要是为了防止一些程序并不是设计用来发送广播消息,因为用户的错误输入,而发送了广播消息。比如一个UDP 程序接受一个目标IP地址做为命令行参数,但用户却把这个地址写成了一个广播地址,这时候这个选项的作用就体现出来了,与其让这个UDP程序检验用户输入的是不是个广播地址不如让内核来检测,如果是一个广播地址,但...

stone8761的专栏 2848

UDP下的广播、组播(多播)-VC6

VC6中,纯C使用SOCKET的示例。实现了UDP下的广播、组播(多播)。代码中注释较为丰富,适合学习使用。版本比较老,就免费了!

vuecil3+版本下,兼容ie等不支持es6的低版本浏览器

*综上,完成兼容性涉及到的配置的文件有,对应在页面中查看代码,就不单独附代码了:main.js。

yhr0322的博客 833

使用Winsock:组播编程

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

一世豁然的专栏 2133

Parrot OS最新安装教程

Parrot OS和Kali Linux一样是一个基于 Debian 的免费开源 Linux 发行版,适合安全专家、开发人员、以及关心隐私的人。相较于Kali,Parrot OS属于轻量级,对于硬件的要求无需很高,目前版本已更新到6.3。通过按照本教程的方法,能够成功安装Parrot OS。

🦸💻冰草花生酱提醒您“请记得检查所有电子设备的最后登录时间哦⏰🔍” 4415

windows socket 实现 udp组播接收

socket 组播接收

weixin_42731150的博客 1940

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 387

实战指南:如何用Elasticsearch+Milvus搭建十亿级多模态搜索系统(含性能调优)

本文详细介绍了如何利用Elasticsearch和Milvus构建十亿级多模态搜索系统,包括架构设计、性能调优和实战部署。通过混合架构实现高效文本检索与向量相似度计算,显著提升查询性能与扩展能力,适用于大规模多模态数据处理场景。

x8y9z0的博客 1171

154-网络编程:组播

组播 ​ 单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。 组播既可以用于局域网,也可以用于广域网 客户端需要加入多播组,才能接收到多播的数据 组播地址: ​ IP 多播通信必须依赖于 IP

Edward_LF的博客 481

ComfyUI安装包运行前准备:增加虚拟内存

在Windows系统中,虚拟内存是一种重要的系统资源管理机制,它主要通过将硬盘空间用作内存来扩展系统的可用内存容量。以下是虚拟内存的主要作用: 1. 扩展物理内存容量 当物理内存(RAM)不足时,系统会将一部分数据从内存转移到硬盘上的虚拟内存区域(也称为“分页文件”或“交换文件”)。这样可以为正在运行的程序提供额外的“内存空间”,确保系统能够继续运行,而不会因为内存不足而崩溃。 2. 提高系统稳定性 虚拟内存为系统提供了一个缓冲区。如果没有虚拟内存...

聚梦小课堂 1万+

vc++实现组播传输(2)

  本文将客户端和服务端分开写成两个部分。 1. 客户端 #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int test3() { int iRet = 0; WSADATA wsaData; ...

ty的博客 2392

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

如何查看 WPS 的输入静态地理数据(二进制格式)?

WW、forever的博客 633

将Dify平台开发的工作流集成到Open WebUI中

将Dify开发的工作流集成到Open WebUI是一个能够显著增强AI应用交互能力和业务逻辑深度的有效途径。其核心在于通过API建立两者间的通信桥梁,并确保API在格式、协议和行为上的一致性,特别是向OpenAI Chat API规范看齐。最简单直接的路径是利用Dify的“对话型”或“Agent型”应用,这类应用的API设计更倾向于满足Open WebUI这类聊天前端的期望。然而,面对复杂的现实场景,直接的完美兼容并非总是唾手可得。

形上得其象,形下合于数;阴阳自济,玄理自明。 2030

广播程序开发记录

服务端: #include "stdafx.h" #include   #include   #include   #pragma comment(lib, "ws2_32.lib")   int main()   {       WSADATA wsaData;       WSAStartup(MAKEWORD(2, 2), &wsaData);       

sky101010ws的专栏 436

12、多端神经形态晶体管:原理、应用与算法探索

本文综述了多端神经形态晶体管的原理、应用与算法探索。从神经元MOS晶体管的发展到基于电解质栅极晶体管(EGT)的新型器件设计,系统阐述了其在低电压、多功能逻辑运算和突触行为模拟方面的优势。重点介绍了其在化学生物传感器(如多巴胺和pH检测)中的高灵敏度应用,以及在树突整合、时空总和、动态逻辑和神经元算术等树突算法中的实现。文章还总结了该类器件在神经形态计算、智能传感等领域的广阔前景,并分析了当前面临的材料工艺、理论建模与系统集成挑战,展望了未来发展方向。

delta的博客 143

MFC中用Asyncsocket类实现udp组播

结果: 简单的实现了udp的组播,可以发送,接收消息。 过程: 由Asyncsocket派生一个类出来,重载Onsend和Onreceive; 窗口类里创建一个socket,这里create的第一个参数一定是组播的端口,千万能搞错。 创建的socket加入组播,还可以利用setsocketopt()设置其他属性;此时可以接收信息(可以在onreceive里面进行信息处理) 添加发送按钮

rain的博客 5472

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

windows下IPv4 UDP通信(C++、MFC)

windows下IPv4 UDP通信(C++、MFC)

mahuifa的博客 2031

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

关于组播和WSAJoinLeaf

1. WSASocket的参数 WSA_FLAG_MULTIPOINT_C_LEAF,WSA_FLAG_MULTIPOINT_D_LEAF用于创建一个无根套接字,简单说就是组播组里面各成员是平等的,而 有根的话是有一个主成员,就好比一个服务器对多个客户端模式,具体解释可参考。有根模式是用于ATM协议的,IP协议用的都是无根 模式。 2. WSAJoinLeaf仅仅用于加入组播组,一个组是用组

学而不思则罔 3936
下一篇: 用 NASM 编写代码(转自http://www.codingnow.com/text/nasm.htm)
flashboy
博客等级 码龄27年 15粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值