当前位置: 首页 > news >正文

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一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (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(“…...

力扣 跳跃游戏

每次更新目标位置时&#xff0c;实际上是在做一个局部的最优选择&#xff0c;选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时&#xff0c;都是基于当前能跳跃到的最远位置&#xff0c;因此最终的结果是全局最优的。 题目 从前往后遍历&#xff0c;更新可以到…...

使用npm 插件[mmdc]将.mmd时序图转换为图片

使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc &#xff08;Mermaid CLI&#xff09;这个工具来将 .mmd 时序图&#xff08;Mermaid语法描述的时序图&#xff09;转换为图片&#xff0c;以下是使用步骤&#xff1a; 1. 安装 mmdc 确保…...

ffmpeg 常用命令

更详细请参考ffmpeg手册&#xff0c;下载ffmpegrelease版后在doc中就有&#xff0c;主页面。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函数&#xff08;从新手角度逐步升级改进&#xff09;1. 基础版本&#xff08;利用循环计数&#xff09;2. 改进版本&#xff08;利用指针相减&#xff09;3. 递归版本&#xff08;利用递归思…...

npm install --global windows-build-tools --save 失败

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

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)

学习了十种常见的排序方法&#xff0c;此文章针对所学的排序方法进行整理&#xff08;通过C语言完成排序&#xff09;。 参考内容&#xff1a; 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是一种革命性的 全双工通信协议 &#xff0c;构建在TCP之上&#xff0c;旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接&#xff0c;WebSocket实现了真正的双向实时通信&#xff0c;显著提高了交互效率。这一特性…...

ComfyUI节点安装笔记

AI高速发展&#xff0c;版本更新相当快&#xff08;11月25日才安装的版本v.0.3.4&#xff0c;27日版本就已经更新到v.0.3.5了&#xff09;&#xff0c;在遇到问题&#xff0c;找到问题原因所在的过程中&#xff0c;ComfyUI版本、python版本、节点对环境版本的依赖&#xff0c;本…...

深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题

在训练过程中&#xff0c;训练集的准确率稳步上升&#xff0c;但是验证集的准确率一直在40%左右徘徊&#xff0c;从网上搜索可能的原因有&#xff1a; 1、学习率太小&#xff0c;陷入局部最优。 2、数据量太小&#xff08;4000多条数据&#xff0c;应该还可以吧&#xff09; …...

【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写程序实现&#xff1a;从键盘上输入一个年月日&#xff08;以空格或回车…...

Lumos学习王佩丰Excel二十四讲系列完结

“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程&#xff0c;涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇&#xff01;&#xff01;&#xff01; 一、课程概览 该教程共分为24讲&#xff0c;每一讲都围绕Excel的一个核心主题进行深入讲解…...

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...

【数据可视化】数据可视化看板需求梳理模板(含示例)

一、模板 设计一个数据可视化看板需要从多个方面梳理需求&#xff0c;以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面&#xff1a; 1.目标和受众 ● 明确目标&#xff1a;确定看板的主要目的&#xff0c;例如监控业务指标、分析市场趋势、展示项目进度等…...

CArray原理是什么,通过示例来展示如何使用?

CArray是MFC&#xff08;Microsoft Foundation Class&#xff09;库中的一个模板类&#xff0c;用于实现动态数组的功能。它类似于C语言中的数组&#xff0c;但具有自动增长和缩小的能力&#xff0c;从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...

更换WordPress主题的基础知识及注意事项

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

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…...

基于单片机的直流稳压电源的设计(论文+源码)

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

RePKG终极指南:Wallpaper Engine资源解包与纹理转换完整方案

RePKG终极指南&#xff1a;Wallpaper Engine资源解包与纹理转换完整方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经面对Wallpaper Engine的PKG文件束手无策&#xf…...

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组岳

指令替换 项目需求&#xff1a;将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一&#xff0c;测试代码示例 test.c // test.c #includ…...

语言的边界,与软件的命运厍

1. 引入 在现代 AI 工程中&#xff0c;Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的&#xff0c;官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为&#xff0c;最好的办法…...

tinyCore:轻量级多核任务分发框架

1. tinyCore 库概述&#xff1a;面向多核嵌入式系统的轻量级任务分发框架tinyCore 是一个专为资源受限型多核微控制器设计的轻量级运行时抽象库&#xff0c;其核心目标并非实现完整的实时操作系统&#xff08;RTOS&#xff09;功能&#xff0c;而是提供一种语义清晰、配置极简、…...

RTC-8564实时时钟芯片驱动开发与低功耗设计实践

1. RTC-8564 实时时钟芯片深度技术解析与嵌入式驱动开发实践RTC-8564 是 Philips&#xff08;现 NXP&#xff09;推出的一款低功耗、IC 接口实时时钟芯片&#xff0c;广泛应用于工业控制、智能电表、医疗设备、POS 终端及各类需要高精度时间保持能力的嵌入式系统中。该芯片采用…...

Golang 任务调度与优先级队列实战:从能跑到生产可用

Golang 任务调度与优先级队列实战:从能跑到生产可用 关键词:Golang、任务调度、优先级队列、Worker Pool、延迟任务、重试退避、优先级老化、高并发、可观测性、分布式演进 很多团队第一次做“任务调度系统”时,往往只做到了“能把任务跑起来”。上线后才发现,真正难的不是…...

微信H5分享功能实战:从配置到卡片式分享的完整指南

1. 微信H5分享功能的核心原理 微信H5页面分享功能和小程序分享最大的区别在于触发方式。H5页面无法像小程序那样直接调用onShareAppMessage方法&#xff0c;而是需要用户主动点击右上角的菜单按钮才能触发分享。这个设计差异导致很多开发者第一次接触H5分享时会感到困惑。 微信…...

COCO数据集常见问题解答:下载慢?解压失败?目录结构不对?

COCO数据集实战避坑指南&#xff1a;从下载到配置的全流程解决方案 当你第一次接触COCO数据集时&#xff0c;可能会被它庞大的规模和复杂的目录结构吓到。作为计算机视觉领域最常用的基准数据集之一&#xff0c;COCO确实为模型训练和评估提供了丰富的资源&#xff0c;但在实际使…...

QNX系统资源监控实战:高效查看CPU与内存使用情况

1. QNX系统资源监控入门指南 在嵌入式开发领域&#xff0c;QNX作为一款实时操作系统(RTOS)被广泛应用于汽车电子、工业控制等对系统稳定性要求极高的场景。记得我第一次接触QNX系统时&#xff0c;面对黑漆漆的命令行界面&#xff0c;完全不知道如何查看系统资源使用情况。后来…...

SD卡接口PCB设计实战:从引脚定义到高速信号完整性布局布线

1. SD卡接口基础&#xff1a;从物理结构到引脚定义 第一次接触SD卡接口设计时&#xff0c;我对着那排密密麻麻的引脚直发懵。后来才发现&#xff0c;理解SD卡物理结构是PCB设计的第一步。常见的SD卡有标准SD、microSD&#xff08;TF卡&#xff09;和miniSD三种规格&#xff0c;…...