linux【网络编程】之网络套接字预备

news2024/11/16 15:46:03

linux【网络编程】之网络套接字

  • 一、必备知识
    • 1.1 端口号
    • 1.2 端口号方面疑问及解决方案
  • 二、TCP/UDP协议
  • 三、网络字节流
  • 四、socket编程
    • 4.1 认识接口
    • 4.2 浅析sockaddr结构

一、必备知识

在【网络基础】中我们提到了IP地址,接下来了解一下网络通信中其他方面的知识

1.1 端口号

  1. 端口号是一个2字节16位的整数;
  2. 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  3. 一个端口号只能被一个进程占用

通信原理
在这里插入图片描述

  1. (公网)IP唯一标识一台主机,这样两台主机就可以发送接收数据,但是还需要区分数据发给那个软件

  2. 各自主机上的进程由端口号(port)唯一标识

  3. IP+端口号:表示该主机对应的服务进程在全网中是唯一的进程

软件之间的通信转换成进程,网络通信的本质就是进程间通信,客户端进程和服务端进程通过网络资源进行通信

1.2 端口号方面疑问及解决方案

  1. 不同主机上的端口号能一样吗?
    可以,IP保证了公网中主机的唯一性,port保证了主机内部的进程唯一性
  2. 端口号与进程之间的联系?
    同一台主机一个端口号只能被一个进程占用 ;一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定(os找不到)
  3. 进程已经有PID为什么还要有端口号?
    a.为了系统与网络解耦
    b.为了客户端迅速找到服务器进程–>IP+port不能随便改变(PID太容易被改变)
    c.不是所有进程都要提供网络服务,需要进行网络服务的拥有端口号
  4. 进程绑定port就变成了网络服务进程,OS是如何根据port找到对应的进程?
    底层OS维护了一张哈希表,根据port值找到对应的进程

二、TCP/UDP协议

这里仅仅是提一下,后面会结合实际、代码详细分析
TCP协议(传输控制协议)

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

UDP协议(用户数据报协议)

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

不可靠传输:如发送数据时出现了丢包的情况、或者数据被重复传递了(传递了多份)、或者网络出现了问题等等造成的后果就叫做不可靠。所以传输层就是用来解决可靠性的一个协议。

可靠是需要成本的,往往在维护和编码上都比较复杂;而不可靠没有成本,使用起来也简单。所以要分场景使用。

三、网络字节流

内存中的多字节数据相对于内存地址有大端和小端之分

  • 大端存储:低位高地址
  • 小端存储:低位低地址

如果一个大端机用大端的方式发送数据到一个小端机,网络需要识别发送方式,于是
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节

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

网络中接收和发送都是先低地址再高地址,解释数据的时候以大端存储来解释

网络字节序和主机字节序的转换可以直接调用库函数

#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地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

四、socket编程

IP地址+端口号(port)能够标识该主机上的唯一进程:ip和端口号就叫为套接字

4.1 认识接口

// 创建 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);

4.2 浅析sockaddr结构

常见的套接字有三种:网络套接字,原始套接字,unix域间套接字
网络套接字主要运用于跨主机之间的通信,也能支持本地通信;域间套接字只能在本地通信;原始套接字可以跨过传输层(TCP/IP协议)访问底层的数据,为了方便使用,设计者只用了一套接口(小伙伴看到这里应该会想到一直常见的实现方式:多态!!!)

在这里插入图片描述
上图可以看到sockaddr_in和sockaddr_un是两个不同的通信场景。区分它们就用前2个字节:16位地址类型协议家族的标识符(代表是本地通信还是网络通信),但是我们选择用sockaddr这个结构体

比如要进行网络通信,虽然参数是const struct sockaddr *addr,但实际传递进去的却是sockaddr_in结构体(类型不一样,注定要进行强制类型转换)。
在函数读取sockaddr前两个字节判断是什么通信类型然后再强转回去。

综上:可以把sockaddr看成基类,把sockaddr_in和sockaddr_un看成派生类,构成了多态
本篇文章为接下来网络程序模拟实现做铺垫,接口的详细认识及sockaddr会结合代码细细讲解,关注我,为你带来更多知识

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

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

相关文章

浏览器的渲染

浏览器的渲染 浏览器的渲染过程分为两大阶段&#xff0c;八大步骤&#xff0c;由两个线程完成&#xff0c; 下面是总的过程 第一个 渲染主线程 它包括5个步骤&#xff0c; 1、html解析 parse 解析我们的HTML&#xff0c;生成DOM树结构 2、样式计算 computed style 比如我们…

系统运维(Git篇)

Git基础 Git Git是一种分布式版本控制系统&#xff0c;可以帮助我们管理代码的版本和变更。通过学习Git&#xff0c;我们可以更好地理解版本控制的原理和应用&#xff0c;同时也可以掌握Git的使用和管理技巧。 Docker Docker是一种容器化平台&#xff0c;可以将应用程序及其依赖…

华为OD机试真题2023(JAVA)

目录 华为OD机试是什么&#xff1f;华为OD面试流程&#xff1f;华为OD机试通过率高吗&#xff1f;华为OD薪资待遇&#xff1f;华为OD晋升空间&#xff1f; 大家好&#xff0c;我是哪吒。 本专栏包含了最新最全的华为OD机试真题&#xff0c;有详细的分析和Java代码解答。已帮助…

web前端的同源策略是什么?

一、同源策略 1995年&#xff0c;同源政策由 Netscape 公司(网景公司)引入浏览器。目前&#xff0c;所有浏览器都实行这个政策。同源政策的目的&#xff0c;是为了保证用户信息的安全&#xff0c;防止恶意的网站窃取数据。随着互联网的发展&#xff0c;“同源政策”越来越严格…

深入理解java虚拟机精华总结:运行时栈帧结构、方法调用、字节码解释执行引擎

深入理解java虚拟机精华总结&#xff1a;运行时栈帧结构、方法调用、字节码解释执行引擎 运行时栈帧结构局部变量表操作数栈动态连接方法返回地址 方法调用解析分派静态分派动态分派 基于栈的字节码解释执行引擎 运行时栈帧结构 Java虚拟机以方法作为最基本的执行单元&#xf…

栈在表达式中的应用(中/后前缀的转换)机算,手算模拟。

一.中缀表达式转后缀表达式 初始化一个栈&#xff0c;用于保存 暂时还不确定的运算顺序的“运算符” 。 从 左往右 依次扫描&#xff0c;会遇到三种情况&#xff1a; 1.遇到 操作数&#xff0c;直接加入后缀表达。 2.遇到 界限符&#xff1a;     ①遇到 “(” 入栈。  …

计算机系统-虚拟存储器

例行前言&#xff1a; 本篇不是学习课程时的笔记&#xff0c;是重看这本书时的简记。对于学习本课程的同学&#xff0c;未涉及的内容不代表考试不涉及(mmap&#xff0c;动态存储器分配&#xff0c;linux虚拟存储器)。本章的大部分内容已经在OS中学习过了&#xff0c;但本章内容…

SSM架构项目实战(CRM)

开始时间&#xff1a;7月17日 技术架构 &#xff08;一&#xff09;Web开发4层开发 视图层&#xff08;view&#xff09;&#xff1a;展示数据&#xff0c;跟用户交互。《html&#xff0c;css&#xff0c;js&#xff0c;jquery&#xff0c;bootstrap&#xff08;ext|easyUI&…

代码随想录算法训练营第三十五天 | 两维贪心、重叠区间

860.柠檬水找零 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;看上去复杂&#xff0c;其实逻辑都是固定的&#xff01;LeetCode&#xff1a;860.柠檬水找零_哔哩哔哩_bilibili 状态&#xff1a;能直接做出来。 思路 只需要维…

【java-04】深入浅出多态、内部类、常用API

主要内容 多态 内部类 常用API 1 多态 1.1 面向对象三大特征 ? 封装 , 继承 , 多态 1.2 什么是多态 ? 一个对象在不同时刻体现出来的不同形态 举例 : 一只猫对象 我们可以说猫就是猫 : Cat cat new Cat();我们也可以说猫是动物 : Animal cat new Cat();这里对象在不…

知识推理——CNN模型总结

记录一下我看过的利用CNN实现知识推理的论文。 最后修改时间&#xff1a;2023.05.08 目录 1.ConvE 1.1.解决的问题 1.2.优势 1.3.贡献与创新点 1.4.方法 1.4.1 为什么用二维卷积&#xff0c;而不是一维卷积&#xff1f; 1.4.2.ConvE具体实现 1.ConvE 论文&#xff1a…

聊聊我在阿里第一年375晋升的心得

前言 思来想去&#xff0c;觉得这个事情除了领导赏识大佬抬爱之外&#xff0c;还是挺不容易的&#xff0c;主观认为有一定的参考价值&#xff0c;然后也是复盘一下&#xff0c;继续完善自己。 绩效 首先晋升的条件就是要有个好绩效&#xff0c;那么我们就先基于绩效这个维度…

基于`IRIS`列存储,我们能做什么

文章目录 基于IRIS列存储&#xff0c;我们能做什么简介使用场景如何使用列存储什么情况下使用列储存统计数据数量count计算字段平均值avg计算字段和sum 列存储与行存储区别总结 基于IRIS列存储&#xff0c;我们能做什么 简介 列存储是一种数据存储方式&#xff0c;与传统的行…

Win11-RTX4060安装Pytorch-GPU干货避坑指南

文章目录 1、版本要和pytorch官网对应&#xff0c;CUDA11.8及其对应版本的cudnn2、CUDA Toolkit安装出现自动重启3、Python版本4、配置永久国内镜像源5、要在激活的虚拟环境里安装pytorch6、进入python后检查是否gpu配置成功7、在虚拟环境中启动jupyter notebook8、conda中inst…

【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)

目录 零、学习内容一、镜像结构二、Dockerfile四、基于 java:8-alpine 构建自己的 Java 项目镜像 零、学习内容 镜像结构Dockerfile 语法构建 Java 项目 ① 之前使用的镜像都是 DockerHub 官方提供的 ② 开发者需要将自己的微服务制作为镜像 一、镜像结构 镜像是由应用程序及其…

【新星计划-2023】什么是ARP?详解它的“解析过程”与“ARP表”。

一、什么是ARP ARP&#xff08;地址解析协议&#xff09;英文全称“Address Resolution Protocol”&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确…

ConcurrentHashMap实现原理

1. 哈希表 1.1 介绍 哈希表是一种key-value存储数据的结构&#xff0c;根据key即可查到对应的value。 如果所有的键是整数&#xff0c;我们可用简单的无序数组来表示&#xff0c;键作为数组索引&#xff0c;值即为对应的值 1.2 链式哈希表 链式哈希表本质由一组链表构成。每…

用MacBook实操:docker本地部署mysql+php+nginx坏境

大家好&#xff0c;我拿出我的macbook,带着大家实操用docker部署mysqlphpnginx环境。 之前的小白实操搭建Nginx1.2.0PHP7.0MySQL5.7Thinkphp5项目&#xff0c;看这篇就够了&#xff0c;欢迎阅读。 之前的是服务器上配置环境&#xff0c;现在在mac本地搭建全栈开发环境。 目录…

LiveData详解(实战+源码+粘性事件解决方案)

1. 简介 LiveData 是一种可观察的数据存储器类。与常规的可观察类不同&#xff0c;LiveData 具有生命周期感知能力&#xff0c;意指它遵循其他应用组件&#xff08;如 activity、fragment 或 service&#xff09;的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周…

mysql查询之子查询

0. 概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又叫子查询。 查询可以基于一个表或多个表。子查询可以添加到SELECT、UPDATE和DELETE中&#xff0c;而且可以进行多层嵌套。子查询常用操作符有 ANY(SOME)&#xff0c;ALL、IN、EXISTS。也可以使用比较运…