【Linux C | 网络编程】getsockname 和 getpeername函数详解及C语言例子
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍getsockname 和 getpeername函数详解及C语言例子 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- 🎄二、getsockname 函数
- ✨2.1 getsockname 函数介绍
- ✨2.2 getsockname 函数例子
- 🎄三、getpeername 函数
- ✨3.1 getpeername 函数介绍
- ✨3.2 getpeername 函数例子
- 🎄四、总结
🎄一、概述
在网络编程中,套接字句柄fd是很常见的,但有时我们又想要知道该套接字的IP地址和端口号是什么?这时就可以用到本文即将介绍的两个函数,getsockname 和 getpeername:
- getsockname:可以通过套接字解析出其关联的本端的IP地址、端口、协议;
- getpeername:可以通过套接字解析出其关联的远端的IP地址、端口、协议;
🎄二、getsockname 函数
✨2.1 getsockname 函数介绍
getsockname 函数原型:
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
getsockname 函数在addr指向的缓冲区中返回套接字sockfd绑定到的当前地址。
参数:
- sockfd:传入参数,要获取IP地址、端口信息的套接字sockfd;
- addr:传出参数,用来存放获取结果的内存地址;
- addrlen:传入传出参数,调用是指明第二个参数 addr 指向内存的大小。返回时,它包含套接字地址的实际大小。
返回值:成功返回0,出错返回 -1。
使用场景:
1、在TCP客户端调用 connect 成功返回后,可以获取内核赋予该连接的本地IP和端口号;
2、在以端口号0调用bind(告知内核去选择本地端口号)后,getsockname用于返回由内核赋予的本地端口号。
3、getsockname可用于获取某个套接字的地址族。
4、在一个以通配IP地址调用bind的TCP服务器上,与某个客户的连接一旦建立(accept成功返回),getsockname就可以用于返回由内核赋予该连接的本地IP地址。
✨2.2 getsockname 函数例子
这是一个TCP客户端,需要连接到本地端口为10086的服务端才可以使用,如果没有服务端的话,可以使用下一小节的getsockname 函数例子做服务端。可以参考第4小节。
// getsockname_sample.c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{// 1、创建TCP套接字socketint sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd<0)perror("socket error" );// 2、准备服务端ip和端口struct sockaddr_in servaddr;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons (10086);if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) // 设置本机IP为服务端IPperror("inet_pton error");// 3、连接 connectif (connect(sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){perror("connect error" );close(sockfd);return -1;}// connect成功返回后,获取该连接本地套接字IP、端口struct sockaddr_in addr;int addrLen = sizeof(addr);if(0 == getsockname(sockfd, (struct sockaddr*)&addr, &addrLen) )printf("getsockname: ip=[%s], port=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));// 阻塞等待,可以查看连接信息,使用命令`netstat -at | greep 10086`while(1)sleep(1); // 5、关闭close(sockfd);return 0;
}
🎄三、getpeername 函数
✨3.1 getpeername 函数介绍
getpeername 函数原型:
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
getpeername 函数在addr指向的缓冲区中返回连接到套接字sockfd的对端地址。addrlen参数应该初始化,以指示addr指向的空间量。返回时,它包含返回的名称的实际大小(以字节为单位)。如果提供的缓冲区太小,则名称会被截断。
参数:
- sockfd:传入参数,要获取IP地址、端口信息的套接字sockfd;
- addr:传出参数,用来存放获取结果的内存地址;
- addrlen:传入传出参数,调用是指明第二个参数 addr 指向内存的大小。返回时,它包含套接字地址的实际大小。
返回值:成功返回0,出错返回 -1。
使用场景:
1、tcp服务端通过accept返回的套接字,通过 getpeername 可以获取到客户端的IP地址、端口;
2、其他需要获取对端IP地址或端口的情况。
✨3.2 getpeername 函数例子
这是一个TCP服务端,结合上一小节的客户端一起使用,可以参考第4小节。
// getpeername_sample.c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main()
{// 1、创建TCP套接字socketint sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd<0){perror("socket error" );return -1;}// 2、准备服务端ip和端口struct sockaddr_in servaddr;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons (10086);servaddr.sin_addr.s_addr = INADDR_ANY; // 指定ip地址为 INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在任一网络接口上接受客户端的连接// 3、绑定 bindif (bind(sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){perror("bind error" );return -1;}// 4、监听 listenif(listen(sockfd, 10) != 0){perror("listen error");return -1;}printf("TcpSer sockfd=%d, start listening\n",sockfd);char recvline[256];while(1){// 5、获取客户端连接int connfd = accept(sockfd, NULL, NULL);if(connfd < 0){perror("accept error" );return -1;}// 获取 connfd 套接字对端(客户端)的IP地址、端口struct sockaddr_in addr;int addrLen = sizeof(addr);if(0 == getpeername(connfd, (struct sockaddr*)&addr, &addrLen) )printf("getpeername: ip=[%s], port=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));// 获取 connfd 套接字本端(服务端)的IP地址、端口if(0 == getsockname(connfd, (struct sockaddr*)&addr, &addrLen) )printf("getsockname: ip=[%s], port=%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));// 6、与客户端交换数据,客户端每发数据,会阻塞,此时可以查看连接信息,使用命令`netstat -at | greep 10086`int n = read(connfd, recvline, sizeof(recvline));if(n>0){recvline[n] = 0 ;/*null terminate */printf("recv connfd=%d [%s]\n",connfd,recvline);write(connfd, "Hello,I am tcp server", strlen("Hello,I am tcp server"));}printf("close connfd=%d\n",connfd);close(connfd);}// 7、关闭close(sockfd);return 0;
}
🎄四、总结
👉本文介绍Linux网络编程中,通过套接字获取IP地址、端口号的两个函数getsockname 和 getpeername,并给出C语言例子加深理解。
上面例子的使用:
编译客户端:gcc getsockname_sample.c -o cli
编译服务端:gcc getpeername_sample.c -o ser
先运行服务端./ser
,在另一命令行窗口运行./cli
,下面是运行结果:
客户端打印的IP地址和端口号:
服务端打印的IP地址和端口号:
运行 netstat -at | grep 10086
查看tcp连接状态如下:
对netstat命令不了解的,可以看文章 netstat 工具详解 | 查看网络连接、查看路由表、查看统计数据
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
相关文章:

【Linux C | 网络编程】getsockname 和 getpeername函数详解及C语言例子
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug
文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记,Matlab/Simulink避坑指南(一)——Data Store Memory模块执行时序Bug》 见《研发日记,Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》…...

(M)unity受伤反弹以及死亡动画
受伤反弹 1.在人物控制脚本中添加受伤后速度将为0,并添加一个反弹的力 在刷新移动时,需要在没有受伤的状态 public bool isHurt; public float hurtForce; private void FixedUpdate() {if(!isHurt)Move(); }public void GetHurt(Transform attacker) …...

【Java】Springboot入门
学习目标 基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot的完成SSM整合项目开发 一、SpringBoot简介 1. 入门案例 问题导入 SpringMVC的HelloWord程序大家还记得吗? SpringBoot是由Pivotal团队提供的全新框架&…...

专业138总分420+中国科学技术大学843信号与系统考研经验中科大电子信息通信
**今年中科大专业课843信号与系统138分,总分420顺利上岸,梦圆中科大,也是报了高考失利的遗憾,总结一下自己的复习经历,希望可以给大家提供参考。**首先,中科大843包括信号与系统,和数字信号处理…...

携程开源 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX
携程开源 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX 官网文档 基于真实请求与数据的流量回放测试平台、自动化接口测试平台AREX 目前已跑通,通过冒烟测试,这篇文章稍稍水一下,主要讲下部署过程里踩的坑,因为…...
Android中C++层fstream用法详解
fstream用于读写文件内容 ifstream用于读文件内容 ofstream用于写内容到文件 读本文章前,请读一下C 文件和流 | 菜鸟教程 目录 1. 打开文件open 2. 返回当前指针位置tellg, tellp 3. 设置文件读位置指针seekg 4. 设置文件写位置指针seekp 5. 如何在文件…...

git clone常见问题一览及解决方法
在使用Ubuntu下,终端运行git clone命令时会遇见许多问题,本文主要针对一些常见的问题进行整理。关于换源问题,推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述,ubuntu下个人使用发现体验良好&am…...

ArcGIS Pro 如何批量删除字段
在某些时候,我们得到的图层属性表内可能会有很多不需要的字段,如果挨个去删除会十分的麻烦,对于这种情况,我们可以使用工具箱内的字段删除工具批量删除,这里为大家介绍一下使用方法,希望能对你有所帮助。 …...

OG Trade在ZKX揭幕:一家基于Starknet的游戏化永续合约交易所
ZKX的 OG Trade通过内置游戏化和30分钟交易竞赛,为所有交易者创造机会,革新了永续合约交易模式。 2024年1月30日 — ZKX宣布推出OG Trade,这是一家基于Starknet的游戏化永续合约交易所,旨在满足短期交易者、高水平交易者和波段交易…...
ubuntu 22.04 安装redis并设置远程连接
ubuntu 22.04 安装redis并设置远程连接 1、基础安装 更新包: sudo apt update安装redis: sudo apt install redis-server安装完毕后会自动启动,查看状态: sudo systemctl status redis-server注意:如果你的服务器上仅用…...

MemcachedRedis构建缓存服务器
目录 Memcached&Redis构建缓存服务器 一、介绍 二、memcached 1、特点 2、服务框架 3.配置安装memcached 三、redis服务 1、介绍 2、特点 3、缓存 4、安装redis 5、数据持久化 6、redis主从配置 Memcached&Redis构建缓存服务器 一、介绍 许多Web应用都将…...

Python编辑开发 --- pycharm pro 中文
PyCharm Pro是一款专业的Python集成开发环境(IDE),由JetBrains公司开发。它为Python开发者提供了丰富的功能和工具,使得Python编程变得更加高效和便捷。PyCharm Pro具有智能代码编辑功能,能够自动完成代码、快速导航至…...

Linux的 .bashrc 有什么作用?
一、.bashrc 是什么? 有什么用? .bashrc是一个存储在你的home目录下的隐藏文件,它用来配置和自定义你的终端环境和行为。 每次你启动一个新的终端时,.bashrc文件就会被执行,加载你设置的环境变量,别名,函数…...

.ui文件相关
目录 ui类生成过程: 提问: 等以后自己熟练了用代码写这些样式内容,尽量用代码写,原因很简单: 用代码写的可以直接修改代码,但是在设计界面修改的东西,电脑没有QC这玩意,还真不好改…...
【DOCKER】docker 安装sonarque
安装docker 安装docker https://blog.csdn.net/BThinker/article/details/123358697 加入阿里云镜像 https://blog.csdn.net/TommyXu8023/article/details/113291112 { "registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"] }安装sonarqube ht…...
解决IDEA报错端口被占用的问题
遇到的解决方案通常是执行netstat -ano | findstr "8080" ,然后去关闭对应的进程 但是我遇到的是8080改成任意一个端口,都报错端口被占用,且使用上面的命令并不能查到对应的进程 网上找到的方案能解决我的问题,原链接所…...

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to
前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点,然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候,代码就会回滚到单前选中的这个版本...

Docker核心教程
1. 概述 官网:https://docs.docker.com/ Docker Hub 网站:https://hub.docker.com/ 容器较为官方的解释: 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…...

React通用后台模板
一. 项目初始化 1. 创建项目 环境 npm init vite 打开package.json,参考以下各模块版本: "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^7.2.8", …...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...