45 套接字

本节重点

认识ip地址,端口号,网络字节序等网络编程中的基本概念
学习scoket,api的基本用法
能够实现一个简单的udp客户端/服务端
能够实现一个简单的tcp客户端/服务器(但链接版本,多进程版本,多线程版本)
理解tcp服务器建立连接,发送数据,断开连接的过程

目录

1. 理解ip地址和目的ip地址

在ip数据包头部中,有两个地址,分别叫做源ip地址和目的ip地址
思考,我们光有ip地址就可以完成通信了吗?想象一下qq发消息的例子,有了ip地址就能够把消息发送到对方的机器上,还需要有一个其他的表示来区分出,这个数据要给哪一个程序进行解析

2. 端口号

网络协议中的下三层主要解决的是数据安全可靠的发送到远端机器
用户使用应用层软件,完成数据发送和接收,需要先把软件启动起来,软件就是进程
日常在一个应用中通信,发送端从这个软件发出,接收端同样需要这个软件收到解析。这个本质就是进程间通信,进程间通信需要两个进程看到同一份共享资源,这个就是网络,管道等都有创建管道,挂接管道,关闭管道。同样,网络也需要提供一些系统调用和接口,这个就是网络协议栈

信息传递后还要面临一个问题,就是这个信息应该交给上层的哪一个进程,怎么区分是这个进程不是另外的进程。这时就需要端口号,可以唯一表示该主机上的网络应用层的进程

端口号(port)是传输层协议的内容

  • 端口号是一个2字节16位的整数
  • 端口号是用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • ip地址+端口号能够标识网络上的某一台主机的某一个进程
  • 一个端口号只能被一个在这里插入图片描述
    用ip和port两个设备通讯可以标识全网唯二的两台设备,这个方式就是socket

端口号和进程id

想要标识唯一的进程,pid也可以,为什么还要使用端口号
1.不是所有的进程都要网络通信,但是所有进程都要有pid
2.pid每次启动都会改变
3.系统和网络功能解耦。如果用pid网络开发,势必会让网络部分和进程部分强关联,进程的pid如果有改动,那么网络也需要改动

在这里插入图片描述

抖音发送出获取视频的请求,在传输层加上了源端口号和目标端口号。传到对方传输层时,可以根据hash表寻找,里面存的都是进程的pcb,找到需要传递的进程

一个进程可以绑定多个端口号,一个端口号不可以被多个进程绑定

3. TCP协议

(Transmission Control Protocol 传输控制协议)
传输层协议
有连接
可靠传输
面向字节流

4. UDP协议

(User Datagram Protocol 用户数据报协议)
传输层协议
无连接
不可靠传输
面向数据报

所谓可靠传输tcp会确认沟通是否成功,直到对方收到消息前都会维护这个数据,比如打电话之前会“喂喂”
udp面向数据报,像邮件一样,直接将数据丢给下层,至于是否成功发送不关心,数据会直接丢掉
可靠传输也是伴随着成本的增加才做到的,两者没有优劣之分

5. 网络字节序

内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分,网络数据流也有,如何定义地址呢?

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
接收主机把从网络上接到的字节一次保存在缓冲区中,也是按内存地址从低到高的顺序保存
网络数据流的地址规定先发出的数据是低地址,后发出的是高地址
TCP/IP协议规定,网络数据流采用大端字节序,低地址高字节
不管这台主机是大端还是小端,都按照规定的字节序发送接收,如果当前主机是小端,就会先进行转换
在这里插入图片描述
为使字节序有可移植性,同样的c代码在大端和小端机都可以运行,可以调用下面的库函数做字节序和主机字节序的转换
在这里插入图片描述
这些函数名,h表示host,n表示network,l表示32位长整数,s表示16位短整数,ip地址32位,端口号16位
htonl表示将32位长整数从主机字节序转换为网络字节序,将IP地址转换后发送
如果主机是小端,会做相应转换返回,大端原封不动返回

6. socket编程接口

常见API

//创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket (int domain, int type, int protocol) ;

//绑定端口号 (TCP/UDP, 服务器)
int bind (int socket, cosnt struct sockaddr* address, socklen_t address_len) ;

//开始监听 socket (TCP, 服务器)
int listen (int socket, int backlog) ;

//接收请求 (TCP, 服务器)
int accept (int socket, struct sockaddr* address, soclen_t* address_len) ;

//建立连接 (TCP, 客户端)
int connect (int sockfd, cosnt struct sockaddr* addr, socklen_t addrlen) ;

sockaddr结构

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket,然而,各种网络协议的地址格式并不相同
在这里插入图片描述
套接字编程种类:
1.域间套接字:同一个机器内
2.原始套接字:可以接收网卡或底层的数据,用来做网络工具
3.网络套接字:用户间的网络通信

上图的_un是域间套接字,_in是网络套接字,开发者希望将接口统一为一种类型,所以引出了sockaddr类型,也就是所有参数里传入的类型,它内部会判断是网络还是域间等,调用不同的功能。前16位和其他两个一样,后面的内容是填充字段,14字节的地址信息

IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr-in结构体表示,包括16位我地址类型,16位端口号和32位IP地址
IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6,这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体的内容
socket API可以都用struct sockaddr*类型表示,在使用的时候需要强制转化为sockaddr_in,这样的好处是程序的通用性,可以接收IPv4、IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针作为参数

在这里插入图片描述
在这里插入图片描述

虽然socket api接口是sockaddr,但真正的基于ipv4编程时,使用的数据结构是sockaddr_in,这个结构里主要有三部分信息:地址类型,端口号,IP地址

在这里插入图片描述

in_addr用来表示一个ipv4的ip地址,起始就是一个32位的整数

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

设计严谨,思路绝妙!这篇高级孟德尔随机化研究:药靶、共定位,发文一区(IF=8.9)!...

现在越来越多的学者在用孟德尔随机化高级方法发文,今天我们看的这篇这篇药靶孟德尔随机化,还用了共定位分析方法,亮点在于它的设计严谨,思路绝妙,一起看下去吧! 2024年4月21日,四川大学华西医院…

(四)JVM实战——GC垃圾回收

垃圾回收算法 垃圾的判别 引用计数法:实现简单,判定效率高,回收没有延迟;无法解决循环引用的问题;可达性分析算法(根搜索算法):没有循环引用的问题,防止内存泄漏 GCRo…

【挑战30天首通《谷粒商城》】-【第一天】03、简介-分布式基础概念

文章目录 课程介绍 ( 本章了解即可,可以略过)1、微服务简而言之: 2、集群&分布式&节点2.1、定义2.2、示例 3、远程调用4、负载均衡常见的负裁均衡算法: 5、服务注册/发现&注册中心6、配置中心7、服务熔断&服务降级7.1、服务熔断7.2、服务降级 8、AP…

纹理映射技术在AI去衣应用中的关键作用

引言: 随着人工智能技术的飞速发展,其在图像处理领域中的应用也日益广泛。AI去衣,作为一种颇具争议的技术应用,指的是利用深度学习算法自动移除或替换图片中的衣物。在这一过程中,纹理映射技术扮演了不可或缺的角色。本…

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略 目录 GPT4ALL的简介 0、新功能 1、特点 2、功能 3、技术报告 GPT4ALL的安装和使用方法 1、安装 2、使用方法 GPT4ALL的案例应用 LLMs之LLaMA3:基于GPT4ALL框架对LLaMA-3实现…

数据结构-线性表-应用题-2.2-6

从有序顺序表中删除所有其值重复的元素,使表中的元素的值均不同 有序顺序表,值相同的元素一定在连续的位置上,初始时将第一个元素是为非重复的有序表,之后依次判断后面的元素是否与前面的非重复表的最后一个元素相同,…

JVM调参实践总结

JVM调优–理论篇从理论层面介绍了如何对JVM调优。这里再写一篇WIKI,尝试记录下JVM参数使用的最佳实践,注意,这里重点介绍HotSpot VM的调参,其他JVM的调参可以类比,但不可照搬。 Java版本选择 基于Java开发应用时&…

【Git】Git学习-10-11:GitHub,SHH配置,克隆仓库

学习视频链接:【GeekHour】一小时Git教程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 创建仓库 配置SSH密钥可以更加安全,方便地推送、拉取代码 根目录下,进入.ssh文件&am…

gradio图像复原界面改进

图像复原界面展示需要输入图像和复原图像在界面的清晰对比,修改两张图像为同样大小。 默认情况: intreface代码如下: interface gr.Interface(fnrestore, # 要调用的函数inputs[gr.Image(label"输入图像")], # 第一个输入&am…

大数据Scala教程从入门到精通第三篇:Scala和Java的关系

一:Scala和Java的关系 1:详解 一般来说,学 Scala的人,都会 Java,而 Scala 是基于 Java 的,因此我们需要将 Scala和 Java 以及 JVM 之间的关系搞清楚,否则学习 Scala 你会蒙圈 Scala可以使用SDK…

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs?Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

前后端分离项目中的一些疑惑

1、前后端分离项目,浏览器发起请求后,请求的是前端服务器还是后端服务器? 在前后端分离的项目中,当浏览器发起请求时,它首先会请求的是前端服务器。 前后端分离的工作流程大致如下: 用户在浏览器中输入网…

ws注入js逆向调用函数

这里需要选择一个文件夹 随便 紫色为修改保存 记得ctrls保存 注入代码如下 (function() {var ws new WebSocket("ws://127.0.0.1:8080")ws.onmessage function(evt) {console.log("收到消息:" evt.data);if (evt.data "exit") {…

微生物群落构建(community assembly)

Introduction Zhou, J. & Ning, D. Stochastic Community Assembly: Does It Matter in Microbial Ecology? Microbiol Mol Biol Rev 81, e00002-17 (2017). This review is very comprehensive (1)! 周集中老师实验室的长期研究兴趣集中在从基因组到生态系统…

YOLOv5改进 | 主干篇 | 2024.5全新的移动端网络MobileNetV4改进YOLOv5(含MobileNetV4全部版本改进)

一、本文介绍 本文给大家带来的改进机制是MobileNetV4,其发布时间是2024.5月。MobileNetV4是一种高度优化的神经网络架构,专为移动设备设计。它最新的改动总结主要有两点,采用了通用反向瓶颈(UIB)和针对移动加速器优化…

CSS学习笔记之基础教程(二)

上节内容CSS学习笔记之基础教程&#xff08;一&#xff09; 6、边距 6.1 外边距&#xff1a;margin 6.1.1 外边距 marginmargin-topmargin-leftmargin-bottommargin-right <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

SEO之高级搜索指令(二)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 &#xff08;接上一篇。。。。&#xff09; 5 、inanchor: inanchor:指令返回的结果是导入链接锚文字中包含搜索词的页面。百度不支持inanchor:。 比如在 Go…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

Angular中创建和使用服务

Angular中的服务 文章目录 Angular中的服务前言一、创建服务二、使用服务 前言 Angular 服务是 Angular 应用程序中用于封装可重用逻辑的类。服务在应用程序的多个组件之间共享数据和功能&#xff0c;而不依赖于应用程序的UI。服务可以用于诸如数据处理、与后端通信、用户身份…