用VC在局域网实现IP多播通信

我的C/C++之路-005课(模拟路由表的路由选择功能) #include #include /* 模拟路由表的路由选择功能:预先设置路由表,当有一个数据包到来的时候, 查看其目的地址,用该地址与路由表每项的子网掩码相与,若得到的地址与该项地址一致, 则把该数据包从有这个地址的端口转发出去(本例子只适合静态路由,当然没动态路由那么复杂) */ //由于路由表长度未知(由路由器管理员添加),不能使用数组了,这里使用链表吧,如果不会,也可以使用数组模拟 阅读详情
在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。

  众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对点的通信模式不能有效地满足实际应用的需求。例如:一个数字电话会议系统由多个会场组成,当在其中一个会场的参会人发言时,要求其它会场都能即时的得到此发言的内容,这是一个典型的一对多的通信应用,通常把这种一对多的通信称为多播通信。采用多播通信技术,不仅可以实现一个发送者和多个接收者之间进行通信的功能,而且可以有效减轻网络通信的负担,避免资源的无谓浪费。

  广播也是一种实现一对多数据通信的模式,但广播与多播在实现方式上有所不同。广播是将数据从一个工作站发出,局域网内的其他所有工作站都能收到它。这一特征适用于无连接协议,因为LAN上的所有机器都可获得并处理广播消息。使用广播消息的不利之处是每台机器都必须对该消息进行处理。多播通信则不同,数据从一个工作站发出后,如果在其它LAN上的机器上面运行的进程表示对这些数据"有兴趣",多播数据才会制给它们。

  本实例由Sender和Receiver两个程序组成,Sender用户从控制台上输入多播发送数据,Receiver端都要求加入同一个多播组,完成接收Sender发送的多播数据。

  一、实现方法

  1、 协议支持

  并不是所有的协议都支持多播通信,对Win32平台而言,仅两种可从WinSock内访问的协议(IP/ATM)才提供了对多播通信的支持。因通常通信应用都建立在TCP/IP协议之上的,所以本文只针对IP协议来探讨多播通信技术。

  支持多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4、Windows 2000和WindowsXP。自2.1版开始,Windows CE才开始实现对IP多播的支持。本文实例建立在WindowsXP专业版平台上。

  2、多播地址

  IP采用D类地址来支持多播。每个D类地址代表一组主机。共有28位可用来标识小组。所以可以同时有多达25亿个小组。当一个进程向一个D类地址发送分组时,会尽最大的努力将它送给小组的所有成员,但不能保证全部送到。有些成员可能收不到这个分组。举个例子来说,假定五个节点都想通过I P多播,实现彼此间的通信,它们便可加入同一个组地址。全部加入之后,由一个节点发出的任何数据均会一模一样地复制一份,发给组内的每个成员,甚至包括始发数据的那个节点。D类I P地址范围在244.0.0.0到239.255.255.255之间。它分为两类:永久地址和临时地址。永久地址是为特殊用途而保留的。比如,244.0.0.0根本没有使用(也不能使用),244.0.0.1代表子网内的所有系统(主机),而244.0.0.2代表子网内的所有路由器。在RFC 1700文件中,提供了所有保留地址的一个详细清单。该文件是为特殊用途保留的所有资源的一个列表,大家可以找来作为参考。"Internet分配数字专家组"(I A N A)负责着这个列表的维护。在表1中,我们总结了目前标定为"保留"的一些地址。临时组地址在使用前必须先创建,一个进程可以要求其主机加入特定的组,它也能要求其主机脱离该组。当主机上的最后一个进程脱离某个组后,该组地址就不再在这台主机中出现。每个主机都要记录它的进程当前属于哪个组。

  表1 部分永久地址说明

地 址说 明
244.0.0.1基本地址(保留)
244.0.0.1子网上的所有系统
244.0.0.2子网上的所有路由器
244.0.0.5子网上所有OSPF路由器
244.0.0.6子网上所有指定的OSPF路由器
244.0.0.9RIP第2版本组地址
244.0.1.1网络时间协议
244.0.1.24WINS服务器组地址


  3、 多播路由器

  多播由特殊的多播路由器来实现,多播路由器同时也可以是普通路由器。各个多播路由器每分钟发送一个硬件多播信息给子网上的主机(目的地址为244.0.0.1),要求它们报告其进程当前所属的是哪一组,各主机将它感兴趣的D类地址返回。这些询问和响应分组使用IGMP(Internet group management protocol),它大致类似于ICMP。它只有两种分组:询问和响应,都有一个简单的固定格式,其中有效载荷字段的第一个字段是一些控制信息,第二字段是一个D类地址,在RFC1112中有详细说明。

  多播路由器的选择是通过生成树实现的,每个多播路由器采用修改过的距离矢量协议和其邻居交换信息,以便向每个路由器为每一组构造一个覆盖所有组员的生成树。在修剪生成树及删除无关路由器和网络时,用到了很多优化方法。

  4.库支持

  WinSock提供了实现多播通信的API函数调用。针对IP多播,WinSock提供了两种不同的实现方法,具体取决于使用的是哪个版本的WinSock。第一种方法是WinSock1提供的,要求通过套接字选项来加入一个组;另一种方法是WinSock2提供的,它是引入一个新函数,专门负责多播组的加入,这个函数便是WSAJoinLeaf,它是基层协议是无关的。本文将通过一个多播通信的实例的实现过程,来讲叙多播实现的主要步骤。因为Window98以后版本都安装了Winsock2.0以上版本,所以本文实例在WinSock2.0平台上开发的,但在其中对WinSock1实现不同的地方加以说明。

  二、编程步骤

  1、启动Visual C++6.0,创建一个控制台项目工程MultiCase。在此项目工程中添加Sender和Receiver两个项目。

  Receiver项目实现步骤:

  (1)、创建一个SOCK_DGRAM类型的Socket。

  (2)、将此Socket绑定到本地的一个端口上,为了接收服务器端发送的多播数据。
 
  (3)、加入多播组。

  ①、 WinSock2中引入一个WSAJoinLeaf,此函数原型如下:

SOCKET WSAJoinLeaf( SOCKET s, const struct sockaddr FAR *name, int namelen,
LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS, DWORD dwFlags );

  其中,第一个参数s代表一个套接字句柄,是自WSASocket返回的。传递进来的这个套接

  字必须使用恰当的多播标志进行创建;否则的话WSAJoinLeaf就会失败,并返回错误WSAEINVAL。第二个参数是SOCKADDR(套接字地址)结构,具体内容由当前采用的协议决定,对于IP协议来说,这个地址指定的是主机打算加入的那个多播组。第三个参数namelen(名字长度)是用于指定name参数的长度,以字节为单位。第四个参数lpCallerData(呼叫者数据)的作用是在会话建立之后,将一个数据缓冲区传输给自己通信的对方。第五个参数lpCalleeData(被叫者数据)用于初始化一个缓冲区,在会话建好之后,接收来自对方的数据。注意在当前的Windows平台上,lpCallerData和lpCalleeData这两个参数并未真正实现,所以均应设为NULL。LpSQOS和lpGQOS这两个参数是有关Qos(服务质量)的设置,通常也设为NULL,有关Qos内容请参阅MSDN或有关书籍。最后一个参数dwFlags指出该主机是发送数据、接收数据或收发兼并。该参数可选值分别是:JL_SENDER_ONLY、JL_RECEIVER_ONLY或者JL_BOTH。

  ②、在WinSock1平台上加入多播组需要调用setsockopt函数,同时设置IP_ADD_MEMBERSHIP选项,指定想加入的那个组的地址结构。具体实现代码将在下面代码注释列出。

  (4)、接收多播数据。

  Sender实现步骤:

  (1)、创建一个SOCK_DGRAM类型的Socket。

  (2)、加入多播组。

  (3)、发送多播数据。

  3、编译两个项目,在局域网中按如下步骤测试:

  (1)、将Sender.exe拷贝到发送多播数据的PC上。

  (2)、将Receiver.exe拷贝到多个要求接收多播数据的PC上。

  (3)、各自运行相应的程序。

  (4)、在Sender PC上输入多播数据后,你就可以在Receiver PC上看到输入的多播数据。 

 三、程序代码

//////////////////////////////Receiver.c程序代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例使用的多播组地址。
#define MCASTPORT 5150 //绑定的本地端口号。
#define BUFSIZE 1024 //接收数据缓冲大小。
int main( int argc,char ** argv)
{
 WSADATA wsd;
 struct sockaddr_in local,remote,from;
 SOCKET sock,sockM;
 TCHAR recvbuf[BUFSIZE];
 /*struct ip_mreq mcast; // Winsock1.0 */

 int len = sizeof( struct sockaddr_in);
 int ret;
 //初始化WinSock2.2
 if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )
 {
  printf("WSAStartup() failed/n");
  return -1;
 }
 /*
 创建一个SOCK_DGRAM类型的SOCKET
 其中,WSA_FLAG_MULTIPOINT_C_LEAF表示IP多播在控制面层上属于"无根"类型;
 WSA_FLAG_MULTIPOINT_D_LEAF表示IP多播在数据面层上属于"无根",有关控制面层和
 数据面层有关概念请参阅MSDN说明。
 */
 if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
 {
  printf("socket failed with:%d/n",WSAGetLastError());
  WSACleanup();
  return -1;
 }
 //将sock绑定到本机某端口上。
 local.sin_family = AF_INET;
 local.sin_port = htons(MCASTPORT);
 local.sin_addr.s_addr = INADDR_ANY;
 if( bind(sock,(struct sockaddr*)&local,sizeof(local)) == SOCKET_ERROR )
 {
  printf( "bind failed with:%d /n",WSAGetLastError());
  closesocket(sock);
  WSACleanup();
  return -1;
 }
 //加入多播组
 remote.sin_family = AF_INET;
 remote.sin_port = htons(MCASTPORT);
 remote.sin_addr.s_addr = inet_addr( MCASTADDR );
 /* Winsock1.0 */
 /*
 mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR);
 mcast.imr_interface.s_addr = INADDR_ANY;
 if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast)) == SOCKET_ERROR)
 {
  printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d/n",WSAGetLastError());
  closesocket(sockM);
  WSACleanup();
  return -1;
 }
 */
 /* Winsock2.0*/
 if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL, JL_BOTH)) == INVALID_SOCKET)
 {
  printf("WSAJoinLeaf() failed:%d/n",WSAGetLastError());
  closesocket(sock);
  WSACleanup();
  return -1;
 }
 //接收多播数据,当接收到的数据为"QUIT"时退出。
 while(1)
 {
  if(( ret = recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockaddr*)&from,&len)) == SOCKET_ERROR)
  {
   printf("recvfrom failed with:%d/n",WSAGetLastError());
   closesocket(sockM);
   closesocket(sock);
   WSACleanup();
   return -1;
  }
  if( strcmp(recvbuf,"QUIT") == 0 ) break;
  else {
   recvbuf[ret] = '/0';
   printf("RECV:' %s ' FROM <%s> /n",recvbuf,inet_ntoa(from.sin_addr));
  }
 }
 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return 0;
}

/////////////////////////////////////////////////////////////////////Sender.c程序代码
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MCASTADDR "233.0.0.1" //本例使用的多播组地址。
#define MCASTPORT 5150 //本地端口号。
#define BUFSIZE 1024 //发送数据缓冲大小。
int main( int argc,char ** argv)
{
 WSADATA wsd;
 struct sockaddr_in remote;
 SOCKET sock,sockM;
 TCHAR sendbuf[BUFSIZE];
 int len = sizeof( struct sockaddr_in);
 //初始化WinSock2.2
 if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 )
 {
  printf("WSAStartup() failed/n");
  return -1;
 }
 if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
 {
  printf("socket failed with:%d/n",WSAGetLastError());
  WSACleanup();
  return -1;
 }
 //加入多播组
 remote.sin_family = AF_INET;
 remote.sin_port = htons(MCASTPORT);
 remote.sin_addr.s_addr = inet_addr( MCASTADDR );
 if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,
sizeof(remote),NULL,NULL,NULL,NULL,
JL_BOTH)) == INVALID_SOCKET)
 {
  printf("WSAJoinLeaf() failed:%d/n",WSAGetLastError());
  closesocket(sock);
  WSACleanup();
  return -1;
 }

 //发送多播数据,当用户在控制台输入"QUIT"时退出。
 while(1)
 {
  printf("SEND : ");
  scanf("%s",sendbuf);
  if( sendto(sockM,(char*)sendbuf,strlen(sendbuf),0,(struct sockaddr*)&remote,sizeof(remote))==SOCKET_ERROR)
  {
   printf("sendto failed with: %d/n",WSAGetLastError());
   closesocket(sockM);
   closesocket(sock);
   WSACleanup();
   return -1;
  }
  if(strcmp(sendbuf,"QUIT")==0) break;
  Sleep(500);
 }

 closesocket(sockM);
 closesocket(sock);
 WSACleanup();
 return 0;
}

  四、小结

  本实例对IP多播通信进行了探讨,实例程序由Sender和Receiver两部分组成,Sender用户从控制台上输入多播发送数据,Receiver端都要求加入同一个多播组,完成接收Sender发送的多播数据
C++网络编程基础 文章目录UDP概念C++组播QtClientServer UDP 概念 单播 常见于多个client向服务端上报各自消息,用于信息收集,逻辑上是一对一的,因为上报的消息是不同的。此时,客户端的sockaddr_in中的IP地址信息需要设置为具体的服务器地址。 多播 主机被逻辑上归类为两组,后续消息收发都在各自分组上进行,互不影响。此时,服务端需要设置加入组播组和退出组播组的设置即可。 广播 常见于一个客户端向多个服务端广播消息,执行同一个动作或者初始化。此时,需要对客户端的socket设置广播标志以及so 阅读详情

相关推荐

vc++实现简单路由器功能

简单实现路由器功能的小程序 供参考 不足请批评指正

VC++实现路由跟踪

tracert命令及用法Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。 Tracert 工作原理 通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,Tracert 诊断程序确定

尹成的技术博客 4694

LEACH算法 c++实现

这是一个用c++实现的无线传感器网络中较早的一个路由协议LEACH协议,有较高的参考价值,同时为相干程序该进提供重要参考

VC++ 实现获取路由表信息

所谓路由表,指的是路由器或者其他互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。 静态路由表在计算机网络中,路由表或称路由择域信息库(RIB)是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是...

weixin_30279751的博客 414

traceroute在windows下的c++实现源代码

traceroute socket windows c++ 源代码原理 详细解析traceroute的工作原理和实现细节

c++路由器设置工具,支持多款路由器

路由器设置工具

用Visual C++语言在局域网实现IP多播

在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。  众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对点的通信

JamesXing的专栏 2026

vc实现局域网内点对点通信

数据通信实验之一 ---用vc实现局域网内点对点通

用Visual C++实现局域网IP多播(转自天极)最近搞ip对讲涉及到的,收集用

在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。  众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对点的通信

(RING~~~)Arrgghh! For the last time, I'm a Developer, not a Detector! 1267

基于stm32开发的红外循迹小车

2.L298N电机驱动模块:分别是5V,12V,GND,可以通过外加电源给驱动模块供电,IN1,IN2,IN3,IN4,EN1,EN2,通过给IN口不同的电平,可以达到控制电机正反转,EN口为使能口,可以通过给EN口不同的PWM波,来达到控制小车速度,1.红外循迹模块:检测黑线的原理是向外发射红外线,当没有遇到黑线的时候,返回回来,之后返回高电平,当遇到黑线的时候,红外被吸收,返回高电平,读取相应IO口的电平就可以知道小车此时的大致位置;模块有四个输入接口,分别连接四个TT马达,驱动小车运动;

2301_81374681的博客 1万+

MacBook 上 LaTeX 环境搭建:从 Mactex 到 Sublime Text 与 Skim 的保姆级配置流程

本文详细介绍了在MacBook上搭建LaTeX环境的完整流程,从Mactex安装到Sublime Text与Skim的配置优化。涵盖基础环境准备、编辑器设置、PDF预览同步等关键步骤,帮助用户快速建立高效的LaTeX工作流,特别适合学术写作和技术文档创作。

weixin_30824599的博客 680

VC++实现局域网组播

在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。 众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对点的通信

qq398221168的专栏 3047

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

Visual C++实现局域网组播

在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。     众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对

grove6lin的专栏 1万+

逆向分析PerimeterX px3:从混淆JS到生成有效令牌的完整实战

在Web安全与数据采集领域,反自动化防护是保障服务稳定和数据安全的关键技术。其核心原理是通过收集浏览器环境指纹和用户行为特征,动态生成加密令牌来区分真人用户与自动化脚本。这项技术的工程价值在于平衡安全性与用户体验,广泛应用于电商、金融、社交等需要防止恶意爬虫和自动化攻击的场景。本文聚焦于业界广泛部署的PerimeterX px3防护方案,通过JavaScript逆向工程,深入剖析其令牌生成机制。我们将探讨如何运用动态调试、反混淆工具和算法还原等关键技术,突破px3的防护壁垒,为自动化测试和数据采集提供稳定可

diankui6178的博客 523

Halcon实战:5个工业质检案例教你玩转机器视觉(附完整代码)

本文通过5个工业质检实战案例,详细拆解了如何运用Halcon视觉软件库解决精密测量、包装检测、字符识别、透明物缺陷检测及深度学习质检等复杂问题。每个案例均提供完整代码与核心思路,旨在帮助工程师掌握从问题分析到方案落地的系统方法论,提升机器视觉项目的实战能力与鲁棒性。

nut55的博客 260

VC实现局域网组播 C++交流群QQ群:77278127 非一年以上经验勿入。

在局域网中,管理员常常需要将某条信息发送给一组用户。如果使用一对一的发送方法,虽然是可行的,但是过于麻烦,也常会出现漏发、错发。为了更有效的解决这种组通信问题,出现了一种多播技术(也常称为组播通信),它是基于IP层的通信技术。为了帮助读者理解,下面将简要的介绍一下多播的概念。 众所周知,普通IP通信是在一个发送者和一个接收者之间进行的,我们常把它称为点对点的通信,但对于有些应用,这种点对点的通信

C++编程的专栏 2087

Oracle EBS和华为MetaERP在会计科目(COA)设计上的观察非常精准。这两种设计确实代表了两种截然不同的系统架构思想,我们可以从设计哲学、优劣对比和演进关系三个方面进行深入分析。

OracleEBS与华为MetaERP的COA设计对比分析 OracleEBS采用弹性域架构,通过固定段数字符串实现多维度核算,强调稳定性和全球统一标准,但修改成本高、扩展性受限。华为MetaERP采用解耦架构,将核算单元、自然科目和核算维度分离,支持动态扩展和灵活调整,更适合业务快速变化的企业。 OracleEBS优势在于强一致性和成熟稳定,劣势是灵活性差;华为MetaERP优势是极致灵活性,劣势是对管理要求高。两者代表了不同时代的企业软件设计理念:OracleEBS适合标准化需求,MetaERP则面向快

金牌架构师 429

用Visual C++编程实现局域网多播

最近一直在看<<Unix网络编程>>这本书,觉得这本书很适合初学socket编程的人。我一直对于多播的实现比较模糊,在看了书上的多播部分的介绍,才发现在程序中实现一个基本的多播功能是如此简单。     在这里我不想照本宣科的大说什么理论,概念的东东,我的目的是说明在我们的代

欧阳天涵的专栏 1164

RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10

Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本文将详细介绍如何使用Buildroot编译并配置Qt5WebEngine-5.15.10。Qt5WebEngine是Qt框架中的一个模块,它提供了一个功能强大的Web浏览器引擎,允许开发者在Qt应用程序中嵌入和显示现代网页内容。

flypig has a dream! 1158

CPD (Coherent Point Drift) 算法实现点云配准 C++版

作为和icp并列的点集配准算法cpd为什么没有icp火,等我把整个方案跑完才明白。 首先下载cpd https://github.com/gadomski/cpd 包含的fgt https://github.com/gadomski/fgt 下载到win10的解压后 运行cmake来进行编译 这个时候会提醒缺少eigen3 fgt python 这几个都安装排除后 在build文件夹下会生成vs2017的源码,右键全部生成后在 .\cpd-master\build\Debug 下会生成一个cpd.li

uranus1992的博客 3510

c++网络编程

C++开发高性能网络程序(ACE) [本文发表于《程序员》杂志 2003年第12期,作者孟岩]基于TCP/IP的编程格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、

fg100emil的专栏 8043

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++多线程实现网络中的进程tcp/ip通信

socket 网络编程(windows版) c++多线程实现网络中的进程tcp/ip通信 进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列) 同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族

yxg520s的博客 4562

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机网络实验设计-网络聊天程序的实现

网络聊天程序的实现 一.设计题目 网络聊天程序的设计与实现 二.设计内容 1.设计主要内容 了解Socket通信原理,会使用Socket进行进行简单的网络编程,在此基础上设计编写一聊天程序,能够实现通过运行程序,两台计算机之间可以通信。 2.知识要点介绍 WinSock 并不是一种网络协议,它只是一个网络编程接口,也就是说,它不是协议,但是它可以 访问很多种网络协议,你可以把它当作一些协议的封装。...

九岁ya的博客 9188

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

C/C++语言实现WiFi(socket)数据收发(客户端和服务端) C/C++实现TCP通信、接收WIFI数据

XiaoCaiDaYong的博客 4198
上一篇: 深入浅出Win32多线程程序设计--之综合实例
下一篇: 线程基本知识点
Mobidogs
博客等级 码龄21年 186粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值