Linux网络编程——网络套接字初识

文章目录

    • 1. IP地址
    • 2. 端口号
    • 3. 初识TCP协议 && UDP协议
    • 4. 网络字节序
    • 5. socket创建API

1. IP地址

举个例子:

《西游记》中,唐僧要去取件,总是说从“东土大唐”来,前往“西天”拜佛求经,从哪里来,到哪里去,这一直都是不变的。

这里的“东土大唐”就是源IP地址,“西天”就是目的IP地址

在路上,一直发生变化的是上一站从哪来和下一站到哪去,比如说上一站在“女儿国”,下一站要去“火焰山”,这里的依据就是最终要去哪里

这里一直发生变化就叫做**mac地址**

image-20240129203746794

IP地址存在的意义就是,它能够指导我们进行路径规划。现在主流IP地址是IPv4,它是4字节32比特位的整数,例如192.168.1.1它能标定特定主机的唯一性。

当2台主机不在同一个子网的时候,那就需要把数据交给先给路由器,让路由器进行重新“路线规划”。

image-20240129205712687

“重新路线规划”之后再交给下层,即上图的令牌环驱动程序(这里只是一个例子),加上了令牌环的报头,可是这对于上层来说,它们收到报文的时候,这个报头已经去掉了。

所以有了IP协议(工作在IP层的路由器)的存在,底层的差异被屏蔽了,一切皆是IP报文

IP地址 Vs Mac地址:

IP地址(尤其是目的IP),一般都不是不会改变的;

Mac地址,出局域网之后,源和目的都会被丢弃,让路由器重新选择

image-20240129212235812

2. 端口号

  1. 网络协议栈中下三层,主要解决的是数据安全可靠传输到远端机器上(主机 -> 主机)

  2. 用户使用应用层软件完成数据的发送和接收

用户要使用这个软件,就得先把这个软件启动起来,这本质上就是进程,也就是进程A向进程B发起数据请求,这是进程通信,只不过它们使用了网络协议栈。

我们在传输层收到信息,它要向上交付给应用层,比如说应用层有很多软件:微信、QQ、淘宝什么的,应用层和传输层就需要协商一种方案,也就是端口号,传输层报文里面携带这个端口号,就能知道将数据交付给哪个应用。

端口号无论是对于客户端还是服务端,都能唯一标识该主机上的一个网络应用层的进程

在公网上,IP能标识唯一一台主机,而端口号能标识该主机的唯一进程,所以IP+Port能标识全网唯一一个进程

这种IP+Port的通信方式,我们叫做socket

在主机里面,进程pid能标识进程的唯一性,那为什么还要有port呢?

站在技术层面,用pid来标识网络应用的唯一性,是可以实现的;但是pid是系统层面的,如果系统层面改了,那网络层面也需要作出改变,所以给网络单独设计一套规则,这也就能进行解耦。

2台主机进行通信,是要绑定端口号的

image-20240129225058332

传输层内部,操作系统会实现一个哈希表,里面存的是task_struct*,当我们绑定端口号的时候,如果发现这个端口号没有在哈希表中,则可以绑定,将这个进程pcb的地址放进去;如果哈希表中有了,则表明这个端口号已被占用,需要换一个。

3. 初识TCP协议 && UDP协议

tcp(Transmission Control Protocol)udp(User Datagram Protocol)协议都是传输层的协议的,而传输层是离用户最近的,所以一般以通信为目的的代码都是传输层提供的接口,传输层提供的协议就是tcpudp

tcp叫传输控制协议:

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

在数据传输之前要保证通信信道的通畅

udp叫用户数据报协议:

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

这里的可靠和不可靠,并不是褒义贬义词,而是一个描述特征词汇

4. 网络字节序

内存多字节数据对于内存都有高低地址之分,如何存储就有了不同意见,即大端存储还是小端存储,这也说不上哪种更好。所以对于网络,就要考虑这个问题,如果大端机向小端机发送数据,那么小端在数据解析的时候,就会发送解析错误。

对于数据的存储,有兴趣可以查看此篇文章:数据的存储

计算机出现的比网络早,计算机对于大小端的争论没得出结果,网络为了不影响自己,于是直接规定网络当中的数据全部为大端,所以对于小端机,发送数据前,要先将小端转大端。

为了网络程序的可移植性,下面库函数做网络字节序和主机字节序的转换

#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标识hostn表示networkl表示32为长整数,s表示16位短整数
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回

5. 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);

套接字编程种类:

  1. 域间套接字编程

    同一个机器内(本地通信)

  2. 原始套接字编程

    绕过传输层,使用底层的接口,一般用来编写一些网络工具

  3. 网络套接字编程

    使用传输层,进行用户间的网络通信

理论上不同种类的套接字,是需要三套接口的,可是设计者直接设置成了一套(统一抽象化),要保证接口统一,参数类型必须是统一的,即struct sockaddr*

image-20240129233656858

每个接口的前2个字节是可以进行判断的

if(address->type == AF_INET)
{//网络
}
else if(address->type == AF_UNIX)
{//本地
}

这其实就是多态的体现,只是之前C语言并没这个东西,所以我们用的时候强转即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装Jdk8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 笑小枫网站下载&#xff1a;https://xiaoxiaofeng.com/resource/16 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目…

基于Matlab无刷直流电机系统仿真建模的新方法

摘 要&#xff1a;在分析无刷直流电机&#xff08;BLDC&#xff09;数学模型的基础上&#xff0c;提出了无刷直流电机系统仿真建模的 新方法。在Matlab/Simulink 中&#xff0c;建立独立的功能模块&#xff0c;如BLDC 本体模块、电流滞环控制模块、 速度控制模块等&#xff0c;…

compose部署tomcat

1.部署tomcat 1.1.下载相关镜像tomcat8.5.20 $ docker pull tomcat:8.5.20 1.2 在/data目录下创建tomcat/webapps目录 mkdir -p /data/tomcat/webapps 注意&#xff1a;这里是准备将宿主机的/data/tomcat/webapps映射到容器的 /usr/…

如何在有或没有备份的 iPhone 上检索已删除的短信

iPhone 清理垃圾短信时不小心删除了一些重要短信&#xff1f;想知道如何找回 iPhone 上已删除的短信吗&#xff1f;如果您已将设备备份到 iCloud 或 iTunes&#xff0c;则可以从备份恢复 iPhone 上的短信。如果没有备份&#xff0c;您可以尝试第三方iPhone短信恢复程序来恢复它…

qt5-入门

参考&#xff1a; qt学习指南 Qt5和Qt6的区别-CSDN博客 Qt 学习之路_w3cschool Qt教程&#xff0c;Qt5编程入门教程&#xff08;非常详细&#xff09; 本地环境&#xff1a; win10专业版&#xff0c;64位 技术选择 Qt5力推QML界面编程。QML类似HTML&#xff0c;可以借助CSS进…

消息中间件RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布&#xff0c;是一个在AMQP(高级消息队列协议)基础上完成的&#xff0c;简称MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法&#xff0c;由Erlang&#xff08;专门针对于大…

贪吃蛇游戏的实现

一.技术要点: 贪吃蛇需要掌握: c语言函数,枚举,结构体,动态内存管理,预处理指令,链表,Win32 API等 二.Win32 API 1.Win32 API简介 windows可以帮应用程序卡其视窗,描绘图案,使用周边设备,,Win32 API就是windows32位平台上的应用程序编程接口 2.控制台程序 (1).使用cmd命令…

ubuntu20-github不通问题

github不通 一直在github下载失败 Git报错fatal unable to connect to github.com: github.com[0: 20.205.243.166] >>> alsa-ucm-conf v1.2.6.3 Downloading(卡在这里,很烦啊) 然后搜了很多文档,然后以下操作: 1.GitHub.com - GitHub: Lets build from here Git…

GPT-4 Vision根据应用程序截图生成博客和Readme 升级Streamlit八

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

stm32中的SPI

SPI的简介 文章目录 SPI的简介物理层协议层基本通讯过程起始和终止信号数据有效性CPOL/CPHA及通讯模式 STM3的SPI特性及架构通讯引脚时钟控制逻辑数据控制逻辑整体控制逻辑通讯过程 代码配置实现指令集结构体的定义SPI时钟信号的定义SPI端口定义SPI命令 flash驱动代码初始化代码…

纯html+js+css个人博客

首页 <!DOCTYPE HTML> <html> <head> <title>博客</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta name"viewport" content"widthdevice-width, initial-sca…

LLM之RAG实战(二十一)| 使用LlamaIndex的Text2SQL和RAG的功能分析产品评论

亚马逊和沃尔玛等电子商务平台上每天都有大量的产品评论&#xff0c;这些评论是反映消费者对产品情绪的关键接触点。但是&#xff0c;企业如何从庞大的数据库获得有意义的见解&#xff1f; 我们可以使用LlamaIndex将SQL与RAG&#xff08;Retrieval Augmented Generation&#x…

基于链表实现贪吃蛇游戏

本文中&#xff0c;我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 &#xff08;1&#xff09;游戏载入界面 &#xff08;2&#xff09;地图的绘制 &#xff08;3&#xff09;蛇身的移动和变长 &#xff08;4&#xff09;食物的生成 &#xff08;5&…

2024-01-25 力扣高频SQL50题目1193每月交易

1.1193每月交易 1 count可以这样用。。 COUNT(IF(state approved, 1, NULL)) AS approved_count 如果 COUNT(if(state approved,1,0))&#xff0c;这里变成0&#xff0c;就不对了。因为count计数时候&#xff0c;只要里面不是null&#xff0c;就会算进去。 sum(if(state …

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的&#xff0c;虽然刚开始会花费时间用来学习&#xff0c;但是实践证明&#xff0c;虽然学习新东西可能会花费一些时间&#xff0c;但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的&#xff0c;也是很有乐趣的。 网络上…

【数据库】聊聊explain如何优化sql以及索引最佳实践

在实际的开发中&#xff0c;我们难免会遇到一些SQL优化的场景&#xff0c;虽然之前也看过周阳的课程&#xff0c;但是一直没有进行细心的整理&#xff0c;所以本篇会进行详细列举explain的相关使用&#xff0c;以及常见的索引最佳实践&#xff0c;并通过案例进行讲解。 数据准…

数学公式OCR识别php 对接mathpix api 使用公式编译器

数学公式OCR识别php 对接mathpix api 一、注册账号官网网址&#xff1a;https://mathpix.com 二、该产品支持多端使用注意说明&#xff08;每月10次&#xff09; 三、api 对接第一步创建create keyphp对接api这里先封装两个请求函数&#xff0c;get 和post &#xff0c;通过官方…

短视频与小程序:如何实现完美结合?

在短视频日益成为人们娱乐、社交和信息获取的重要渠道的今天&#xff0c;如何在短视频平台进行小程序推广成为了许多企业和品牌关注的焦点。本文将介绍如何利用短视频平台进行小程序推广&#xff0c;提升品牌曝光和用户互动。 首先&#xff0c;打开乔拓云-门店系统的后台&#…

ArcGIS Pro如何新建字段

无论是地图制作还是数据分析&#xff0c;字段的操作是必不可少的&#xff0c;在某些时候现有的字段不能满足需求还需要新建字段&#xff0c;这里为大家讲解一下在ArcGIS Pro中怎么新建字段&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的水…

Dragons

题目链接&#xff1a; Problem - 230A - Codeforces 解题思路&#xff1a; 用结构体排序就好&#xff0c;从最小的开始比较&#xff0c;大于就加上奖励&#xff0c;小于输出NO 下面是c代码&#xff1a; #include<iostream> #include<algorithm> using namespac…