13 套接字Socket

1、Socket 编程
  1. socket编程基于 TCP 和 UDP 协议的
  2. tcp和udp是区分客户端和服务端的,所以我们的socket编程也是区分的。
2、socket是端到端的通信
1.Socket 这个名字很有意思,可以作插口或者插槽讲
2.一头插在客户端,一头插在服务端,然后进行通信
3.所以在通信之前,双方都要建立一个Socket
3、socket参数
Socket 编程进行的是端到端的通信,往往意识不到中间
经过多少局域网,多少路由器,因而能够设置的参数,也只能是端到端协议之上网络层和传输层的

具体设置

  1. 网络层:Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6
  2. 设置是 TCP 还是 UDP
  3. TCP 协议是基于数据流的,所以设置为
    SOCK_STREAM,而 UDP 是基于数据报的,因而设置为 SOCK_DGRAM。
4、基于 TCP 协议的 Socket 程序函数调用过程
1.**TCP 的服务端**要先监听一个端口,一般是先调用 bind 函数,给这个 Socket 赋予一个 IP 地址和端口
//为什么需要端口呢?
之前说过了,应用程序是和端口绑定的,内核要通过 TCP 头里面的这个端口,来找到应用程序,把数据包给它。
//为什么又要 IP 地址呢?
一台机器会有多个网卡,也就会有多个 IP 地址,你可以选择监听所有的网卡,也可以选择监听一个网卡,这样,只有发给这个网卡的包,才会给你。
2.当服务端有了 IP 和端口号,就可以调用 listen 函数进行监听。
3.TCP 的状态里,有一个 listen 状态,当调用这个函数之后,服务端就进入了这个状态,这个时候客户端就可以发起连接了。
4.在内核中,为每个 Socket 维护两个队列
  一个是已经建立了连接的队列,这时候连接三次握手已经完毕,处于 established 状态。
  一个是还没有完全建立连接的队列,这个时候三次握手还没完成,处于syn_rcvd 的状态。
5.接下来,服务端调用 accept 函数,拿出一个已经完成的连接进行处理。如果还没有完成,就要等着。
6.在服务端等待的时候,客户端可以通过 connect 函数发起连接。先在参数中指明要 连接的 IP 地址和端
  口号,然后开始发起三次握手。内核会给客户端分配一个临时的端口。一旦握手成功,服务端的 accept就会返回另一个 Socket

这是一个面试的知识点,就是监听的 Socket 和真正用来传数据的 Socket 是两个,一个叫作监听Socket,一个叫作已连接 Socket。

7.连接建立成功之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样

在这里插入图片描述

  1. TCP 的 Socket 就是一个文件流。因为,Socket 在 Linux 中就是以文件的形式存在的。除此之外,还存在文件描述符。写入和读出,也是通过文件描述符。
  2. 在内核中,Socket 是一个文件,那对应就有文件描述符。每一个进程都有一个数据结构 task_struct,里面指向一个文件描述符数组,来列出这个进程打开的所有文件的文件描述符。文件描述符是一个整数,是这个数组的下标。
  3. 文件描述符:在linux中万物皆文件,文件可分为:普通文件目录文件链接文件设备文件。在操作这些文件的时候,每操作一次就找一次名字,这会耗费大量的时间和效率,所以linux为每一个文件创建了一个索引,这样在操作文件的时候,直接找到索引就可以对文件进行操作了。
    文件描述符就是为文件建立的索引,是一个非负整数,所有执行IO操作的的系统调用都通过文件描述符来实现
5、基于 UDP 协议的 Socket 程序函数调用过程
1.UDP 是没有连接的,所以不需要三次握手,也就不需要调用 listen
和 connect。
2.但是,UDP 的的交互仍然需要 IP 和端口号,因而也需要 bind。
3.UDP 不维护连接状态的,因而不需要每对连接建立一组 Socket,而是只要有一个 Socket,就能够和多个客户端通信。
4.因为没有连接状态,每次通信的时候,都调用 sendto 和 recvfrom,都可以传入 IP 地址和端口。

在这里插入图片描述

6、socket编码稍后补充

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拉晶工艺设备——切片机

单晶炉拉出硅棒后,经硅棒切断、外园整形,便用切片机切成薄片,供后续工艺使用。切片机也用于玻璃、陶瓷、 大理石、花岗岩等硬脆材料的切割。 半导体行业使用的切片机按结构形式可分为立式切片机、卧式切片机,按刀片形式可分内圆切…

魔众文库系统 v5.5.0 批量快捷上传,文档图标优化,档转换逻辑优化

魔众文库系统基于文档系统知识,建立平台与领域,打造流量、用户、付费和变现的闭环,帮助您更好的搭建文库系统。 魔众文库系统发布v5.5.0版本,新功能和Bug修复累计14项,批量快捷上传,文档图标优化&#xff…

酷柚易汛ERP - 套餐管理操作指南

1、应用场景 套餐管理应用于商品打包销售,如临期食品,促销商品等 2、主要操作 2.1 新增套餐 打开【资料】-【套餐管理】点击新增 套餐是一个组合新商品出现,价格需要重新设定,也可以设定不同等级客户对应价格

SAP ABAP基础语法-Excel上传(十)

EXCEL BDS模板上传及赋值 上传模板事务代码:OAER l 功能代码:向EXCEL模板中写入数据示例代码如下 REPORT ZEXCEL_DOI. “doi type pools TYPE-POOLS: soi. *SAP Desktop Office Integration Interfaces DATA: container TYPE REF TO cl_gui_custom_c…

arduino 简易智能花盆

编辑器:arduino IDE 主板:arduino uno 传感器: 0.96寸的OLED屏(四脚) 声音模块 土壤温湿度模块 DS18B20温度模块(这里用到防水的) 光敏电阻模块(买成三脚的了只能显示高低&#x…

软件测试的终点是“测试开发”吗?

前言 在一线大厂,没有测试这个岗位,只有测开这个岗位,即使是做业务测试,那么你的title也是测开。 所以想聊一聊测开的看法,但不代表这是正确的看法,仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自…

软件测试金融项目,在测试的时候一定要避开的一些雷区

软件测试金融项目需要格外谨慎和专注,因为这些项目通常涉及大量的交易、用户隐私和其他敏感信息。以下是一些软件测试金融项目时需要关注的方面: 1. 数据保护 在测试金融项目时,必须确保用户数据和投资信息得到保护。测试人员必须确保测试环…

我干了8年测试,告诉你现在软件测试还能不能找到工作!

观点:如果你还是以前的思维来学习测试,那你肯定是找不到工作! 我做测试工作有将近8年的时间,蚂蚁金服做过2年,因为加班太多离职了。目前在一家国企上市公司,一年能拿三四十个左右,对比头部互联…

信息系统“好用”的标准探讨

数字化转型建设的关键不在建设信息系统。这是为了避免走信息化建设的老路——业务和信息化两张皮,寄希望信息系统解决业务问题。在数字化转型建设中,信息系统仍然是重要抓手和显性成果,是企业业务和数据的承载平台,也是IT厂商向客…

李峋同款的C语言动态爱心代码来了,彩色闪动,附源码

1.前言 最近一部电视剧《点燃我,温暖你》可火啦,大家纷纷在搞男主阿瑟的同款爱心代码,但是虽然网上有它的源码,但都不是 C 语言的,看不懂。我看了一下这个视频,大致分析了一下它的运行过程。用语言描述一下…

【C++】C++11常用特性梳理

C11特性梳理 1. 列表初始化2. auto & decltype3. 右值引用3.1. 左右值引用比较3.2. 右值引用的意义3.3. 万能引用与完美转发3.4. 移动构造与移动赋值 4. default & delete5. 可变参数模板6. push_back 与 emplace_back7. lambda表达式7.1. 捕捉列表 8. function包装器8…

(一)QML加载离线地图+标记坐标点

1、实现效果 加载离线地图瓦片、鼠标拖拽、滚轮缩放在地图上固定坐标位置标注地名 (一)QML加载离线地图标记坐标点:MiniMap-mini 2、实现方法 2.1、使用工具下载离线地图 不废话,直接搬别人的砖,曰:他山…

VirtualBox网络地址转换(NAT),宿主机无法访问虚拟机的问题

问题:NAT模式下,默认只能从内访问外面,而不能从外部访问里面,所以只能单向ping通,虚拟机的ip只是内部ip。 PS:桥接则是与主机公用网卡,有独立的外部ip。 解决:NAT模式可以通过配置 …

好物周刊#30:Github 上大学

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. Fighting Design 一款灵活、优质的组件库,可在 vue3 应用程…

【api_fox】ApiFox简单操作

1、get和post请求的区别?2、接口定义时的传参格式?3、保存接口文档 apifox当中接口文档的设计和接口用例的执行是分开的。 1、get和post请求的区别? 2、接口定义时的传参格式? 3、保存接口文档 就生成如下的接口文档。

C语言实现编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

完整代码&#xff1a; /*编写一个函数&#xff0c;输入n为偶数时&#xff0c;调用函数求1/21/4...1/n,当输入n为奇数时&#xff0c; 调用函数1/11/3...1/n */ #include<stdio.h>//n为偶数 double Odd(int n){double sum0;//i为2&#xff0c;4&#xff0c;6....for (int …

linux_day02

1、链接&#xff1a;LN 一个点表示当前工作目录&#xff0c;两个点表示上一层工作目录&#xff1b; 目录的本质&#xff1a;文件&#xff08;该文件储存目录项&#xff0c;以链表的形式链接&#xff0c;每个结点都是目录项&#xff0c;创建文件相当于把目录项添加到链表中&…

在Spring Boot中使用JTA实现对多数据源的事务管理

了解事务的都知道&#xff0c;在我们日常开发中单单靠事务管理就可以解决绝大多数问题了&#xff0c;但是为啥还要提出JTA这个玩意呢&#xff0c;到底JTA是什么呢&#xff1f;他又是具体来解决啥问题的呢&#xff1f; JTA JTA&#xff08;Java Transaction API&#xff09;是…

C语言--青蛙跳台阶【内容超级详细】

今天与大家分享一下递归的经典题目--青蛙跳台阶问题。 一.引子 电影《少年班》&#x1f357;中的老师在全国各地寻找天才少年时&#xff0c;就问了一个这样的问题&#xff0c;有20阶台阶&#xff0c;每次只能上一阶或两阶&#xff0c;总共有多少种上法&#xff1f;这个少年王…

【LeetCode刷题日志】138.随机链表的复制

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;LeetCode 刷题日志&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;…