45 套接字

news2024/11/26 0:53:26

本节重点

认识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://www.coloradmin.cn/o/1651146.html

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

相关文章

时间复杂度与空间复杂度(上篇)

目录 前言时间复杂度 前言 算法在运行的过程中要消耗时间资源和空间资源 所以衡量一个算法的好坏要看空间复杂度和时间复杂度, 时间复杂度衡量一个算法的运行快慢 空间复杂度是一个算法运行所需要的额外的空间 一个算法中我们更关心的是时间复杂度 时间复杂度 时…

【快捷部署】023_HBase(2.3.6)

📣【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意:本脚本非全自动化脚本,有2次人工干预,第一次是确认内网IP,如正确直接回车即可&#…

什么软件能在桌面提醒我 电脑桌面提醒软件

在这个信息爆炸的时代,我们每个人每天都需要处理海量的信息和任务。有时候,即便是再细心的人,也难免会因为事情太多而忘记一些重要的细节。 我就经常遇到这样的问题,明明记得自己有个重要的会议要参加,或者有个关键的…

扭蛋机小程序在互联网浪潮中的崛起与发展

随着互联网的快速发展,各种线上娱乐方式层出不穷,其中扭蛋机小程序凭借其独特的魅力,在互联网浪潮中迅速崛起并发展壮大。扭蛋机小程序不仅打破了传统扭蛋机的地域限制和操作不便,还融入了丰富的互动元素和便捷性,满足…

纯血鸿蒙APP实战开发——自定义安全键盘案例

介绍 金融类应用在密码输入时,一般会使用自定义安全键盘。本示例介绍如何使用TextInput组件实现自定义安全键盘场景,主要包括TextInput.customKeyboard绑定自定义键盘、自定义键盘布局和状态更新等知识点。 效果图预览 实现思路 1. 使用TextInput的cu…

为什么你的企业需要微信小程序?制作微信小程序有什么好处?

什么是小程序? WeChat小程序作为更大的WeChat生态系统中的子应用程序。它们就像更小、更基本的应用程序,在更大的应用程序(WeChat)中运行。这些程序为用户提供了额外的高级功能,以便在使用WeChat服务时加以利用。根据…

linux系统 虚拟机的安装详细步骤

window: (1) 个人:win7 win10 win11 winxp (2)服务器:windows server2003 2008 2013 linux: (1)centos7 5 6 8 (2)redhat (3)ubuntu (4)kali 什么是linux: 主要是基于命令来完成各种操作,类似于DO…

0基础学PHP有多难?

php作为web端最佳的开发语言,没有华而不实,而是经受住了时间考验,是一门非常值得学习的编程语言。 目前市场上各种网站、管理系统、小程序、APP等,基本都是使用PHP开发的,也侧面反映了PHP的需求以及学习的必要性&…

UTONMOS:真正的“游戏元宇宙”还有多遥远?

元宇宙来源于科幻小说的概念,已成为真实世界中的流行语。围绕这一新兴概念,一场产、学、研的实践正在展开。 数字化转型中,元宇宙能否担当大任?这些新概念在中国语境下如何落地?本文将深入挖掘国内元宇宙游戏产业的发…

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

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

当AI遇见现实:数智化时代的人类社会新图景

文章目录 一、数智化时代的机遇二、数智化时代的挑战三、如何适应数智化时代《图解数据智能》内容简介作者简介精彩书评目录精彩书摘强化学习什么是强化学习强化学习与监督学习的区别强化学习与无监督学习的区别 前言/序言 随着科技的日新月异,我们步入了一个前所未…

大数据硬核技能进阶:Spark3实战智能物业运营系统

Spark Streaming 是 Spark 的一个子模块,用于快速构建可扩展,高吞吐量,高容错的流处理程序。具有以下特点: 大数据硬核技能进阶:Spark3实战智能物业运营系统(网盘超清) 通过高级 API 构建应用程序,简单易…

【详细介绍下图搜索算法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

技术分享-上海泗博MPI转以太网模块MPI-131实现Node-RED直接访问西门子PLC数据

上海泗博自动化MPI-131是一款用于西门子S7系列PLC(包括S7-200、S7-300、S7-400)以及西门子数控机床(如840D、840DSL等)的以太网通讯模块,无需编程,即插即用,支持通过模块上下载PLC程序和数据监控…

翻译《The Old New Thing》 - What is the deal with the ES_OEMCONVERT flag?

What is the deal with the ES_OEMCONVERT flag? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20050719-12/?p34893 Raymond Chen 在 2005年07月19日 ES_OEMCONVERT 标志是怎么回事? 简要 文章讨论了 ES_OEMCONVERT 编辑控件风格的起源和用途…

DNS域名解析服务的部署及优化方案

实验要求: 1.配置2台服务器要求如下: a)服务器1: 主机名:dns-master.timinglee.org ip地址: 172.25.254.100 配置好软件仓库 b)服务器2: 主机名:dns-slave.timinglee.org ip地址&am…

element-plus el-time-picker 时间段选择(可多选)

实现一个如图的时间段选择器 处理好时间回显逻辑&#xff0c;组件内[‘’,‘’],后端数据[{startTime:‘’,endTime:‘’}]处理好加和减的显示逻辑 <template><div><div v-for"(item, index) in currentChoose" :key"index" class"fl…

Linux实操之常用指令详解

文章目录 vi 和 vimvi 和 vim 基本使用 开机、重启和用户登录注销关机&重启命令用户登录和注销 用户管理基本介绍基本语法细节说明修改密码删除用户查询用户信息指令切换用户查看当前用户/登录用户用户组 实用指令指定运行级别帮助指令文件目录类时间和日期类搜索查找类压缩…

向各位请教一个问题

这是菜鸟上的一道题目&#xff0c;单单拿出来问问大家&#xff0c;看看能不能解惑 &#xff0c;谢谢各位&#xff01; 题目25&#xff1a;求12!3!...20!的和 解题思路&#xff1a;这个题不知道为什么我用DEV C 5.11显示出来为0.000000&#xff0c;可能版本有问题&#xff1f;&a…

装饰器模式-原理分析以及动手练习

目录 应用场景涉及的角色和类&#xff08;个人理解&#xff09;涉及的角色组件&#xff08;标准&#xff09;基本实现 Demo&#xff08;可以直接 copy 跑一下看效果&#xff09;自己动手实战需求参考答案 相关话题参考文章 应用场景 需要给一个现有类添加附加功能&#xff0c;…