当前位置: 首页 > news >正文

【Linux网络】套接字Socket编程预备

前言:

        上文我们讲到了,讲到了对于网络的初步认识,知道了网络一系列基本概念【Linux网络】初识网络,网络的基础概念-CSDN博客

        本文正对上文的套接字,来认识套接字在函数接口的认识,在编程上的使用;最终模拟实现服务器与客户端,来深入理解套接字。


Socket编程预备

理解传入数据的目的

        IP地址在网络中标记主机唯一性。源主机通过目标主机的IP地址,将数据传输给目标主机。

        但将数据传输给主机是目的吗?不是!因为数据最终都是给人用的,将数据传输给主机只是手段。比如:QQ聊天,其实是人在聊;浏览网页数据,其实是人在浏览。

        那么,人应该如何获取对应的数据呢?通过启动对应的应用程序获得!比如:想要获得聊天消息,就要启动QQ等聊天程序;想要获取网页数据,就要启动浏览器。

        而对应的应用程序都是进程。换句话说,进程就是人在计算机中的代表,只要把数据交给对应的进程,就相当于交给了人。

        所以,数据传输到主机并不是目的,而是手段;最终将数据交给对应的进程才是目的!

认识端口号

我们现在知道了数据传输给目标主机后,最终目的是将数据交给对应的进程。但是计算机中有不计其数的进程,如何交给正确的进程呢?端口号,正是解决这一问题的答案!

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

        端口号用于标识一台计算机中唯一的进程。其本质是一个2字节16位的整数。

        一个端口号只能被一个进程占用,但一个进程可以拥有多个端口号。只需确保一个端口号对应唯一一个进程即可。

        通过IP地址 + 端口号,我们就可以得到全网唯一的一个进程!于是我们惊讶的发现:网络通信的本质,其实就是进程间通信!

端口号范围划分

        0~1023:知名端口号如HTTP,FTP,SSH等。这些广为使用的应用层协议,它们的端口号都是固定的!

        1024~65535:这个范围才是我们能够使用的端口号。不过端口号是由OS动态分配的,我们并不能指定端口号。

理解端口号与PID

        我们讲端口号port是标识计算机中唯一的进程,但是我们也知道PID也是标识计算机中唯一的进程。那为什么不使用PID,而又引用端口号来标识呢?

        因为如果我们用PID代替端口号,那么操作系统与网络就会产生强耦合!而我们追求的高内聚,低耦合。所以就并没有这么做。

理解源端口号与目的端口号

        传输成协议(TCP与UDP)的数据段中有两个端口号,分别叫做源端口号目标端口号其本质就是在描述:谁发送的数据、要发给谁。

理解套接字socket

        我们上面讲到了 IP + 端口号标识了全网唯一的一个进程

        我们把 IP + 端口号 就叫做套接字socket,它能在整个网络里唯一确定一个进程,方便网络中不同进程通过它来通信。

简单认识传输层协议

传输层是属于OS内核的,用户想要调用任何接口,使用任何功能都必须调用对应的系统调用。传输层协议有两个经典代表:UDP、TCP

TCP协议

        TCP(Transmission Control Protocol,传输控制协议)

其特点为:

        有链接:通信前需要先建立链接。比如打电话,想要通信必须拨打电话并且等待对方接通。

        可靠传输:确保数据准确有效到达。

        面向字节流:以字节为单位传输数据。

UDP协议

        UDP(User Dategram Protocol,用户数据报协议)

其特点为:

        无链接:通信前不想要建立链接。比如对讲机,想要通信时直接发送信息即可,不需要等待谁。

        不可靠传输:不确保数据准确有效到达。

        面向数据报:以独立数据为单位传输。

网络字节序

我们知道计算机是分为大端机与小端机的。

大端机意思是,其内部的数据是按照大端存储的,既高位数据放在低地址处,低位数据放在高地址处。

小端机意思是,其内部的数据是按照小端存储的,既高位数据放在高地址处,低位数据放在低地址处。

        发送数据的主机通常将缓冲区中的数据,按照内存地址从低到高发送。但对于大小端主机来说,就算是相同的数据,发送后也会变得不一样!

        所以,为了保证大小端主机发送信息的一致性。TCP/IP协议规定:网络数据流应采用大端字节序。

        不论大小端主机,都必须遵守这个协议。大端主机发送数据不影响,而小段主机发送数据时,必须先将数据转化为大端,再进行发送!

其中,为了让代码在不同的大小端机器上具备可移植性,我们可以使用以下库函数,来完成网络字节序与主机字节序的转化

#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为长整数,n表示16位短整数如果主机是小端机,这些函数就会进行相应的转化
如果主机是大端机,这些函数将不会执行转化工作

Socket编程接口

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

Sockadd结构体

        我们注意到在Socket接口中,存在参数为struct sockeaddr* 的参数。下面我们来认识一下这个参数。

        套接字socket执行的通信标准是POSIX标准。而POSIX标准是包含了网络通信与本地通信的,这也就意味着执行这套标准的socket要支持多种通信方式

        但socket的实现者,不想提供多个针对于不同通信的接口,只想提供一个接口来完成多种通信方式。于是结构体Sockeaddr诞生了!

        通过结构体的内存布局兼容实现:struct sockaddr作为基类,struct sockaddr_in与struct sockaddr_un作为子类继承基类、实现多态的作用。struct sockaddr_in用于网络通信,struct sockaddr_un用于本地通信。这样就实现了一个接口多种通信功能

http://www.dtcms.com/a/523561.html

相关文章:

  • day18_菜单查询 合并servlet
  • 算法总结篇(枚举-分治)
  • TCP pure ACK 的不可扩展性问题
  • Android16 Wifi打开到自动连接的主要日志过程分析介绍
  • 背包dp——动态规划
  • 找做柜子的网站中国芯片制造最新消息
  • 甘肃省临夏州建设局网站wordpress 未分类
  • 用 Excalidraw+cpolar 做会议协作,像素级还原实体白板体验
  • 使用C++开发Android .so库的优势与实践指南
  • Spring AOP:注解配置与XML配置双实战
  • 基于YOLO11深度学习的半导体晶圆外观缺陷检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】
  • 笔记本电脑待机、睡眠与休眠模式的技术差异解析
  • 2025丨时间很快,又来到1024
  • 基于python人脸识别系统 人脸检测 实时检测 深度学习 Dlib库 ResNet深度卷积神经网络 pyqt设计 大数据(源码)✅
  • 【C + +】unordered_set 和 unordered_map 的用法、区别、性能全解析
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-31- 操作日历时间控件-上篇(详细教程)
  • 电子商城网站建设与维护怎么建设淘客自己的网站_
  • 基于 Vue3 + WebSocket 实现的平板控制端与大屏展示端联动方案
  • 提高自己的网站网站 利润
  • 外贸seo软文发布平台上海百度推广优化排名
  • Qt 图像与定时器实战:实现动态图片轮播效果
  • C++ 模板初阶:从函数重载到泛型编程的优雅过渡
  • 第 01 天:Linux 是什么?内核、发行版及其生态系统
  • Docker 安装 MongoDB 完整指南:从入门到实战
  • Docker 离线安装
  • CUDA和cuDNN安装
  • 一篇初识什么是容器,引出 Docker
  • HTML 理论笔记
  • 《Linux系统编程之入门基础》【权限管理】
  • ELK(Elasticsearch + Logstash + Kibana + Filebeat)采集方案