【Linux取经路】网络套接字编程——初识篇

在这里插入图片描述

文章目录

  • 一、端口号
    • 1.1 认识端口号
    • 1.2 端口号 VS 进程 PID
  • 二、认识 TCP 协议
  • 三、认识 UDP
  • 四、网络字节序列
  • 五、socket 编程接口
    • 5.1 常用 API
    • 5.2 sockaddr 结构
  • 六、结语

一、端口号

网络通信的本质是应用层软件进行数据的发送和接受,软件在启动之后,本质上就是进程,所以网络通信的本质就是进程间通信。网络协议中的下三层,主要解决的是数据安全可靠的送到远端机器。

1.1 认识端口号

  • 端口号是一个2字节16位的整数。

  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理。

  • IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程。

  • 一个端口号只能被一个进程占用。

  • 我们把这种基于 IP + 端口号的通信就称作 socket

1.2 端口号 VS 进程 PID

PID 已经可以唯一标识一个进程,为什么还有有端口号的概念?因为并不是所有进程都要进行网络通信,但是所有进程都要有 PID,其次单独设置端口号可以让系统和网络功能进行解耦。但是一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定。

image-20240318081741816

每个服务的端口号必须是众所周知的。

二、认识 TCP 协议

  • 传输层协议

  • 有连接

  • 可靠传输(丢包重传、按需到达等,虽然可靠,但是复杂)

  • 面向字节流

三、认识 UDP

  • 传输层协议
  • 无连接
  • 不可靠传输(只要发出去了就不管了)
  • 面向数据报

四、网络字节序列

在内存中的多字节数据相对于内存地址有大端和小端之分,两台进行网络通信的主机,可能发方采用大端,收方采用小端,此时就会出现发方根据大端的规则去发送数据,而收方是按照小端的规则去解释数据的,这样就会导致收方将数据解释出来的意思并不是发方的本意。因此,网络规定:

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。

  • 接收主机把从网络上接到的字节依次保存在接受缓冲区中,也是按照内存地址从低到高的顺序保存。

  • 因此,网络数据流的地址应该这样规定**:先发出的数据是低地址,后发出的数据是高地址**。

  • 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 地址转换后准备发送。

  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。

  • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

五、socket 编程接口

5.1 常用 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);
  • socket 参数是 socket 函数额返回值,本质上就是一个文件描述符。

5.2 sockaddr 结构

sockt API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4IPv6,以及 UNIX Domain Socket。然而各种网络协议的地址格式并不一样。套接字编程一共有三种:域间套接字(一个主机内部的进程之间进行通信)、原始套接字(可以跳过传输层,通常用来编写一些网络工具)、网络套接字(用户间的网络通信)。因为套接字编程有三种,所以一般的想法是,设计出三套不同的套接字编程接口,但是这里为了简化,实际上只设计了一套接字编程接口。既然只设计了一套接口,那就要求不管是哪种套接字编程,都只能调用这一种接口,那就要求参数必须要一样。struct sockaddr 就起到这样的作用,它将三种套接字编程的参数类型进行了统一。从下图可以看到,struct sockaddr_in 就是网络套接字的类型,struct sockaddr_un 就是域间套接字的类型,它们的前两字节都存的是套接字类型,所有的套接字编程接口,在内部会去检查类型,然后去执行不同的套接字编程代码。

image-20240318092814581

  • IPv4IPv6 的地址格式定义在 netinet/in.h 中,IPv4 地址用 sockaddr_in 结构体表示,包括 16 位地址类型,16 位端口号和 32 位 IP 地址。

  • IPv4IPv6 地址类型分别定义为常数 AF_INETAF_INET6。这样,只要取得某种 sockaddr 结构体的首地址,不需要知道具体是哪中类型的 sockaddr 结构体,就可以根据地址类型字段确定结构体中的内容。

  • socket API 可以都用 struct sockaddr* 类型表示,在使用的时候需要强制转化成 sockaddr_in;这样做的好处就是程序的通用性,可以接受 IPv4IPv6,以及 UNIX Domain Socket 各种类型的 sockaddr 结构体指针作为参数。

六、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

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

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

相关文章

使用C++实现YOLO图像分类:从环境搭建到性能评估的完整指南

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

python的优势有哪些?

python的优点很多&#xff0c;下面简单地列举一些&#xff1a; 简单 Python的语法非常优雅&#xff0c;甚至没有像其他语言的大括号&#xff0c;分号等特殊符号&#xff0c;代表了一种极简主义的设计思想。阅读Python程序像是在读英语。 易学 Python入手非常快&#xff0c;学习…

如何打造不一样的景区文旅VR体验馆项目?

近年来影院类产品迅速火爆&#xff0c;市面上的产品越来越多&#xff0c;投资者可以说是挑花了眼。为了助力投资者实现持续盈利&#xff0c;今天来给大家分析目前普乐蛙大爆新品悬空球幕飞行影院与其他5D/7D影院有哪些区别&#xff0c;给大家的创业投资之路避避雷~ 那我们正式开…

将现有web项目打包成electron桌面端教程(一)vue3+vite+js版

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3vitets或者vue-cli的打包方式各不同&#xff0c;如果你的项目不是vue…

GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?

Python凭借着简单易学、功能强大&#xff0c;已经跃居TIOB编程语言榜首&#xff0c;并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程&#xff0c;是每个Python爱好者面临的首要问题。 今天给小伙伴们带来的是图灵&京东认证的“Python编程入门三剑客”&…

搜维尔科技:Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

openh264 自适应量化功能源码分析

openh264 OpenH264是一个开源的H.264/AVC视频编解码器&#xff0c;由Cisco公司发起并贡献了最初的代码基础。它提供了一个用于视频编码和解码的库&#xff0c;支持H.264视频压缩标准&#xff0c;广泛应用于视频会议、流媒体和视频存储等领域。OpenH264是实现H.264编解码功能的…

纷享销客安全体系:物理与环境安全

纷享销客的物理设备托管在经过严格准入制度授权的TIER3级别以上的专业数据中心&#xff0c;这些数据中心均通过了等保三级与IS027001安全认证&#xff0c;确保电力、制冷等基础设施提供相应级别的冗余&#xff0c;以增强IDC环境的安全性。 业务操作系统平台采用当前广泛使用的…

某h5st逆向分析

具体网址经过了base64处理 aHR0cHM6Ly9zby5tLmpkLmNvbS93YXJlL3NlYXJjaC5hY3Rpb24/a2V5d29yZD0lRTklOTklQTQlRTYlQjklQkYlRTYlOUMlQkEmc2VhcmNoRnJvbT1ob21lJnNmPTE1JmFzPTA 要做的是一个搜索的功能具体如图所示。 这里发现携带的参数中存在一个token还有一个加密参数&#x…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

node.js漏洞——

一.什么是node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常…

5-Django项目--分页与搜索(资产页面)

目录 views/asset_data.py asset_data/asset_data.html 搜索与分页笔记: 搜索 整数搜索 字符串搜索 分页 views/asset_data.py # -*- coding:utf-8 -*- from django.shortcuts import render, redirect, HttpResponse from django.utils.safestring import mark_safe f…

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd&#xff0c;切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

usb的hid报表描述符的数据含义详解

报表描述符组成基本单元item 项目编码有二种&#xff1a;短项目和长项目&#xff0c;长项目仅是保留给未来使用&#xff0c;所以不作介绍。下面是短item时&#xff0c;最后一个字节描述了item种类和尺寸 长item格式如下&#xff1a; 短格式如下 bSize &#xff1a;代表后面的…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目&#xff0c;包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因为PasteTemplate就是基于ABP的框架精简而来&#xff01;在…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类&#xff1a; package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

体育器材管理系统(Java+MySQL)

技术栈 Java语言&#xff1a;作为主要编程语言&#xff0c;用于编写应用逻辑和界面交互。MySQL数据库&#xff1a;用于存储和管理体育器材的相关数据。Swing窗口视图&#xff1a;用于创建图形用户界面&#xff0c;使用户能够通过窗口进行操作&#xff08;GBK编码&#xff09;。…

电源设计01

嵌入式电源设计 电池容量的计算电路充电时的选择&#xff1a; 科普硬件知识&#xff0c;写写关于电路板电源的事情。各类电源模块实物但为什么硬件工程师又必须要了解电源并且在板内自己设计电源呢&#xff1f;首先是DCDC的降压芯片下面推荐几个升压芯片&#xff1a;LDO 电池容…

vue3+elementPlus实现Radio单选切换显示不同内容

el-radio-group 组件方法&#xff1a; <template><el-radio-group v-model"radio"><el-radio :value"0">阶梯达标</el-radio><el-radio :value"1">限时达标</el-radio></el-radio-group> </templ…