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

比如初学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. MyBatis中的OGNL教程

    MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索 ...

  2. mysql慢查询配置(5.7)

    刚装了Windows版mysql,想开启慢查询日志. 修改D:\mysql-5.7.23-winx64下my.ini配置文件,添加: [mysqld]slow_query_log = onslow_q ...

  3. python 省略号 三个点...的含义

    总结一下: 1.省略号在python里也是个对象. 2.=...(赋值号后面省略号),给该变量赋值一个default值.具体python的机制我不清楚.应该是在类里面定义好的. 3.: ...(冒号后 ...

  4. 包过滤防火墙iptables(网络层)

    安装: yum -y install iptables-services 启动:systemctl start iptables.service 四表五链 过滤:filter - input forw ...

  5. C++头文件中#pragma once与#ifndef……#define……#endif

    两者功能一样,防止重复包含被多次编译.建议头文件加入#pragma once C++头文件开头的两句与结尾的一句#ifndef <标识>#define <标识>类代码#endi ...

  6. 图的最小生成树(java实现)

    1.图的最小生成树(贪心算法) 我两个算法的输出都是数组表示的,当前的索引值和当前索引对应的数据就是通路,比如parent[2] = 5;即2和5之间有一个通路,第二个可能比较好理解,第一个有点混乱 ...

  7. vue-cli3构建多页面应用2.0

    1.0版本点这里 -> 博客:vue-cli3构建多页面应用1.0   github:vue-cli-multipage 在1.0版本上做了以下改进: 1. 增加pages.config.js, ...

  8. 2019CCPC秦皇岛自我反省&部分题解

    练了一年半了,第一次打CCPC,险些把队友坑了打铁,最后也是3题危险捡了块铜. 非常水的点双连通,我居然不相信自己去相信板子,唉,结果整来整去,本来半个小时能出的题,整到了3个小时,大失误呀,不然就可 ...

  9. SSH 中文乱码解决

    在终端执行命令:export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312是最有效的. 这种方法是临时的,只对当前SSH客户端有效,重启后依然乱码. 1.不 ...

  10. Ant环境搭建

    1.上传安装包到linux服务器 2.解压缩 tar zxvf  apache-ant-1.10.1-bin.tar.gz 3.修改环境变量 vim /etc/profile 添加以下内容 expor ...