网络编程--socket编程

这里写目录标题

  • 套接字
    • 概念
    • 通信原理
    • 总结
  • 预备知识
    • 网络字节序
      • 简介
      • 字节转换函数
    • IP地址转换函数
      • 为什么单独列出
      • 函数原型
      • sockaddr结构体
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

套接字

概念

在这里插入图片描述
Socket本身有插座的意思,但他是进程之间网络通信的一种特殊文件,本质是缓冲区形成的伪文件,
所以,网络进程之间的数据传递,主要依靠套接字文件

通信原理

在这里插入图片描述
Socket有插头插座的意思,所以,如果想要实现网络进程之间的通信,套接字必须成对出现
在这里插入图片描述
由于套接字是一个特殊的缓存区形成的文件,所以可以使用文件描述符引用套接字,并可以借助文件描述符进行数据的读写操作,实现网络进程之间的数据传输
在这里插入图片描述

总结

在这里插入图片描述

预备知识

网络字节序

简介

在这里插入图片描述
问题产生:计算机本地使用的是小端法进行二进制的存储,即高位高地址,地位低地址。
但是网络流中是使用的大端法,所以要想实现通信的正常进行,就要进行转换

字节转换函数

在这里插入图片描述
htonl 将其拆分进行记忆
例如 htonl 拆分成 h to n l
h是本地,to是到,n是网络,l是long型,表示32位即4字节
所以是本地转向网络,且是long型数据,所以针对的是IP
ntohs 拆分成 n to h s
表示从网络到本地,且是short型,16位2字节,等效于int,所以针对的是端口号(port)
在这里插入图片描述
以从本地到网络为例:如果主机是小端字序,那么函数就发挥了应有的作用,转为大端字序然后返回,如果主机本来就是大端字节序,那么这些函数不做转换,将参数原封不动进行返回,总之函数结果是大端字节序
从网络到本地恰恰相反,函数的结果是小端字节序

IP地址转换函数

为什么单独列出

因为使用上面的字节转换函数,都是参数为整型时才可以使用(long short int都是整型)
而接下来的IP地址转换函数,是直接进行string与整型的转换

函数原型

在这里插入图片描述
在这里插入图片描述
以inet_pton函数为例,因为下划线后面是p to n,所以是本地字节序转网络字节序
函数参数第一个是IP版本,分为IPv4与IPv6,对于这两个选项有两个宏,分别是AF_INEF、AF_INET6
第二个参数传入本地IP地址(形式是点分十进制)
第三个参数是dst指针,利用该参数进行数据的返回,一个指针存储转换完成后的网络字节序类型的IP地址

而函数自己的返回值是int,有三个数1、0、-1,具体含义在上图列出,
所以说 第一个函数有两个返回值,一个是函数自己的返回值,表示状态(是否成功)
另一个是通过指针参数返回,返回具体的网络字节序

第二个函数inet_ntop函数,表示从网络字节序到本地字节序
第一个参数是版本号,第二个参数是网络字节序类型的IP地址,第三个参数是转换完成后的本地字节序(string类型)类型的IP地址,最后一个参数是dst的大小

小tips:在Linux命令行中输入man 函数名
会显示该函数的帮助文档
在这里插入图片描述
在这里插入图片描述

sockaddr结构体

在这里插入图片描述
具体关于sockaddr的解释,在Linux命令行中输入man 7 ip即可查看

sockaddr结构体,是一组数据的集合,现在被优化成了两个版本,分别是sockaddr_in 以及 sockaddr_in6,分别表示IPv4以及IPv6,如下图所示:
在这里插入图片描述
在这里插入图片描述
在之后的许多关键函数中,函数参数都是sockaddr,(如上图所示)但是我们现在都是使用sockaddr_in或者sockaddr_in6,如何解决这个问题呢:
在这里插入图片描述
我们在定义结构体时,就用现在更高级的sockaddr_in类型来定义,例如我们定义的结构体变量是addr
然后我们在向一些原型是sockaddr的函数传参时,将sockaddr_in类型变量的地址进行一个强转,转为 struct sockaddr * 类型,如上图

然而对于sockaddr_in结构体,有如下所示成员
在这里插入图片描述
我们在定义结构体之后,同时要对其成员进行初始化,
第一个成员是sin_family,他是IP版本,赋值为两个版本的宏
第二个成员是sin_port,根据上图的注释可以看出,这个端口号要求是网络字节序的端口号,我们可以使用前面学习的字节转换函数htons(传入本地端口号(整型))
第三个成员是一个结构体in_addr,他里面之后一个成员uint32_t,根据注释,可知他是一个网络字节序的IP地址,对于这一步的初始化,最常用的下图中的【*】语句,即使用一个库宏INADDR_ANY,他表示系统任意一个有效的IP地址,二进制整型,这里就是得到本机的IP地址,所以可以直接传入htonl函数,得到网络字节序的IP地址,赋值给第三个成员
在这里插入图片描述

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

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

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

相关文章

Win10搜索功能失效用不了的解决方法

在Win10电脑中,用户点击搜索框,输入想要搜索的内容,点击搜索即可。但是,有用户遇到了搜索功能坏掉的问题,导致自己不能正常使用搜索功能。下面小编将带来Win10系统搜索功能失效用不了的简单解决方法,操作后…

【开源】基于JAVA语言的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

2024年【四川省安全员A证】及四川省安全员A证实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员A证是安全生产模拟考试一点通总题库中生成的一套四川省安全员A证实操考试视频,安全生产模拟考试一点通上四川省安全员A证作业手机同步练习。2024年【四川省安全员A证】及四川省安全员A证实操考…

枚举(蓝桥杯备赛系列)acwing版

枚举 前言 hello,大家好,前面一段时间已经是把acwing Linux基础课讲完了,其实那些内容完全可以带领小白入门Linux我说过如果有人留言要Linux和Windows server 配置DNS Web ftp 的内容我就做一期,但是没人留言我也就先不自作多情了…

三菱PLC开关量防抖滤波功能块

开关量防抖滤波功能块梯形图和SCL代码请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/134936233https://rxxw-control.blog.csdn.net/article/details/134936233三菱PLC防抖滤波的另一种写法如下 https://rxxw-control.blog.csdn.net/article/det…

时间和空间复杂度

目录 算法的复杂度 时间复杂度 大O的渐进表示法 各种求时间复杂度例题: 计算冒泡排序的时间复杂度: 计算两个循环的时间复杂度: 计算二分查找的时间复杂度: 计算阶乘递归的时间复杂度: 计算斐波那契递归的时间…

2023年12月25日学习总结——MLP

💡我准备每一天都写一个学习总结,周末再把每日的学习总结汇总成专门的文章 🔆我的学习总结主要是为了自己的个人学习,没有商业用途,侵删 okkk开始今日学习 目录 1、今日计划学习内容2、今日学习内容深入学习MLP&#…

《C++避坑神器·二十四》简单搞懂json文件的读写之根据键值对读写Json

c11 json解析库nlohmann/json.hpp文件整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。 json.hpp库在文章末尾下载 读写主要有两种方式,第一种根据键值对读写&…

“React学习之旅:从入门到精通的点滴感悟“

在探索和学习React的过程中,我逐渐领悟到了前端开发的魅力与挑战。React,作为Facebook推出的开源JavaScript库,以其独特的思维方式和强大的功能,引领着前端开发的潮流。在这篇文章中,我将分享我的React学习心得&#x…

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息,以生成最有效的查询执行计划&#…

mysql 26day 数据库双主双从 搭建mycat 数据库负载均衡 读写分离

目录 搭建一个(双主双从) (然后搭建mycat)四台主机配置master1 (主库1)master2 (主库2)slave 1(从库1)master1 (主库1)slave 1(从库1) 写入数据(测试)mycat安装java安装mycat编辑文件server.xml编辑文件schema.xml配置 mycat 用户配置schema.xml启动myca…

C++ Qt开发:Charts绘制各类图表详解

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWidget与QCharts的常用方法及灵活运用。 …