Linux 第三十八章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

智能指针

socket

bind

struct sockaddr结构体

htons

inet_addr

recvfrom

sendto

return和exit的区别

127.0.0.1

netstat


智能指针

智能指针是 C++ 中的一个重要概念,它们是用来管理动态分配的内存,能够自动进行内存的释放,从而避免内存泄漏和悬空指针等问题。C++11 引入了三种主要的智能指针:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。

下面是它们的简要介绍和使用示例:

1. std::unique_ptr
* std::unique_ptr 是一个独占式智能指针,表示它所指向的资源只有一个所有权。
* 当 std::unique_ptr 被销毁时,它所管理的资源会被自动释放。
* 不能进行复制,但可以进行移动。

示例:

#include <memory>
int main() {// 创建一个 unique_ptr,管理一个动态分配的整型对象std::unique_ptr<int> ptr(new int(42));// 使用箭头运算符来访问所管理的对象std::cout << *ptr << std::endl;// 可以通过 release() 方法释放所有权,但不会删除资源int* rawPtr = ptr.release();// 现在 ptr 不再管理资源,需要手动释放内存delete rawPtr;return 0;
}

socket

socket() 系统调用用于创建一个套接字,并返回一个文件描述符,之后可以使用该描述符进行网络通信。

它的原型如下:

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);参数说明:
* domain:指定协议族,常见的有 AF_INET(IPv4 地址)和 AF_INET6(IPv6 地址)等。
* type:指定套接字类型,常见的有 SOCK_STREAM(面向连接的流套接字,如 TCP)和 SOCK_DGRAM(数据报套接字,如 UDP)等。
* protocol:指定使用的协议,通常设置为 0,表示使用默认协议。
成功创建套接字后,socket() 返回一个非负整数文件描述符,用于后续的套接字操作。失败时返回 -1,并设置 errno 来指示错误的原因。

示例用法:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>int main() {int sockfd;// 创建一个 IPv4 TCP 套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket");exit(EXIT_FAILURE);}printf("Socket created successfully. File descriptor: %d\n", sockfd);// 在这里可以进行后续的套接字操作,如绑定地址、连接服务器等close(sockfd); // 使用完套接字后记得关闭return 0;
}
这段代码创建了一个 IPv4 TCP 套接字,并在创建成功后打印其文件描述符。

bind

bind() 系统调用用于将一个地址绑定到套接字上,这样套接字就可以使用指定的地址和端口进行通信。

它的原型如下:

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明:
* sockfd:指定要绑定地址的套接字文件描述符。
* addr:指向包含地址信息的 struct sockaddr 结构体的指针。
* addrlen:指定 addr 结构体的长度。
成功绑定地址后,bind() 返回 0;失败时返回 -1,并设置 errno 来指示错误的原因。
通常在服务器端程序中,先创建套接字,然后通过 bind() 将套接字绑定到一个地址上。绑定的地址可以是本地主机的 IP 地址和端口,也可以是特定的网络接口地址和端口。

示例用法:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in server_addr;// 创建一个 IPv4 TCP 套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket");exit(EXIT_FAILURE);}// 设置服务器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 设置端口号为 8080server_addr.sin_addr.s_addr = INADDR_ANY; // 使用任意本地地址// 绑定地址到套接字if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind");exit(EXIT_FAILURE);}printf("Socket bound successfully.\n");// 在这里可以进行后续的套接字操作,如监听连接、接受连接等close(sockfd); // 使用完套接字后记得关闭return 0;
}

这段代码创建了一个 IPv4 TCP 套接字,并将其绑定到本地主机的 8080 端口上。

 bind函数被显式地指定了其所属的命名空间为全局命名空间,即::bind。这样可以确保不会和C++标准库中的同名函数产生冲突。

struct sockaddr结构体

struct sockaddr 是一个通用的套接字地址结构体,在网络编程中经常用于表示各种类型的地址信息。

它的定义如下:

struct sockaddr {unsigned short sa_family; // 地址族,如 AF_INET、AF_INET6 等char sa_data[14]; // 具体的地址信息,大小根据不同的地址族而变化
};


由于 struct sockaddr 是一个通用的结构体,它并不直接提供足够的信息来描述具体的地址。为了支持不同类型的地址,通常会使用其派生结构体,

例如:

* struct sockaddr_in:用于表示 IPv4 地址。
* struct sockaddr_in6:用于表示 IPv6 地址。
这些结构体在 netinet/in.h 头文件中定义。它们的定义包含了更具体的地址信息,
例如 IP 地址、端口号等。

下面是 struct sockaddr_in 的定义:

struct sockaddr_in {sa_family_t sin_family; // 地址族,总是设置为 AF_INETin_port_t sin_port; // 端口号struct sin_addr sin_addr; // IPv4 地址unsigned char sin_zero[8]; // 填充字段,用于使 sockaddr_in 和 sockaddr 保持相同的大小
};
struct sockaddr_in 中的 sin_addr 成员是一个 struct in_addr 结构体,用于表示 IPv4 地址。struct in_addr 的定义如下:
struct in_addr {in_addr_t s_addr; // IPv4 地址
};

通过使用这些结构体,我们可以方便地在网络编程中处理不同类型的地址。在使用时,通常会将 struct sockaddr 指针转换为特定类型的结构体指针,以便访问其中的具体信息。

htons

htons 是一个网络字节顺序和主机字节顺序之间进行转换的函数,用于将 16 位无符号整数从主机字节顺序转换为网络字节顺序。

在网络编程中,数据在传输过程中需要统一使用网络字节顺序(大端序),以确保不同主机之间能够正确解释数据。而在主机上,通常使用主机字节顺序(可能是大端序或小端序)。

函数原型如下:

#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
参数 hostshort 是一个 16 位无符号整数,表示主机字节顺序的端口号或其他数据。
htons 函数将 hostshort 中的值从主机字节顺序转换为网络字节顺序,并返回转换后的值。
如果主机字节顺序和网络字节顺序相同,htons 函数只是简单地返回 hostshort 的值。

inet_addr

在Linux中,inet_addr函数用于将点分十进制的IPv4地址转换为网络字节序的32位整数。这个函数在C语言的<arpa/inet.h>头文件中声明。

函数原型如下:

#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
其中参数cp是一个指向以空字符结尾的字符串,表示点分十进制表示的IPv4地址。
函数返回一个in_addr_t类型的值,即32位无符号整数,如果转换成功则返回相应的网络字节序整数,
如果转换失败则返回INADDR_NONE,其值通常为-1。

recvfrom

在Linux中,recvfrom函数用于从已连接或未连接的套接字接收数据。它可以用于接收来自网络的数据,也可以用于从其他进程通过UNIX域套接字传输的数据。

函数原型如下:

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
参数说明:
* sockfd:套接字描述符,用于指定要接收数据的套接字。
* buf:接收数据的缓冲区。
* len:缓冲区的长度,即可接收的最大字节数。
* flags:指定接收操作的可选标志。常见的标志有:* MSG_DONTWAIT:非阻塞模式,即使没有数据可接收也立即返回。* MSG_WAITALL:阻塞模式,等待直到接收到指定长度的数据。
* src_addr:如果不为 NULL,则用于存储发送方的地址信息。
* addrlen:指向存储src_addr结构体长度的变量的指针。
函数返回值:
* 成功时返回接收到的字节数,失败时返回-1,并设置errno来指示错误的原因。

recvfrom函数通常用于在UDP套接字上接收数据,因为UDP是无连接的协议,每个数据报都包含发送方的地址信息。在TCP套接字上,通常使用recv函数来接收数据,因为TCP是面向连接的协议,数据已经通过connect函数建立了连接,因此不需要再提供地址信息。

sendto

在Linux系统中,sendto函数用于通过指定的socket发送数据。

它的原型如下:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数说明:
sockfd:socket描述符。
buf:指向数据的指针。
len:要发送的数据长度。
flags:操作标志,例如MSG_CONFIRM确认消息已发送。
dest_addr:指向目的地址的 sockaddr 结构体的指针。
addrlen:dest_addr 结构体的长度。
返回值:成功返回发送的数据长度,失败返回-1。

使用sendto函数发送数据时,需要指定目的地址和端口。以下是一个简单的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0) {perror("socket");exit(EXIT_FAILURE);}struct sockaddr_in dest_addr;dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(12345);inet_pton(AF_INET, "127.0.0.1", &dest_addr.sin_addr);char *data = "Hello, world!";ssize_t sent = sendto(sock, data, strlen(data), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));if (sent < 0) {perror("sendto");close(sock);exit(EXIT_FAILURE);}printf("Sent %ld bytes to %s:%d\n", (long)sent, inet_ntoa(dest_addr.sin_addr), ntohs(dest_addr.sin_port));close(sock);return 0;
}

这个示例创建了一个UDP socket,然后向本地地址127.0.0.1的端口12345发送了一条消息。

return和exit的区别

return 和 exit 在 C/C++ 中的主要区别如下:

1. 调用位置不同:

return 语句通常用于函数中,用于返回一个值给调用者,并退出当前函数

exit 函数可以用于在任何地方调用,用于立即终止程序的执行,并可以传递一个退出状态码给操作系统。

2. 返回值不同:

return 语句可以返回一个值给调用者,这个值通常是函数计算的结果。

exit 函数不能返回值给调用者,但是可以传递一个退出状态码给操作系统。这个状态码可以被其他程序(如 shell 脚本)用来判断程序的执行结果。

3. 退出方式不同:

return 语句退出当前函数,但程序仍然继续执行后续的代码。

exit 函数立即终止程序的执行,不再执行后续的代码。

4. 应用场景不同:

return 语句通常用于正常的函数返回,或者在某些条件满足时提前退出函数。

exit 函数通常用于在程序遇到错误、异常或其他特殊情况时,立即终止程序的执行。

客户端也需要绑定套接字空间,但是,不需要显示的绑定,client会在首次发送数据的时候自动绑定服务器的端口号,一定众所周知的,不可以随意改变,client需要port,客户端需要绑定随机端口因为客户端非常多,所以客户端需要绑定随机端口

127.0.0.1

本地环回,通常用来测试网络cs的测试

127.0.0.1是一个特殊的IP地址,通常被称为"本地回环地址"或"环回地址"。它是IPv4地址空间中的一部分,用于在本地设备上测试网络功能和通信。当计算机发送数据到127.0.0.1时,数据包实际上并不会离开计算机,而是被送往本地网络接口,然后被送回给发送者。这样就实现了在同一台计算机上进行网络通信的效果,而无需连接到外部网络。

在大多数情况下,当应用程序需要与自己的同一台计算机上的另一个应用程序进行通信时,可以使用127.0.0.1地址。例如,当你在本地计算机上运行一个Web服务器时,可以使用127.0.0.1作为服务器地址来访问该服务器,而不必连接到外部网络。

netstat

netstat 是一个用于显示网络状态信息的命令行工具,可以用于查看网络连接、路由表、接口统计等。在Linux系统中,它是一个非常常用的网络调试工具。

以下是 netstat 命令的常见用法和选项:

* netstat -a:显示所有连接和监听中的套接字。
* netstat -t:显示TCP连接。
* netstat -u:显示UDP连接。
* netstat -n:以数字形式显示地址和端口号。
* netstat -p:显示正在使用的协议。
* netstat -l:显示监听中的套接字。
* netstat -r:显示路由表。
* netstat -s:显示网络统计信息。
* netstat -i:显示网络接口信息。

client bind是在首次发送数据的时候,进行有内核随机bind(而不·需要我们手动绑定)

如果服务器绑定的ip是127.0.0.1就只能进行本地通信

云服务器公网ip其实是供应商给你虚拟出来的公网ip,无法进行直接bind

我们强烈不推荐给服务器bind固定ip,更推荐本地任意ip

因为,bind指定的ip只能够接受和发送该ip的报文

不推荐:local.sin_addr.s_addr = inet_addr(_ip.c_str()); //指定ip,需要传递整形的ip
推荐:local.sin_addr.s_addr = INADDR_ANY; //指定ip,INADDR_ANY表示本机的任意一个ip地址

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

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

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

相关文章

Linux--正则表达式详解

1.1概念 在进行程序设计的过程中&#xff0c;用户会不可避免地遇到处理某些文本的情况。有的时候&#xff0c;用户还需要查找符合某些比较复杂规则的字符串。对于这些情况&#xff0c;如果单纯依靠程序设计语言本身&#xff0c;则往往会使得用户通过复杂的代码来实现。但是&…

[7] CUDA之常量内存与纹理内存

CUDA之常量内存与纹理内存 1. 常量内存 NVIDIA GPU卡从逻辑上对用户提供了 64KB 的常量内存空间&#xff0c;可以用来存储内核执行期间所需要的恒定数据常量内存对一些特定情况下的小数据量的访问具有相比全局内存的额外优势&#xff0c;使用常量内存也一定程序上减少了对全局…

Spring Cloud 面试题(五)

1. Eureka的自我保护模式是什么&#xff1f; Eureka的自我保护模式是一种应对网络异常的安全保护措施&#xff0c;旨在防止因网络分区或其他异常情况导致服务实例被错误地注销。当Eureka Server在短时间内丢失过多的客户端心跳时&#xff0c;会触发自我保护机制。以下是自我保…

行为型模式 (Python版)

模板方法模式 """案例&#xff1a;写简历内容&#xff1a;最近有个招聘会&#xff0c;可以带上简历去应聘了。但是&#xff0c;其中有一家公司不接受简历&#xff0c;而是给应聘者发了两张公司自己定制的简历表&#xff0c;分别是A类型的简历表和B类型的简历表…

汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的?

标签: 汽车液态电池充电时的化学反应; 电池充电过程;锂电池,石墨负极 问题:汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的? 汽车液态电池充电时的化学反应 汽车液态电池(如锂离子电池)在充电时,通过电化学反应将电能转化为化学能并储存在电…

C++ 时间处理-统计函数运行时间

1. 关键词2. 问题3. 解决思路4. 代码实现 4.1. timecount.h4.2. timecount.cpp 5. 测试代码6. 运行结果7. 源码地址 1. 关键词 C 时间处理 统计函数运行时间 跨平台 2. 问题 C如何简单便捷地实现“函数运行时间的统计”功能&#xff1f; 3. 解决思路 类的构造函数&#x…

使用python对指定文件夹下的pdf文件进行合并

使用python对指定文件夹下的pdf文件进行合并 介绍效果代码 介绍 对指定文件夹下的所有pdf文件进行合并成一个pdf文件。 效果 要合并的pdf文件&#xff0c;共计16个1页的pdf文件。 合并成功的pdf文件&#xff1a;一个16页的pdf文件。 代码 import os from PyPDF2 import …

深入理解 Spring Web 应用程序初始化流程

前言 在构建基于 Spring 的 Web 应用程序时&#xff0c;了解初始化流程是至关重要的。本文将详细介绍 Servlet 容器的初始化过程&#xff0c;并重点探讨 Spring 框架在其中的作用&#xff0c;特别是 ServletContainerInitializer、SpringServletContainerInitializer 和 WebAp…

源码部署ELK

目录 资源列表 基础环境 关闭防护墙 关闭内核安全机制 修改主机名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 单节点 集群(3台节点集群为例) 启动 二、部署logstash 部署logstash 添加配置文件 启动 三、部署kiban…

数据清洗操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …

问题排查复盘

5月份中旬一天晚上&#xff0c;业务需求上线后反馈&#xff0c;该业务对应的搜索功能有问题&#xff0c;晚上10点多开始排查&#xff0c;到凌晨2点&#xff0c;最后大致定位了问题&#xff0c;并行修改后恢复&#xff0c;虽然问题不是很大&#xff0c;但是当时上线的业务对业绩…

抖音a-bogus加密解析(三)

要补的环境我给提示&#xff0c;大家自行操作&#xff0c;出了问题就是因为缺环境&#xff0c;没补好 window global; // reading _u未定义 window.requestAnimationFrame function () {} // XMLHttpRequest 未定义 window.XMLHttpRequest function () {} window.onwheelx …

Vue3实战笔记(45)—VUE3封装一些echarts常用的组件,附源码

文章目录 前言一、柱状图框选二、折线图堆叠总结 前言 日前使用hooks的方式封装组件&#xff0c;在我使用复杂的图标时候遇到了些问题&#xff0c;预想在onMounted中初始化echarts&#xff0c;在使用hooks的时候&#xff0c;组件没有渲染完&#xff0c;使用实例会出现各种各样…

Qt Creator(1)【概述篇】

阅读导航 引言一、Qt概述1. 什么是Qt2. Qt的发展史3. Qt支持的平台4. Qt的优点5. Qt的应用场景 二、Qt下载安装 引言 在探索编程和软件开发的旅程中&#xff0c;我们已经奠定了坚实的基础&#xff0c;通过学习C语言和C&#xff0c;我们不仅掌握了结构化编程和面向对象编程的核…

HIVE3.1.3+ZK+Kerberos+Ranger2.4.0高可用集群部署

目录 一、集群规划 二、介质下载 三、基础环境准备 1、解压文件 2、配置环境变量 四、配置zookeeper 1、创建主体 2、修改zoo.cfg 3、新增jaas.conf 4、新增java.env 5、重启ZK 6、验证ZK 五、配置元数据库 六、安装HIVE 1、创建Hiver的kerberso主体 2…

网站笔记:huggingface model memory calculator

Model Memory Utility - a Hugging Face Space by hf-accelerate 这个工具可以计算在 Hugging Face Hub上托管的大型模型训练和执行推理时所需的vRAM内存量。模型所需的最低推荐vRAM内存量表示为“最大层”的大小&#xff0c;模型的训练大约是其大小的4倍&#xff08;针对Adam…

LeetCode 第399场周赛个人题解

100323. 优质数对的总数 I 原题链接 100323. 优质数对的总数 I 思路分析 签到题 AC代码 class Solution:def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:n, m len(nums1), len(nums2)ret 0for i in range(n):for j in range(m):if nu…

关于构建生成式AI产品的思考

在过去的六个月里&#xff0c;我们 LinkedIn 的团队一直在努力开发一种新的人工智能体验。我们希望重新构想我们的会员如何进行求职和浏览专业内容。 生成式人工智能的爆炸式增长让我们停下来思考一年前不可能实现的事情。我们尝试了许多想法&#xff0c;但都没有真正实现&…

1.2 程序员职业发展

目录 1 程序员职业发展方向 2 计算机研究生为何青睐AI赛道 1 程序员职业发展方向 2 计算机研究生为何青睐AI赛道 计算机类研究生&#xff0c;大部分以人工智能作为主赛道&#xff0c;原因如下&#xff1a; 广阔的就业前景&#xff1a;人工智能是当今科技发展的前沿领域&…