【套接字-Socket】学习笔记(更新中)

devtools/2025/1/16 6:42:14/

套接字-Socket】学习笔记

  • 套接字(Socket)的概念
  • TCP通信流程
  • Socket编程中的细节
    • 字节序
    • IP地址转换
      • 主机字节序 -> 网络字节序
      • 网络字节序 -> 主机字节序
  • 参考资料

套接字(Socket)的概念

TCP/IP网络模型有四层:网络接口层网络互连层传输层应用层

当应用层(用户)通过传输层进行数据通信时,TCP协议或者UDP协议可能会需要同时为多个进程提供并发服务,也就是说多个连接或者进程需要通过同一个协议端口进行数据的传输。

因此,计算机操作系统为应用程序与TCP/IP协议的交互提供了称为套接字(Socket)的接口,可以区分不同进程间的网络通信和连接

套接字对于程序员来说是一套网络通信的接口。网络通信的主体分为两部分:客户端服务器端。在网络通信时,我们需要注意以下三个概念:IP端口通信数据

TCP通信流程

TCP协议是传输层协议,它具有以下三点特性:

  • 面向连接:它是一个双向连接,三次握手完成连接,四次挥手断开连接;
  • 安全:在TCP通信过程中,会对发送的每一个数据包进行校验,如果发现丢失会进行自动重传;
  • 流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致。
    TCP通信流程

Socket编程中的细节

字节序

目前在各种体系的计算机中所采用的字节存储机制主要有:Big-Endian(大端)和Little-Endian(小端)。

  • 小端:数据的位字节存储到内存的地址位,数据的位字节存储到内存的地址位。计算机中的数据存储默认使用小端
  • 大端:数据的位字节存储到内存的地址位,数据的位字节存储到内存的地址位。套接字通信过程中的临时数据都是大端存储的,包括接受/发送的数据、IP地址、端口

在这里插入图片描述
在Socket中已经提供了封装好的数据转换接口,包括从主机字节序到网络字节序的转换函数htonshtonl;从网络字节序到主机字节序的转换函数ntohsntohl

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主机字节序
// n: net, 网络字节序
// s: short
// l: int// 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
// 将一个短整形从主机字节序 -> 网络字节序
uint16_t htons(uint16_t hostshort);	
// 将一个整形从主机字节序 -> 网络字节序
uint32_t htonl(uint32_t hostlong);	// 将一个短整形从网络字节序 -> 主机字节序
uint16_t ntohs(uint16_t netshort)
// 将一个整形从网络字节序 -> 主机字节序
uint32_t ntohl(uint32_t netlong);

IP地址转换

在使用过程中IP地址是通过字符串来描述,也需要进行大小端的转换:

主机字节序 -> 网络字节序

// 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
int inet_pton(int af, const char *src, void *dst); 
  • int af是IP协议,AF_INET是IPV4格式的IP地址,AF_INET6是IPV6格式的IP地址;
  • const char *src是要转换的点分十进制IP地址;
  • void *dst转换后得到的大端整形IP。

网络字节序 -> 主机字节序

#include <arpa/inet.h>
// 将大端的整形数, 转换为小端的点分十进制的IP地址        
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  • const char *src是要转换的大端整形IP地址;
  • void *dst是转换后的小端点分十进制IP地址;
  • socklen_t size是指dst中最多能存储多少个字节。

参考资料

Linux教程——爱编程的大丙(强烈推荐)


http://www.ppmy.cn/devtools/37305.html

相关文章

VS Code中PlatformIO IDE的安装并开发Arduino

VS Code中PlatformIO IDE的安装并开发Arduino VS Code的安装 略 PlatformIO IDE的安装 PlatformIO IDE是是什么 PlatformIO IDE 是一个基于开源的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于嵌入式系统和物联网&#xff08;IoT&#xff09;开发。…

深拷贝和浅拷贝的区别,如何实现一个深拷贝

在JavaScript中&#xff0c;数据类型分为基本数据类型和引用数据类型。 基本数据类型是保存在栈内存中的&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;这个引用是保存在栈内存中。 浅拷贝 浅拷贝&#xff0c;指的是创建新的数据。 如果原始…

MinHashLSH

MinHash MinHash 是一种用于近似集合相似度计算的技术。它被广泛用于大规模数据集中的快速相似度估计,特别是在处理文本、图像和网络数据等领域。 MinHash 的基本思想是通过将集合中的元素哈希成一个较小的签名(通常是一个固定长度的整数或比特串),从而快速地比较两个集合…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代&#xff0c;截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记&#xff0c;还是日常沟通&#xff0c;一款好用的截图工具都能大大提升我们的效率。今天&#xff0c;我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…

VTK —— 三、标准格式 - 示例1 - 读取建模不同格式模型(支持.ply、.vtp、.obj、.stl、.vtk、.g等模型格式)(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

vcenter安装配置

步骤1 VMware vCenter 7.0 安装 VMware vCenter Server 提供了一个可伸缩、可扩展的平台&#xff0c;为虚拟化管理奠定了基础。可集中管理VMware vSphere环境&#xff0c;与其他管理平台相比&#xff0c;极大地提高了 IT 管理员对虚拟环境的控制。 VMware vCenter Server:提高在…

FTP协议与工作原理

一、FTP协议 FTP&#xff08;FileTransferProtocol&#xff09;文件传输协议&#xff1a;用于Internet上的控制文件的双向传输&#xff0c;是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的FTP应用程序&#xff0c;而所有这些应用程序都遵守同…

Python | Leetcode Python题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:row len(obstacleGrid)col len(obstacleGrid[0])dp [[0]*col for _ in range(row)]for i in range(row):for j in range(col):if not obs…