每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不太舒服。 我感觉, 我偏向后者, 必须有一个结果作用于我, 我才有感触。

比如初学C语言, 我也很不喜欢老师总在讲什么原码, 反码和补码, 讲什么 32767 + 1 为什么等于-32768, 讲什么m.nf%控制输出的具体含义.
 我更喜欢搞个阶乘运行一下来玩玩, 搞个简单的界面问答系统感知一下, 搞个排序或者汉诺塔什么的玩玩。 等玩到一定程度, 再回去学那些略显枯燥的无聊知识。

好吧, 不扯了, 毕竟每个人的学习习惯不一样。

在本文中, 我就不大讲特讲组播了,  至于组播概念和原理, 度娘谷哥会告诉你, 请自学去, 其实也很简单。当然,
如果后续有必要涉及, 我也会介绍一下。 现在仅仅来实战一下组播。

(有必要说明一下, 下面两个程序必须运行在相同的机器上才有效)

发送程序为:

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); int n = 0; // 注意, 这个n值很重要, 下面我会讲到
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&n, sizeof(n)); sockaddr_in addr;
addr.sin_addr.S_un.S_addr = inet_addr("234.2.2.2");
addr.sin_family = AF_INET;
addr.sin_port = htons(8888); static int i = 0;
while(1)
{
char buf[100] = {0};
sprintf(buf, "blablablabla:%d", i++);
sendto(sock, buf, strlen(buf) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr));
Sleep(500);
} closesocket(sock);
WSACleanup(); return 0;
}

运行它。

加入组播的接收程序为:

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_port = htons(8888); bind(sock, (sockaddr*)&addr, sizeof(addr)); // 加入组播啦
ip_mreq multiCast;
multiCast.imr_interface.S_un.S_addr = INADDR_ANY;
multiCast.imr_multiaddr.S_un.S_addr = inet_addr("234.2.2.2");
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast)); int len = sizeof(sockaddr);
while(true)
{
char buf[100] = {0};
recvfrom(sock, buf, sizeof(buf) - 1, 0, (sockaddr*)&addr, &len);
printf("%s\n",buf);
} closesocket(sock);
WSACleanup(); return 0;
}

运行它。

结果如下(两个进程通信了):

上面我们说过, 如上两个程序必须运行在同一电脑上才有效, 那要运行在不同的电脑上, 该怎么办呢? 我们注意到, 在发送程序中有int n = 0; 这个n为零表示发送端和接收端必须位于同一机器上, 如果n为1, 那么发送端和接收端就可以位于不同机器上了, 只需要他们位于同一个子网内即可。 实战过程如下: 假设pc0, pc1, pc2, pc3...在同一个子网内,将发送端的n改为 1且, 运行在pc0上, 然后在pc1, pc2, pc3...上运行接收端, 可以发现, pc1, pc2, pc3都接收到了组播消息,
与我们预期的结果吻合。

好吧, 先这样。

【VS开发】组播(多播)的C程序实战的更多相关文章

  1. 浅谈Android中的组播(多播)

    组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IP ...

  2. 【网络开发】UDP组播接收端解析

    UDP组播接收端解析 网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包.在广域网中,还涉及到路由器支持组播路由 ...

  3. 使用 codeblocks 编写C++ udp组播程序遇到的问题

    编译错误 会出现好多undefined reference to'WSAStartup to@8之类的错误,都是undefind开头的 解决方法: Settings -> Compiler se ...

  4. <转>单播,广播,组播的缺点与优点

    原文链接:http://apje.blog.163.com/blog/static/145345252007101175714761/ 当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播 ...

  5. Android开发:组播(多播)与广播

    近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播) 背景知识:组播使用UDP对一定范 ...

  6. linux网络编程之一-----多播(组播)编程

    什么是多播 组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送.对其形象的比喻就是类似于广播电台和电视 ...

  7. Java单播、广播、多播(组播)---转

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  8. Java单播、广播、多播(组播)

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  9. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

随机推荐

  1. 解决CMD控制台乱码问题

    在cmd控制台中出现乱码情况如下 解决方式1 在控制台中输入    CHCP65001 按enter回车键查看 注:CHCP是一个计算机指令,能够显示或设置活动代码页编号. 代码页    描述6500 ...

  2. 分布式hadoop 架构图

    zk:zookeeper NN:namenode DN:datanode ZF Failover Controller:简称zkfc ,是zk的客户端,只运行在主备的namenode上,主要作用是判断 ...

  3. linux终端相关概念解释及描述

    基本概念: 1. tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被 ...

  4. (六)绘图,文本编程,定时器,菜单,图标icon,消息类型

    1,简单绘图 画直线 a,鼠标按下和抬起 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代 ...

  5. 【CUDA 基础】6.1 流和事件概述

    title: [CUDA 基础]6.1 流和事件概述 categories: - CUDA - Freshman tags: - 流 - 事件 toc: true date: 2018-06-10 2 ...

  6. 使用shell脚本完成自动化部署及秒级回滚

    一.部署机代码目录结构 使用www用户进行代码部署,所有部署机上需要创建www用户,并赋予根目录权限,同时配置公私钥认证建立信任关系. [www@ansible-node1 deploy]$ tree ...

  7. php-m 与 phpinfo 不一致的解决办法

    1.查看PHP当前加载的php.ini文件地址,在控制台输入以下命令: 1 php -i | grep php.ini 2.控制台返回的信息 1 2 Configuration File (php.i ...

  8. maven上传jar包(oracle jdbc驱动)

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库.一.首先要得到Oracle J ...

  9. go面试

    **1**.简述golang中make和new的区别 make用于内建类型(只能用于创建map.slice 和channel)的内存分配.并且返回一个有初始值(非零)的T类型,而不是*T. new用于 ...

  10. TCP拥塞控制算法

    转自浅谈TCP拥塞控制算法 本篇文章介绍了几种经典的TCP拥塞控制算法,包括算法原理及各自适用场景. 回顾上篇文章:浅谈 redis 延迟 前言 TCP 通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的 ...