Linux C/C++编程-获得套接字地址、主机名称和主机信息
【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客
《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
LinuxC\C++编程技术_夏天又到了的博客-CSDN博客
13.4.11 获得套接字地址
一个套接字绑定了地址,就可以通过函数来获取它的套接字地址了。套接字通信需要本地和远程两端建立套接字,这样获取套接字地址可以分为获取本地套接字地址和获取远程套接字地址。其中,获取本地套接字地址的函数是getsockname,这个函数在下面两种情况下可以获得本地套接字地址。
(1)本地套接字通过bind函数绑定了地址。
(2)本地套接字没有绑定地址,但通过connect函数和远程建立了连接,此时内核会分配一个地址给本地套接字。
getsockname函数声明如下:
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
其中,参数sockfd是套接字描述符;addr指向存放套接字地址的结构体指针;addrlen是结构体sockaddr的大小。
【例13.2】绑定后获取本地套接字地址
(1)打开Visual Studio Code,新建文本文件,输入代码如下:
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include "unistd.h"
#include "errno.h"
#include <arpa/inet.h> // for inet_ntoaint main()
{int sfp, nfp;struct sockaddr_in s_add, c_add;socklen_t sin_size;unsigned short portnum = 10051;struct sockaddr_in serv; socklen_t serv_len = sizeof(serv); sfp = socket(AF_INET, SOCK_STREAM, 0);if (-1 == sfp){printf("socket fail ! \r\n");return -1;}printf("socket ok !\r\n");printf("ip=%s,port=%d\r\n", inet_ntoa(serv.sin_addr), ntohs(serv.sin_port)); // 马上获取 int on = 1;setsockopt(sfp, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));// 允许地址的立即重用bzero(&s_add, sizeof(struct sockaddr_in));s_add.sin_family = AF_INET;s_add.sin_addr.s_addr = inet_addr("192.168.0.2"); // 这个IP地址必须是本机上有的s_add.sin_port = htons(portnum);// 绑定if (-1 == bind(sfp, (struct sockaddr *)(&s_add), sizeof(struct sockaddr))) {printf("bind fail:%d!\r\n", errno);return -1;}printf("bind ok !\r\n");getsockname(sfp, (struct sockaddr *)&serv,&serv_len);// 获取本地套接字地址// 打印套接字地址里的IP地址和端口号printf("ip=%s,port=%d\r\n", inet_ntoa(serv.sin_addr), ntohs(serv.sin_port));
return 0;
}
在代码中,我们首先创建套接字,马上获取它的地址信息,然后绑定IP地址和端口号,再去获取套接字地址。运行时可以看到没有绑定前获取到的都是0,绑定后就可以正确获取到了。
(2)保存代码为test.cpp,上传到Linux,编译并运行:
# cd /zww/test
# g++ test.cpp -o test
# ./test
socket ok !
ip=0.0.0.0,port=0
bind ok !
ip=192.168.0.2,port=10051
需要注意的是,192.168.0.2必须是本机上存在的IP地址,如果随便设一个并不存在的IP地址,程序就会返回错误。设置一个并不存在的IP地址后编译运行,应该会出现下面的结果:
# g++ test.cpp -o test
# ./test
socket ok !
ip=0.0.0.0,port=0
bind fail:99!
要获取远程套接字地址,可以使用getpeername函数。getpeername只有在连接建立以后才被调用,否则不能正确获得对方的地址和端口,因此它的参数描述字一般是已连接描述字而非监听套接口描述字。getpeername函数声明如下:
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
其中,参数sockfd是已连接的套接字描述符;addr指向存放套接字地址的结构体指针;addrlen是结构体sockaddr的大小。
13.4.12 获得主机名称和主机信息
gethostname函数是Linux中的一个系统调用,用于获取当前主机的名称。函数声明如下:
#include <unistd.h>
int gethostname(char *name, size_t len);
其中,name用于存储获取到的主机名,len是主机名的更大长度。下面看一个实例,返回本地主机的标准名称。
【例13.3】绑定后获取本地套接字地址
(1)打开Visual Studio Code,新建文本文件,输入代码如下:
#include <stdio.h>
#include <unistd.h>int main()
{char hostname[30]="";int flag = 0;flag = gethostname(hostname, sizeof(hostname));if (flag < 0){perror("gethostname error");return -1 ;}printf("hostname = %s\n", hostname);return 0 ;
}
(2)保存代码为test.cpp,上传到Linux,编译并运行:
# gcc test.cpp -o test
# ./test
hostname = mypc
为了验证是否正确,我们可以用命令uname -n来测试一下,该命令用于显示主机名:
# uname -n
mypc
可见结果正确。
在网络编程中,可能出现这样的情况:我们只知道某个服务器的主机名或域名,但不知道其具体的IP地址是什么。例如,知道百度的网址是www.baidu.com,但不知道其IP地址具体是什么。而gethostbyname可以让我们知道某个网址对应的IP地址。gethostbyname函数是Linux系统中用于获取主机名对应IP地址的函数之一,它通过主机名或域名获取网络信息,包括IP地址。该函数声明如下:
#include <netinet/in.h>
struct hostent *gethostbyname(const char *name);
参数name表示域名或主机名。若函数执行成功,则返回hostent指针,否则返回NULL,失败原因存于h_error中(注意错误原因不存于error中)。
hostent结构具体定义如下:
struct hostent {char *h_name; /*正式的主机名称*/char **h_aliases; /*该主机的其他别名*/int h_addrtype; /*地址类型,通常是AF_INET*/int h_length; /*地址的长度*/char **h_addr_list; /*该主机的所有地址*/
};
该函数首先在/etc/hosts文件中查找是否有匹配的主机名,如果没有,则到域名解析配置文件中去查找。下面我们看一个实例,通过网站域名得到网站主机的名称和IP地址。
【例13.4】获取腾讯服务器的主机名和IP地址
(1)打开Visual Studio Code,新建文本文件,输入代码如下:
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc, char *argv [])
{struct hostent *h;const char *s = "www.qq.com"; // 定义域名字符串if ((h = gethostbyname(s)) == NULL) { /* get the host info */herror("gethostbyname");return -1;}printf("Host name : %s\n", h->h_name); // 输出主机名称//输出IP地址printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));return 0;
}
在上述代码中,我们首先定义网站域名字符串,然后通过gethostbyname函数得到网站主机的信息,最后输出主机的名称和IP地址。其中,函数inet_ntoa的功能是将IP地址转换成用“.”间隔的字符串形式。
(2)保存代码为test.cpp,上传到Linux,编译并运行:
# gcc test.cpp -o test
# ./test
Host name : ins-r23tsuuf.ias.tencent-cloud.net
IP Address : 101.91.22.57
相关文章:

Linux C/C++编程-获得套接字地址、主机名称和主机信息
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…...
USB kbtab linux 驱动代码
#include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> #include <asm/unaligned.h> /* Pressure-threshold modules param code from */MODULE_AUTHOR(“xxx”); MODULE_DESCRIPTION(“…...

力扣 跳跃游戏
每次更新目标位置时,实际上是在做一个局部的最优选择,选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时,都是基于当前能跳跃到的最远位置,因此最终的结果是全局最优的。 题目 从前往后遍历,更新可以到…...
使用npm 插件[mmdc]将.mmd时序图转换为图片
使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc (Mermaid CLI)这个工具来将 .mmd 时序图(Mermaid语法描述的时序图)转换为图片,以下是使用步骤: 1. 安装 mmdc 确保…...

ffmpeg 常用命令
更详细请参考ffmpeg手册,下载ffmpegrelease版后在doc中就有,主页面。video filter 参考ffmpeg-filters.html -version -formats -demuxers -protocols -muxers -filters -devices —pix_fmts -codecs -sample_fmts -decoders -layouts -encoders -colors…...
从入门到实战:C 语言 strlen 函数通关指南
文章目录 一、strlen函数简介1. 函数构成2. 参数说明3. 使用示例 二、模拟实现strlen函数(从新手角度逐步升级改进)1. 基础版本(利用循环计数)2. 改进版本(利用指针相减)3. 递归版本(利用递归思…...

npm install --global windows-build-tools --save 失败
注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …...

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。 参考内容: https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…...

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...

实现websocket心跳检测,断线重连机制
WebSocket基础 WebSocket概念 WebSocket是一种革命性的 全双工通信协议 ,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性…...

ComfyUI节点安装笔记
AI高速发展,版本更新相当快(11月25日才安装的版本v.0.3.4,27日版本就已经更新到v.0.3.5了),在遇到问题,找到问题原因所在的过程中,ComfyUI版本、python版本、节点对环境版本的依赖,本…...
深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题
在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …...

【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写程序实现:从键盘上输入一个年月日(以空格或回车…...
Lumos学习王佩丰Excel二十四讲系列完结
“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程,涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇!!! 一、课程概览 该教程共分为24讲,每一讲都围绕Excel的一个核心主题进行深入讲解…...

前后端规约
文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...
【数据可视化】数据可视化看板需求梳理模板(含示例)
一、模板 设计一个数据可视化看板需要从多个方面梳理需求,以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面: 1.目标和受众 ● 明确目标:确定看板的主要目的,例如监控业务指标、分析市场趋势、展示项目进度等…...
CArray原理是什么,通过示例来展示如何使用?
CArray是MFC(Microsoft Foundation Class)库中的一个模板类,用于实现动态数组的功能。它类似于C语言中的数组,但具有自动增长和缩小的能力,从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...

更换WordPress主题的基础知识及注意事项
更换WordPress主题是优化和升级网站的重要步骤,不仅能够增强网站的视觉效果,还能改进用户体验并提高网站性能。然而,在进行该操作时,必须格外谨慎,避免数据丢失或功能失调的风险。本文将介绍在更换主题前需要采取的基本…...

springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…...

基于单片机的直流稳压电源的设计(论文+源码)
1.系统方案设计 在本次直流稳压电源的设计中,其关键指标如下: 系统输入电压220V交流系统输出直流0到12V可调,步进可以达到0.1V电流最大输出可以到2A具有短路保护功能可以通过液晶或者数码管等显示设备显示当前输出电压 2. 电路图...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...