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

套接字(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教程——爱编程的大丙(强烈推荐)

相关推荐

  1. socket函数

    2024-04-30 10:38:06       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 10:38:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 10:38:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 10:38:06       87 阅读
  4. Python语言-面向对象

    2024-04-30 10:38:06       96 阅读

热门阅读

  1. BeanUtil.copyproperties()的基本使用

    2024-04-30 10:38:06       38 阅读
  2. 【无标题】

    2024-04-30 10:38:06       27 阅读
  3. CSS 控制溢出行为

    2024-04-30 10:38:06       26 阅读
  4. 远程修改注册表的reg命令

    2024-04-30 10:38:06       33 阅读
  5. Python正则表达式

    2024-04-30 10:38:06       34 阅读
  6. c++day6

    c++day6

    2024-04-30 10:38:06      32 阅读
  7. spring-ioc

    2024-04-30 10:38:06       32 阅读
  8. 【蓝桥杯2024真题】好数

    2024-04-30 10:38:06       35 阅读
  9. 算法的时间复杂度和空间复杂度

    2024-04-30 10:38:06       32 阅读
  10. 无人机证书的含金量

    2024-04-30 10:38:06       28 阅读