Linux网络编程,创建api的使用方式

本节将详细介绍Linux网络编程,主要包括套接字的作用,Linux的I/O多路复用模型epoll,在网络编程中,套接字就像是网络世界的通信端口。每一个联网的应用程序,为了能够互发消息,都会使用到这样一个端口。这个端口允许数据从一个程序流向另一个程序。简而言之,套接字是应用程序用来在网络上交流的桥梁。而I/O 多路复用允许一个进程或线程同时监控多个网络 sockets 的状态。它通过单个系统调用(select)来检查多个 sockets 是否有数据可读、可写或是否有异常。Linux 提供了多种 I/O 复用技术,包括上面提到的 select、以及 poll、epoll。

基本使用

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include <unistd.h>
#include<iostream>#define BUFFER_SIZE 1024int main(){int socket_fd = socket(AF_INET, SOCK_STREAM, 0);if (socket_fd == -1) {std::cerr << "socket error" << std::endl;return 1;}// 设置地址重用int opt = 1;if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1){std::cerr << "setsockopt error" << std::endl;return 1;}// 绑定地址和端口sockaddr_in address{};address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(12355);if (bind(socket_fd, (sockaddr*)&address, sizeof(address)) < 0) {perror("bind failed");close(socket_fd);return 1;}// 开始监听if (listen(socket_fd, SOMAXCONN) < 0) {perror("listen failed");close(socket_fd);return 1;}std::cout << "Server is listening on port 12355..." << std::endl;while (true) {sockaddr_in client_addr{};socklen_t client_len = sizeof(client_addr);int client_fd = accept(socket_fd, (sockaddr*)&client_addr, &client_len);if (client_fd == -1) {perror("accept failed");continue;}char buffer[BUFFER_SIZE];ssize_t bytes_read = read(client_fd, buffer, BUFFER_SIZE);if (bytes_read > 0) {buffer[bytes_read] = '\0';std::cout << "Received: " << buffer;write(client_fd, buffer, bytes_read);}close(client_fd);}close(socket_fd);return 0;
}

上面的代码演示了如何启动Linux的网络服务,我们一个一个讲解代码中用到的函数有什么用。

socket函数

socket函数用于创建套接字,下面是函数原型

/* Create a new socket of type TYPE in domain DOMAIN, usingprotocol PROTOCOL.  If PROTOCOL is zero, one is chosen automatically.Returns a file descriptor for the new socket, or -1 for errors.  */
extern int socket (int __domain, int __type, int __protocol) __THROW;
  • domain表示协议族,一般为AF_INET,表示IPv4协议族;AF_INET6表示IPv6协议族
  • type表示套接字类型,一般为SOCK_STREAM,表示TCP套接字;SOCK_DGRAM表示UDP套接字。
  • protocol表示协议,一般为0,表示默认协议。默认的协议通常是与给定的域和套接字类型最匹配的协议
    Linux网络API返回值类型通常是int型。这些函数的返回值表示函数执行的结果或错误代码。如果函数执行成功,则返回一个非负的套接字描述符,
    用于后续的套接字操作。如果函数执行失败,则返回-1,并且可以通过检查全局变量errno来获取具体的错误代码。

setsockopt()函数

setsockopt()函数用于设置套接字。它允许应用程序在已打开的套接字上设置各种选项,以控制套接字的行为。下面是函数原型:

/* Set socket FD's option OPTNAME at protocol level LEVELto *OPTVAL (which is OPTLEN bytes long).Returns 0 on success, -1 for errors.  */
extern int setsockopt (int __fd, int __level, int __optname,const void *__optval, socklen_t __optlen) __THROW;
  • fd表示套接字描述符;
  • level表示选项所在的协议层。常用的协议层包括SOL_SOCKET(通用套接字选项)、IPPROTO_TCP(TCP协议选项)和IPPROTO_IP(IP协议选项)等,一般为SOL_SOCKET;
  • optname表示要设置的选项,例如SO_REUSEADDR表示地址重用选项;
  • optval表示要设置的选项值,这是一个指针;
  • optlen表示选项值的长度。

sockaddr_in结构体

sockaddr_in address{};
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(12355);
  • sin_family:地址族,通常设置为 AF_INET(表示 IPv4)
  • sin_port:端口号,以网络字节序存储
  • sin_addr:IP 地址,以网络字节序存储
  • sin_zero:填充字节,用于对齐。
    htons用于将主机字节序的短整型数转换为网络字节序。网络字节序是大端字节序(Big-Endian),而主机字节序可能是小端(Little-Endian)或大端,具体取决于硬件架构。

bind函数

bind 函数可以将指定的套接字与特定的 IP 地址和端口进行绑定。函数原型如下:

/* Give the socket FD the local address ADDR (which is LEN bytes long).  */
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)__THROW;
  • fd表示套接字描述符;
  • addr表示要绑定的地址,是一个指针;
  • len表示地址的长度。

listen 函数

listen 函数用于将一个套接字转换为监听套接字,使其能够接受传入的连接请求。它是 TCP 服务器端编程中的一个关键步骤。

/* Prepare to accept connections on socket FD.N connection requests will be queued before further requests are refused.Returns 0 on success, -1 for errors.  */
extern int listen (int __fd, int __n) __THROW;
  • fd表示套接字描述符;
  • n表示最大连接请求队列的长度。一般设置为 SOMAXCONN,表示系统可以同时处理的最大连接请求数。
    这个队列用于保存尚未被 accept 函数处理的连接请求。

accept 函数

accept 函数用于接收来自其他套接字的连接请求。函数原型如下:

/* Await a connection on socket FD.When a connection arrives, open a new socket to communicate with it,set *ADDR (which is *ADDR_LEN bytes long) to the address of the connectingpeer and *ADDR_LEN to the address's actual length, and return thenew socket's descriptor, or -1 for errors.This function is a cancellation point and therefore not marked with__THROW.  */
extern int accept (int __fd, __SOCKADDR_ARG __addr,socklen_t *__restrict __addr_len);
  • fd表示监听套接字描述符;
  • addr是一个指向 struct sockaddr 类型的指针,用于存储连接的客户端的地址信息。;
  • addr_len表示addr的长度。
    如果接受连接成功, accept 函数返回一个新的套接字文件描述符,用于与客户端进行通信。accept 函数会阻塞程序的执行,直到有客户端连接请求到达,或者出现错误。在多线程或多进程的网络编程中,可以使用 accept 函数来接受客户端连接请求,并将处理客户端请求的任务交给其他线程或进程来处理。

读写函数

用于读取数据

ssize_t read (int __fd, void *__buf, size_t __nbytes)
  • fd 文件描述符,表示要从中读取数据的文件、套接字或其他 I/O 设备。
  • buf 指向缓冲区的指针,用于存储从文件描述符中读取的数据。
  • count 要读取的最大字节数。实际读取的字节数可能小于这个值,具体取决于可用数据和系统限制。
    如果文件描述符是阻塞模式(这是默认行为),read 函数会阻塞线程,直到有数据可读或者发生错误。这意味着线程会暂停执行,直到以下情况之一发生,如果文件描述符被设置为非阻塞模式(通过 fcntl 函数设置 O_NONBLOCK 标志),read 函数不会阻塞线程。
// 设置文件描述符为非阻塞模式
int set_nonblocking(int fd) {int flags = fcntl(fd, F_GETFL, 0);if (flags == -1) return -1;return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

write函数就不过多介绍了用法一样,功能只是变成了发送数据

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

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

相关文章

ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用

Elasticsearch安装及Spring应用 一、引言二、基本概念1.索引&#xff08;Index&#xff09;2.类型&#xff08;Type&#xff09;3.文档&#xff08;Document&#xff09;4.分片&#xff08;Shard&#xff09;5.副本&#xff08;Replica&#xff09; 二、ELK搭建1.创建挂载的文件…

Redis,从数据结构到集群的知识总结

Redis基础部分 2. 数据结构 redis底层使用C语言实现&#xff0c;这里主要分析底层数据结构 2.1 动态字符串(SDS) 由于C底层的字符串数组一旦遇到’\0’就会认为这个字符串数组已经结束&#xff0c;意味着无法存储二进制数据&#xff08;如图片、音频等&#xff09;&#xff…

【redis】Jedis 操作 Redis 基础指令(下)

列表操作 lpush/rpush 和 lpop/rpop 将一个或者多个元素从左/右侧放入&#xff08;头/尾插&#xff09;到 list 中 依次头插 从 list 左/右侧取出元素&#xff08;即头/尾删&#xff09; public static void test1(Jedis jedis) { jedis.flushAll(); long n jedis.lpush(…

基于消失点标定前视相机外参

1. 消失点 艺术家&工程师在纸上表现立体图时,常用一种透视法,这种方法源于人们的视觉经验:近大远小,且平行的直线都消失于无穷远处同一个点。就像我们观察两条平行的铁轨时会觉得他们相交于远处的一点,我们把这个点称为消失点。 图1 铁轨组成的消失点 2. 在标定中的应…

TypeScript接口 interface 高级用法完全解析

TypeScript接口 interface 高级用法完全解析 mindmaproot(TypeScript接口高级应用)基础强化可选属性只读属性函数类型高级类型索引签名继承与合并泛型约束设计模式策略模式工厂模式适配器模式工程实践声明合并类型守卫装饰器集成一、接口核心机制深度解析 1.1 类型兼容性原理 …

Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法

Vue3 Pinia $subscribe 可以用来监视Stroe数据的变化 localStorage的用法 localStorage中只能存字符串&#xff0c;所有对象要选转成json字符串 定义store时&#xff0c;从localStorage中读取数据talkList可能是字符串也可能是空数组 Store的组合式写法 直接使用reactiv…

新版AndroidStudio / IDEA上传项目到Gitee

目录 1.Gitee创建仓库 2.填写仓库的信息 3.创建成功后复制仓库的地址 4.检查AndroidStudio是否配置Git 5.点击测试 6.之后Create Git Repository 7.添加到本地仓库 8.提交项目 9.添加上传仓库的地址 10.上传成功 11.去Gitee上刷新检查 1.Gitee创建仓库 2.填写仓库的…

用 Vue 3.5 TypeScript 重新开发3年前甘特图的核心组件

回顾 3年前曾经用 Vue 2.0 开发了一个甘特图组件&#xff0c;如今3年过去了&#xff0c;计划使用Vue 3.5 TypeScript 把组件重新开发&#xff0c;有机会的话再开发一个React版本。 关于之前的组件以前文章 Vue 2.0 甘特图组件 下面录屏是是 用 Vue 3.5 TypeScript 开发的目前…

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…

Matlab 基于专家pid控制的时滞系统

1、内容简介 Matlab 185-基于专家pid控制的时滞系统 可以交流、咨询、答疑 2、内容说明 略 在处理时滞系统&#xff08;Time Delay Systems&#xff09;时&#xff0c;使用传统的PID控制可能会面临挑战&#xff0c;因为时滞会导致系统的不稳定或性能下降。专家PID控制通过结…

MyBatis源码分析のSql执行流程

文章目录 前言一、准备工作1.1、newExecutor 二、执行Sql2.1、getMappedStatement2.2、query 三、Cache装饰器的执行时机四、补充总结 前言 本篇主要介绍MyBatis解析配置文件完成后&#xff0c;执行sql的相关逻辑&#xff1a; public class Main {public static void main(Str…

【MySQL】数据库基础

目录 一、什么是数据库1.1 为什么要有数据库1.2 数据库的本质是什么1.3 在Linux下看一下数据库 二、主流数据库三、基本使用3.1 连接服务器3.2 服务器&#xff0c;数据库&#xff0c;表关系 四、MySQL架构五、SQL分类六、存储引擎6.1 存储引擎是什么6.2 查看存储引擎6.3 存储引…

算是解决可以访问github但无法clone的问题

本文的前提是使用了**且可以正常访问github 查看代理的端口 将其配置到git 首先查看git配置 git config --list然后添加配置&#xff0c;我这边使用的是Hiddfy默认的端口是12334&#xff0c;如果是clash应该是7890 git config --global http.proxy 127.0.0.1:12334其他 删除…

SpringBoot第三站:配置嵌入式服务器使用外置的Servlet容器

目录 1. 配置嵌入式服务器 1.1 如何定制和修改Servlet容器的相关配置 1.server.port8080 2. server.context-path/tx 3. server.tomcat.uri-encodingUTF-8 1.2 注册Servlet三大组件【Servlet&#xff0c;Filter&#xff0c;Listener】 1. servlet 2. filter 3. 监听器…

AdaLoRA 参数 配置:CAUSAL_LM“ 表示因果语言模型任务

AdaLoRA 参数 配置:CAUSAL_LM" 表示因果语言模型任务 config = AdaLoraConfig( init_r=16, # 增加 LoRA 矩阵的初始秩 lora_alpha=32, target_modules=[“q_proj”, “v_proj”], lora_dropout=0.1, bias=“none”, task_type=“CAUSAL_LM” ) 整体功能概述 AdaLoraCon…

IP 协议

文章目录 IP 协议概述数据包格式首部校验和实例分析实例一 分片抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 IP 协议 概述 IP 协议是 TCP/IP 协议簇中的核心协议&#xff0c;也…

日常开发记录-radioGroup组件

日常开发记录-radioGroup组件 1.前提2.问题&#xff1a;无限循环调用3.解释Vue 事件传播机制分析与无限循环原因解释4.解决 1.前提 在上一章的&#xff0c;我们实现了radio组件。从这进入了解 新增个radioGroup组件呢。 <template><divclass"q-radio-group&quo…

API调用comfyui工作流,做一个自己的app,chatgpt给我写的前端,一键创建自己的卡通形象,附源码

前言 工具介绍 首先 comfyui你是少不了的&#xff0c;这个是工作流的后端支持&#xff0c;用这个去调试工作流和生成API可调用文件 前端我们就用很流行的gradio吧&#xff0c;什么你一时半会没有学gradio的计划&#xff0c;没事&#xff0c;笔者也没系统学过&#xff0c;我干…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中&#xff0c;数据流&#xff08;Data Workflow&#xff09;描述了应用程序中数据的流动过程&#xff0c;涉及 Routes&#xff08;路由&#xff09;、Controllers&#xff08;控制器&#xff09;、Models&#xff08;模型&#xff09; 和 Middleware&#xff08;中间件&…

【通义千问】蓝耘智算 | 智启未来:蓝耘MaaS×通义QwQ-32B引领AI开发生产力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…