socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(1)

简介: 前言  本文旨在学习socket网络编程这一块的内容,epoll是重中之重,后续文章写reactor模型是建立在epoll之上的。

前言

  本文旨在学习socket网络编程这一块的内容,epoll是重中之重,后续文章写reactor模型是建立在epoll之上的。


 本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。

socket编程

socket介绍

 传统的进程间通信借助内核提供的IPC机制进行, 但是只能限于本机通信, 若要跨机通信, 就必须使用网络通信( 本质上借助内核-内核提供了socket伪文件的机制实现通信----实际上是使用文件描述符), 这就需要用到内核提供给用户的socket API函数库。


 使用socket会建立一个socket pair,如下图, 一个文件描述符操作两个缓冲区。

ce1ecc03b7ad4f9580cf9981207d6e7b.png

使用socket的API函数编写服务端和客户端程序的步骤

2f33470be4384d2a94c4a0d695d708c5.png


预备知识

网络字节序

网络字节序:大端和小端的概念


大端: 低位地址存放高位数据, 高位地址存放低位数据

小端: 低位地址存放低位数据, 高位地址存放高位数据

 大端和小端的使用使用场合:在网络中经常需要考虑大端和小端的是IP和端口。网络传输用的是大端,计算机用的是小端, 所以需要进行大小端的转换


 下面4个函数就是进行大小端转换的函数,函数名的h表示主机host, n表示网络network, s表示short, l表示long。

#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);

上述的几个函数, 如果本来不需要转换函数内部就不会做转换。

IP地址转换函数

  IP地址转换函数

int inet_pton(int af, const char *src, void *dst);

p->表示点分十进制的字符串形式

to->到

n->表示network网络

函数说明: 将字符串形式的点分十进制IP转换为大端模式的网络IP(整形4字节数)

参数说明:


af: AF_INET

src: 字符串形式的点分十进制的IP地址

dst: 存放转换后的变量的地址

例如inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);

 手工也可以计算: 如192.168.232.145, 先将4个正数分别转换为16进制数,

  192—>0xC0   168—>0xA8    232—>0xE8    145—>0x91

 最后按照大端字节序存放: 0x91E8A8C0, 这个就是4字节的整形值。

 


const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

1

函数说明: 网络IP转换为字符串形式的点分十进制的IP

参数说明:


af: AF_INET

src: 网络的整形的IP地址

dst: 转换后的IP地址,一般为字符串数组

size: dst的长度

返回值:


成功–返回执行dst的指针

失败–返回NULL, 并设置errno

 例如: IP地址为010aa8c0, 转换为点分十进制的格式:

 01---->1    0a---->10   a8---->168    c0---->192

 由于从网络中的IP地址是高端模式, 所以转换为点分十进制后应该为: 192.168.10.1


struct sockaddr

socket编程用到的重要的结构体:struct sockaddr

4c00dfa06d7848f19d19e46d42238f13.png


//struct sockaddr结构说明:
struct sockaddr {
     sa_family_t sa_family;
     char     sa_data[14];
}
//struct sockaddr_in结构:
struct sockaddr_in {
     sa_family_t    sin_family; /* address family: AF_INET */
     in_port_t      sin_port;   /* port in network byte order */
     struct in_addr sin_addr;   /* internet address */
};
/* Internet address. */
struct in_addr {
      uint32_t  s_addr;     /* address in network byte order */
};   //网络字节序IP--大端模式

通过man 7 ip可以查看相关说明

目录
相关文章
|
7月前
|
算法 API 数据安全/隐私保护
电商 API 双平台实战:淘宝 item.get + 京东 item_detail 对接指南(附可复用代码 + 问题排查)
本文详细解析了淘宝和京东双平台API对接的核心流程,涵盖资质申请、凭证获取、签名生成、高频接口调用及常见问题解决方案,助力开发者高效实现商品数据同步与管理。
|
7月前
|
数据采集 缓存 API
1688 API 实战指南:搞定批发场景的 3 大核心难题(附签名代码与避坑清单)
本文深入解析了1688 API 在批发场景下的三大核心难题及解决方案,涵盖签名机制、商品数据处理与订单同步等高频问题,提供可复用代码与避坑清单,助你高效对接1688平台。
|
9月前
|
JSON 监控 网络协议
干货分享“对接的 API 总是不稳定,网络分层模型” 看电商 API 故障的本质
本文从 OSI 七层网络模型出发,深入剖析电商 API 不稳定的根本原因,涵盖物理层到应用层的典型故障与解决方案,结合阿里、京东等大厂架构,详解如何构建高稳定性的电商 API 通信体系。
|
9月前
|
边缘计算 监控 Java
跨境电商 API 对接避坑指南:亚马逊 SP-API 超时问题的 5 种解决方案(附重试代码模板)
在对接亚马逊 SP-API 时,超时问题常导致订单延迟、库存失败,影响运营。本文总结某 3C 品牌实战经验,详解超时的 3 大根源与 5 大解决方案,涵盖动态超时、重试机制、请求拆分、并发控制与边缘加速,并附可复用 Python 代码,助你将超时率从 20% 降至 1% 以下。
|
9月前
|
安全 API 数据安全/隐私保护
低代码革命:API无代码集成如何让企业“3天上线一个生态”?
在数字化转型浪潮中,API成为释放数据价值、提升企业效率的核心。本文详解API架构设计、安全实践与跨平台集成,为CTO提供效率提升指南,涵盖微服务、安全认证、协议选择、低代码集成及未来趋势,助力企业构建敏捷、安全、高效的数字生态。
|
7月前
|
存储 监控 前端开发
淘宝商品详情 API 实战:5 大策略提升店铺转化率(附签名优化代码 + 避坑指南)
本文深入解析淘宝商品详情API的核心字段与实战应用,分享如何通过动态定价、库存预警、差评控制等5大策略提升电商转化率。结合300+店铺实战经验,提供优化代码与避坑指南,助力开发者与运营者实现数据驱动的精细化运营。
|
7月前
|
JSON API 调度
Midjourney 技术拆解与阿里云开发者实战指南:从扩散模型到 API 批量生成
Midjourney深度解析:基于优化Stable Diffusion,实现文本到图像高效生成。涵盖技术架构、扩散模型原理、API调用、批量生成系统及阿里云生态协同,助力开发者快速落地AIGC图像创作。
973 0
|
7月前
|
人工智能 API 监控
告别多接口拼凑!阿里云 API 模型聚合实现技术能力协同跃迁
API聚合整合400+国内外AI模型,统一接口、屏蔽差异,降低开发与维护成本,提升效率与系统稳定性,助力开发者高效应对多API调用困境。
794 0
|
7月前
|
人工智能 前端开发 测试技术
Kimi K2 模型更新,带来更强的代码能力、更快的 API
今天,Kimi K2 模型的最新版本 0905 开源发布,进一步提升其在真实编程任务中的表现
1753 0
|
9月前
|
缓存 算法 API
从 0 实现 API 接口签名验证系统:基于 HMAC-SHA256 的防篡改方案(附 Python 全代码)
本文介绍基于 的 API 接口签名验证系统,实现防篡改与防重放攻击,包含完整设计原理、签名生成规则及可运行的 Python 客户端与服务端代码,并提供安全性优化与部署建议。