网络编程:多点通信+域套接字

一、多点通信

1.网络属性

getsockopt和setsockopt

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

功能:获取或设置套接字相关层中某个属性的值

参数1:要设置或者获取的套接字文件描述符

参数2:要操作的层

        SOL_SOCKET:表示应用层

        IPPROTO_TCP:表示传输层的tcp

        IPPROTO_UDP:表示传输层的udp

        IPPROTO_IP:表示网络层

参数3:某层中要操作的属性

参数4:要给套接字属性设置的值,大部分是整型,设置该属性用1,禁用该属于用0

参数5:参数4的大小

返回值:成功返回0,失败返回-1并置位错误码

二、多点通信

1.单播

主机之间一对一的通信模式,交换机以及路由器只对数据进行转发工作,不做复制工作

每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的。

2.广播

主机之间是一对多的通信模式,网络对其中的每一台主机都会将消息进行转发

在当前网路下的所有主机都会收到广播消息(无论对方是否愿意接受)

广播实现的方式是基于UDP通信模型

广播地址:当前网络号+全是1的主机号

广播消息不允许穿过路由器

2.2.1广播发送端流程-----》类似与UDP的客户端

1.socket:创建套接字

2.setsockopt:设置网络属性,允许广播SOL_SOCKET中的SO_BROADCAST属性

3.bind:可以绑定也可以不绑定

4.填充接受消息的地址信息结构体

        IP:广播地址

        PORT:和接收端保持一致

5.sendto/recefrom:收发数据

6.close:关闭套接字

2.2.2广播接收端流程----》类似于UDP的服务器端

1.socket:创建套接字

2.bind:必须绑定端口号和IP

        IP:广播地址

        PORT:跟发送端保持一致

3.sendto/recvfrom:收发数据

4.close:关闭套接字

代码:

广播发送端流程

#include <head.h>
int main(int argc, char const *argv[])
{// 1.创建套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("socket");return -1;}// 2.设置允许广播int broadcast = 1;if (setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) == -1){perror("setsockopt");return -1;}// 3.绑定// 4.填充接收端地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);rin.sin_addr.s_addr = inet_addr("192.168.117.255");// 5.发送消息char sbuf[128] = "0";while (1){printf("请输入>>>");fgets(sbuf, sizeof(sbuf), stdin);sbuf[strlen(sbuf) - 1] = 0;// 将数据发送出去sendto(sfd, sbuf, sizeof(sbuf), 0, (struct sockaddr *)&rin, sizeof(rin));printf("发送成功\n");}// 6.关闭套接字close(sfd);return 0;
}

广播接收端

#include <head.h>
int main(int argc, char const *argv[])
{// 1.创建套接字int rfd = socket(AF_INET, SOCK_DGRAM, 0);if (rfd == -1){perror("socket");}printf("rfd=%d\n", rfd);// 2.绑定IP地址和端口号// 2.1填充地址信息结构体struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666);rin.sin_addr.s_addr = inet_addr("192.168.117.255");// 2.2绑定if (bind(rfd, (struct sockaddr *)&rin, sizeof(rin)) == -1){perror("bind");return -1;}printf("bind success\n");// 3.接受消息char rbuf[128] = "0";while (1){// 清空容器bzero(rbuf, sizeof(rbuf));// 从套接字中读取数据recv(rfd, rbuf, sizeof(rbuf), 0);printf("收到的消息为:%s\n", rbuf);}// 4.关闭套接字close(rfd);return 0;
}

三、域套接字

1.在使用套接字完成跨主机的通信时,需要借助网络并且使用IP地址和端口号完成客户端与服务器的通信

2.如果只需要完成同一主机之间多个进程的通信时,在有网的情况下,也可以使用IP地址和端口号完成

3.如果没有网络的情况下,可以使用域套接字完成通信

4.域套接字需要借助socket套接字文件来完成,这是一种特殊的文件,只用于传输数据,不用于存储数据,该文件的类型为s

bcd-lsp

b:块设备文件

c:字符设备文件

d:目录

-:普通文件

l;链接文件

s:套接字

p:管道

5.域套接字通信也为流式域套接字和报式域套接字

6.套接字的创建要求

int socket(int domain, int type, int protocol);

功能:创建用于通信的一个端点,并返回对应的文件描述符,文件描述符按最小未使用原则分配 参数1:规定通信域

                AF_UNIX, AF_LOCAL 同一主机之间多进程通信 具体内容可查看 man 7 unix

参数2:传输方式或类型

                SOCK_STREAM 支持TCP通信方式

                SOCK_DGRAM 支持UDP通信方式

                SOCK_RAW 支持原始套接字通信

参数3:协议

                如果第二参数指定了SOCK_STREAM或SOCK_DGRAM则第三个参数填0

                如果第二个参数为SOCK_RAW,则第三个参数需要指定对应的协议

                        对于TCP通信:IPPROTO_TCP

                        对于UDP通信:IPPROTO_UDP

返回值:成功返回创建出的套接字文件描述符,失败返回-1并置位错误码

1.流式域套接字服务器

#include <head.h>
int main(int argc, char const *argv[])
{// 1.创建用于链接的套接字文件买哦舒服int sfd = socket(AF_UNIX, SOCK_STREAM, 0);if (sfd == -1){perror("socket");return -1;}printf("socket success\n");// 判断要绑定的套接字是否存在if (access("./unix", F_OK) == 0){// 将文件删除if (unlink("./unix") == -1){perror("unlink");return -1;}}// 2.绑定套接字文件// 2.1填充地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;strcpy(sun.sun_path, "./unix");if (bind(sfd, (struct sockaddr *)&sun, sizeof(sun)) == -1){perror("bind");return -1;}printf("bind success\n");// 3.启动被动监听if (listen(sfd, 128) == -1){perror("listen");return -1;}// 4.等待客户端链接请求// 4.1定义地址信息结构体,用于接受客户地址信息结构体struct sockaddr_un cun;socklen_t socklen = sizeof(cun);// 4.2接受客户端int newfd = accept(sfd, (struct sockaddr *)&cun, &socklen);if (newfd == -1){perror("accept");return -1;}// 5.相互通信char rbuf[128] = "0";while (1){// 将容器清空bzero(rbuf, sizeof(rbuf));// 从套接字中读取数据int res = recv(newfd, rbuf, sizeof(rbuf) - 1, 0);if (res == 0){printf("客户端下线\n");break;}printf("%s :%s\n", cun.sun_path, rbuf);// 加个笑脸回过去strcat(rbuf, "*_*");send(newfd, rbuf, strlen(rbuf), 0);printf("发送成功\n");}return 0;
}

2.流式域套接字客户端

#include <head.h>
int main(int argc, char const *argv[])
{// 1.创建客户端套接字int cfd = socket(AF_UNIX, SOCK_STREAM, 0);if (cfd == -1){perror("socket");return -1;}printf("socket success\n");// 判断要绑定的套接字是否存在if (access("./linux", F_OK) == 0){// 将该文件删除if (unlink("./linux") == -1){perror("unlink");return -1;}}// 2.绑定套接字文件// 2.1填充客户端地址信息结构体struct sockaddr_un cun;cun.sun_family = AF_UNIX;strcpy(cun.sun_path, "./linux");// 2.2绑定端口号和IPif (bind(cfd, (struct sockaddr *)&cun, sizeof(cun)) == -1){perror("bind");return -1;}printf("bind success\n");// 3.连接服务器// 3.1填充要连接服务器的地址信息结构体struct sockaddr_un sun;sun.sun_family = AF_UNIX;     // 地址族strcpy(sun.sun_path, "unix"); // 套接字文件// 3.2连接服务器if (connect(cfd, (struct sockaddr *)&sun, sizeof(sun)) == -1){perror("connect");return -1;}printf("连接成功\n");// 4.收发数据char buf[128] = "0";while (1){printf("请输入》》》");fgets(buf, sizeof(buf), stdin); // 从终端获取字符串buf[strlen(buf) - 1] = '\0';// 判断输入的字符串值if (strcmp(buf, "quit") == 0){break;}// 将数据发送给服务器send(cfd, buf, strlen(buf), 0);// 将字符数组清空bzero(buf, sizeof(buf));recv(cfd, buf, sizeof(buf) - 1, 0);printf("收到服务器消息为:%s \n", buf);}// 5.关闭套接字close(cfd);return 0;
}

3.注意事项

1.绑定套接字文件时,需要绑定一个不存在的套接字文件

2.对于客户端而言,如果不不绑定套接字文件,那么系统不会自动绑定套接字文件,客户端的套接字文件内容为空

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSH服务

目录 一. 熟悉SSH服务 1.1 何为SSH协议 1.2 SSH服务优点 1.3 常见的SSH协议 1.4 SSH服务的功能 1.5 为何使用SSH服务 1.6 SSH服务的工作原理 1.6.1 公钥传输原理 1.6.2 ssh加密通讯原理 1.7 SSH服务的最佳应用场景 1.8 SSH服务远程登录的方式 1.8.1 方法一&#…

自动驾驶决策 - 规划 - 控制 (持续更新!!!)

总目录 Frenet与Cartesian坐标系 Apollo基础 - Frenet坐标系 车辆模型 车辆运动学和动力学模型 控制算法 PID控制器轨迹跟随实现 Pure Pursuit控制器路径跟随 路径跟踪算法Stanley 实现 c 无人驾驶LQR控制算法 c 实现 MPC自动驾驶横向控制算法实现 c 双环PID控制详细讲解 …

【DL经典回顾】激活函数大汇总(二十六)(Identity附代码和详细公式)

激活函数大汇总&#xff08;二十六&#xff09;&#xff08;Identity附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或缺的…

大模型面试题最全总结,没有一道是送分题。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

3月19日做题

[NPUCTF2020]验证&#x1f40e; if (first && second && first.length second.length && first!second && md5(firstkeys[0]) md5(secondkeys[0]))用数组绕过first1&second[1] 这里正则规律过滤位(Math.) (?:Math(?:\.\w)?) : 匹配 …

优化器算法SGD、Adam、AdamW等

文章目录 SGDSGD with momentumSGD with Nesterov AccelerationAdaGradRMSpropAdaDeltaAdamAdamW参考资料 假设有&#xff1a; 待优化的目标函数为 f ( w ) f(w) f(w)&#xff0c;使用优化算法来最小化目标函数 f ( w ) : a r g m i n w f ( w ) f(w):argmin_wf(w) f(w):argmin…

【Mysql】面试题汇总

1. 存储引擎 1-1. MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; 答&#xff1a; MySQL 支持的存储引擎包括 InnoDB、MyISAM、Memory 等。 Mysql 5.5 之前默认的是MyISAM&#xff0c;Mysql 5.5 之后默认的是InnoDB。 可以通过 show engines 查看 Mysql 支持…

外包2月,技术退步惊现!大专生逆袭大厂,全靠这份神秘资料!

大家好&#xff0c;我是一名大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;从事功能测试工作已近4年。今年8月&#xff0c;我意识到长期舒适的环境让我变得不思进取&#xff0c;技术停滞不前&#xff0c;甚至因此失去了谈了2年的女朋友。我下定决心&#xff0c…

金蝶云星空——插件dll重新发布报错:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�

项目场景&#xff1a; 金蝶插件开发 问题描述 今天更新了插件dll然后重启IIS金蝶就报如下错误&#xff1a; 解决方案&#xff1a; 折腾了一天结果发现是给自己挖坑了&#xff0c;这次更新我担心插件代码有问题就把原dll重命名了然后把最新dll更新到金蝶bin文件中&#xff0c…

【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 经典CAN/CANFD DBC自动生成C语言代码 2.1 批处理文件CAN_DBC_To_C.bat内容说明 2.2 经典CAN/CANFD DBC文件要求 2.3 如何使用生…

网站引用图片但它域名被墙了或者它有防盗链,我们想引用但又不能显示,本文附详细的解决方案非常简单!

最好的办法就是直接读取图片文件&#xff0c;用到php中一个常用的函数file_get_contents(图片地址)&#xff0c;意思是读取远程的一张图片&#xff0c;在输出就完事。非常简单&#xff5e;话不多说&#xff0c;直接上代码 <?php header("Content-type: image/jpeg&quo…

clipboard好用的复制剪切库

clipboard是现代复制到剪贴板的工具&#xff0c;其 gzip 压缩后只有 3kb&#xff0c;能够减少选择文本的重复操作&#xff0c;点击按钮就可以复制指定内容&#xff0c;支持原生HTMLjs&#xff0c;vue3和vue2。使用方法参照官方文档&#xff0c;so easy&#xff01;&#xff01;…

装X神器,装X图片生成器,高富帅模拟器

先展示两张效果 基金装X图 短信存款图 神器功能展示 总共有12大类可供用户选择 还有一些美感的&#xff1a; 总结 总之种类非常多&#xff0c;有了这个神器你懂的&#xff5e; 关注下方公众号&#xff0c;回复【zzsq】即可获取。

2、鸿蒙学习-申请调试证书和调试Profile文件

申请发布证书 发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书&#xff0c;可保障软件代码完整性和发布者身份真实性。证书格式为.cer&#xff0c;包含公钥、证书指纹等信息。 说明 请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。 1、登录AppGa…

Linux软件管理(1)

软件管理 下载 wget Linux wget是一个下载文件的工具&#xff0c;它用在命令行下。 wget工具体积小但功能完善&#xff0c;它支持断点下载功能&#xff0c;同时支持FTP和HTTP下载方式&#xff0c;支持代理服务器和设置起来方便简单。 1.语法 wget [选项]……[URL]…… 2、…

阅读基础知识1

一 网络 1. 三次握手四次挥手 三次握手&#xff1a;为了建立长链接进行交互即建立一个会话&#xff0c;使用 http/https 协议 ① 客户端产生初始化序列号 Seqx &#xff0c;向服务端发送建立连接的请求报文&#xff0c;将 SYN1 同步序列号&#xff1b; ② 服务端接收建立连接…

洛谷_P1068 [NOIP2009 普及组] 分数线划定_python写法

P1068 [NOIP2009 普及组] 分数线划定 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点&#xff1a; 这道题用到了自定义排序规则 n, m map(int,input().split()) data [] for i in range(n):l list(map(int,input().split()))data.append(l)import functoolsdef my_cm…

香港科技大学广州|智能制造学域博士招生宣讲会—同济大学专场

时间&#xff1a;2024年3月28日&#xff08;星期四&#xff09;10:00 地点&#xff1a;同济大学嘉定校区济人楼310 报名链接&#xff1a;https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾&#xff1a;崔华晨 助理教授 跨学科重点研究领域 •工业4.0 •智能传感器、自动光学检…

web攻防——csrf,ssrf

csrf 当我们在访问自己的管理员系统的时候&#xff0c;打开别人发的钓鱼连接就会自动增加管理员&#xff08;前提&#xff0c;后台在登录状态&#xff09;当我们打开别人发的网站&#xff0c;就会触发增加管理员的数据包 假设我们要测试这个网站 看到这个&#xff0c;就得下载一…

计算机组成原理-3-系统总线

3. 系统总线 文章目录 3. 系统总线3.1 总线的基本概念3.2 总线的分类3.3 总线特性及性能指标3.4 总线结构3.5 总线控制3.5.1 总线判优控制3.5.2 总线通信控制 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理&#xff08;上&#xff09;_哈尔滨工业大学》、《计算机组成原理…