网络编程套接字(1)

news2024/11/19 22:54:51

文章目录

  • 网络编程套接字(1)
    • 1. 预备知识
      • 1.1 源IP与目的IP
      • 1.2 认识端口号
      • 1.3 理解 "端口号" 和 "进程ID"
      • 1.4 源端口号和目的端口号
      • 1.5 认识TCP协议和UDP协议
        • (1) TCP
        • (2) UDP
      • 1.6 网络字节序
    • 2. socket编程接口
      • 2.1 socket 常见API
      • 2.2 sockaddr结构

网络编程套接字(1)

1. 预备知识

1.1 源IP与目的IP

  • 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。
  • 源IP地址:发送主机的IP地址
  • 目的IP地址:接收主机的IP地址

1.2 认识端口号

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

  • 端口号是一个2字节16位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用。

1.3 理解 “端口号” 和 “进程ID”

  • A主机把数据发送给B主机是目的吗?
    不是的,这只是一种手段,我们其实是要把A主机上的数据交给B主机上的某种服务。(本质是某种客户端和某种服务器)

  • 我们平时想看抖音短视频必须打开抖音APP,打开抖音APP就是启动抖音的客户端,本质是一个进程;同时我们能在任意时间刷短视频,是因为抖音的服务器在 7*24小时内以进程的方式在运行;所以我们所有的请求动作不是由主机A发起的,而是由主机A上的客户端进程发起的,后与主机B上的服务器进程进行通信。

  • 网络通信本质其实是进程间通信

在这里插入图片描述

  • 通信的两个阶段:

    • 先将数据通过OS,将数据发送到目标主机(手段)

      • TCP/IP协议完成。IP可以标识互联网上唯一的一台主机
    • 再在本机收到的数据,推送给自己上层的指定进程

      • 端口号可以标识对应主机内,唯一的一个进程
  • IP地址 + 端口号 = 互联网中唯一的一个进程 (目前)

[源IP,源端口号;目的IP,目的端口] 可以标识互联网中唯二的两个进程,我们把这种通信方式叫做: socket通信

网络通信的本质:是通过IP地址 + 端口号构建进程的唯一性,来进行基于网络的进程间通信IP

问题:

  • 端口号,为什么不用进程PID来标识进程的唯一性?

    • 不是所有进程都要进行网络通信,只有部分进程进行网络通信,用PID很难区分两者(不进行网络通信和进行网络通信)
    • 网络功能设计上要使用PID字段,PID是OS层面进程管理的概念,这么做意味着网络模块要增加进程管理的部分,增加了进程管理和网络管理的耦合度
  • 一个端口号只能被一个进程绑定,一个进程可以关联多个端口号

理解: 在OS层面上可以维护一张哈希表,进程在绑定port时就是把PID填入哈希表中,哈希表中下标唯一,一个PID可以对应很多下标;所以在数据报到来时,OS可以根据报文的目的端口号查哈希表找到对应进程,未来把数据交给进程

在这里插入图片描述

1.4 源端口号和目的端口号

传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要
发给谁”;

1.5 认识TCP协议和UDP协议

(1) TCP

此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识; 后面我们再详细讨论TCP的一些细节问题。

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

(2) UDP

此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论。

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

1.6 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏
移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是高地址
  • TCP/IP协议规定网络数据流应采用大端字节序,即低地址高字节
  • 不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端否则就忽略, 直接发送即可;

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
 
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
  • 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
  • 例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
  • 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

2. socket编程接口

2.1 socket 常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
 
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
 
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
 
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
 
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

说明: 参数在使用时在详细解释

2.2 sockaddr结构

上面是一套网络通信的接口,sockaddr是这些接口中最重要的参数

  • sockaddr_in:是用于网络通信的套接字,

  • sockaddr_un:是用于域间通信(本地通信)的套接字,用来取代system V原始通信的方案

  • sockaddr:是一套通用的接口,既可以本地通信又可以网络通信

但是我们在使用函数的时候,传的参数是sockaddr,而不是sockaddr_in和sockaddr_un

  • sockaddr_in和sockaddr_un结构体中前16比特位(前两个字节)分别代表是网络通信还是本地通信
  • 我们在使用socket接口时,根据通信类型选择sockaddr_in和sockaddr_un这两种结构体,需要对结构体内的字段进行填充,传参给sockaddr时必须要进行强制类型转换
  • 在socket函数的内部,对传进来的参数 sockaddr 直接去前两个字节,判断是网络通信还是本地通信, 后再强制类型转换回 sockaddr_in 和 sockaddr_un结构体

传不同的结构体,用相同的参数来接受,在函数内部自动进行区分,这是用C语言实现多态的一种做法

在这里插入图片描述

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

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

相关文章

深度学习环境搭建 cuda、模型量化bitsandbytes安装教程 windows、linux

cuda、cudann、conda安装教程 输入以下命令&#xff0c;查看 GPU 支持的最高 CUDA 版本。 nvidia-smi cuda安装&#xff08;cudatoolkit&#xff09; 前往 Nvidia 的 CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer CUDA Toolkit 11.8 Downloads | NVIDIA …

react之路由的安装与使用

一、路由安装 路由官网2021.11月初&#xff0c;react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…

IDM最新版2023不限速下载网盘详细操作教程

开启这个开关&#xff0c;让你的浏览器下载速度翻倍!大家有没有听说过IDM下载器&#xff0c;那是因为它的多线程下载功能&#xff0c;所以下载速度快&#xff0c;其实我们的浏览器也有多线程下载功能&#xff0c;只是默认关闭了而已&#xff0c;只需开启它&#xff0c;就可以有…

商城-学习整理-高级-性能压测缓存问题(十一)

目录 一、基本介绍1、性能指标2、JMeter1、JMeter 安装2、JMeter 压测示例1、添加线程组2、添加 HTTP 请求3、添加监听器4、启动压测&查看分析结果 3、JMeter Address Already in use 错误解决 二、性能监控1、jvm 内存模型2、堆3、jconsole 与 jvisualvm1、jvisualvm 能干…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

第8章:集成学习

个体与集成 同质&#xff1a;相同的基学习器&#xff0c;实现容易&#xff0c;但是很难保证差异性。异质&#xff1a;不同的基学习器&#xff0c;实现复杂&#xff0c;不同模型之间本来就存在差异性&#xff0c;但是很难直接比较不同模型的输出&#xff0c;需要复杂的配准方法。…

【PACS源码】认识PACS的架构和工作流程

&#xff08;一&#xff09;PACS系统的组成及架构 PACS系统的基本组成部分包括&#xff1a;数字影像采集、通讯和网络、医学影像存储、医学影像管理、各类工作站五个部分。 而目前PACS系统的软件架构选型上看&#xff0c;主要有C/S和B/S两种形式。 C/S架构&#xff0c;即Client…

iMazing2.17.3免费版苹果传输电脑端文件数据工具

苹果手机在日常使用过程中可能会遇到iPhone内存不足的情况&#xff0c;遇到这种情况很多用户会选择删除照片来节省存储空间&#xff0c;大量删除照片可能会误删重要照片。另外iPhone可能会遇到自动重启、黑屏等故障。手机突然损坏&#xff0c;数据无法导出&#xff0c;此时备份…

判断链表中是否有环

如下图&#xff0c;如何判断链表中存在环路呢&#xff1f; 一种简单的方法描述&#xff1a; 设置两个链表指针p1和p2并指向链表&#xff0c;设置两个记录指针移动次数的变量c1和c2。在循环中&#xff0c;p1每次移动2个位置&#xff0c;c1加2&#xff1b;p1每次移动一个位置&am…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

被信息爆炸反噬了,自食恶果

我前两年回答的一个问题&#xff0c;最近频频收到点赞的消息提醒。 然后&#xff0c;我又思考了一下&#xff0c;我感觉信息价值危机随着生成式 AI 的诞生&#xff0c;可能会越来越严重。 什么问题呢&#xff1f; 有人提问&#xff1a; 现在中文互联网能搜索到的有价值信息越来…

【Android】设置-显示-屏保-启用时机-去除插入基座相关(不支持该功能的话)

设置-显示-屏保-启用时机-去除插入基座相关&#xff08;不支持该功能的话&#xff09; 1-项目场景&#xff1a;2-问题描述3-解决方案&#xff1a;4-代码修改前后效果对比图&#xff1a;代码修改前&#xff1a;代码修改后&#xff1a; 1-项目场景&#xff1a; 展锐平台 2-问题描…

C语言中常见的一些语法概念和功能

常用代码&#xff1a; 程序入口&#xff1a;int main() 函数用于定义程序的入口点。 输出&#xff1a;使用 printf() 函数可以在控制台打印输出。 输入&#xff1a;使用 scanf() 函数可以接收用户的输入。 条件判断&#xff1a;使用 if-else 语句可以根据条件执行不同的代码…

服装定制小程序

如今&#xff0c;人们对时尚的追求已不仅仅停留在传统的购买与穿搭上&#xff0c;而是更加注重个性化和定制化的需求。为满足这一需求&#xff0c;乔拓云网推出了一款创新的服装定制小程序&#xff0c;为用户提供定制专属时尚的全新旅途。 通过进入【乔拓云】后台&#xff0c;用…

大数据平台运维实训室建设方案

一、概况 本实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。同时,实训室也承担相关考评员与讲师培训考试、学生认证培训考试、社会人员认证培训考试、大数据技能大赛训练、大数据专业课程改革等多项任务。 实训室旨在培…

《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern

原型的定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏&#xff0c;这个游戏里有许多不同种类的怪物&#xff0c;鬼魂&#xff0c;恶魔和巫师。这些怪物通过“生产者”进入这片区域&#xff0c;每种敌人…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…

【ARM Linux 系统稳定性分析入门及渐进10 -- GDB 初始化脚本介绍及使用】

文章目录 gdb 脚本介绍gdb 初始化脚本使用启动 gdb 的时候自动执行脚本gdb运行期间执行命令脚本 gdb 脚本介绍 GDB脚本是一种使用GDB命令语言编写的脚本&#xff0c;可以用来自动化一些常见的调试任务。这些脚本可以直接在GDB中运行&#xff0c;也可以通过GDB的-x参数或source…

Unity 之NavMeshAgent 组件(导航和路径寻找的组件)

文章目录 **作用**&#xff1a;**属性和方法**&#xff1a;**用途**&#xff1a;**注意事项**&#xff1a; NavMeshAgent 是Unity引擎中用于导航和路径寻找的组件。它可以使游戏对象在场景中自动找到可行走的路径&#xff0c;并在避免障碍物的情况下移动到目标位置。 以下是关于…

实现Java异步调用的高效方法

文章目录 为什么需要异步调用&#xff1f;Java中的异步编程方式1. 使用多线程2. 使用Java异步框架 异步调用的关键细节结论 &#x1f389;欢迎来到Java学习路线专栏~实现Java异步调用的高效方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…