linux中关于socket通讯获取本地的源端口号的实现方法

这篇文章主要介绍了linux socket通讯获取本地的源端口号的相关资料,需要的朋友可以参考下

关于TCP IP网络通讯的资料非常多,TCP IP通过IP数据包模式进行端对端通讯。典型的TCP数据包如下

linux中关于socket通讯获取本地的源端口号的实现方法

可以看到数据包包含了源端口号和目的端口号,客户端socket向服务端发起连接时,系统会给socket随机分配一个源端口号,我们可以通过getsocketname来获取连接成功的socket的原端口信息。

函数原型

#include  int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:

sockfd socket连接的句柄

addr 网络地址指针,用来存储本地端socket地址信息,

addrlen addr的空间大小

返回结果,如果调用成功,返回0,并将本地网络地址信息存放在addr里面,失败返回-1,并通过errno反应错误信息。

source_port.cpp

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  void safe_close(int &sock); int main(int argc, char *argv[]) {  int sockfd = 0, n = 0;  socklen_t len = 0;  char host[512] = {0};  char buf[1024] = {0};  struct hostent *server;  struct sockaddr_in serv_addr, loc_addr;  if (argc h_addr, server->h_length);  if (-1 == inet_pton(AF_INET, host, &serv_addr.sin_addr)) {   memset(buf, 0, sizeof(buf));   snprintf(buf, sizeof(buf), "inet_pton failed. errno: %d, error: %s", errno, strerror(errno));   perror(buf);   exit(-1);  }  if (-1 == connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) {// 连接socket   memset(buf, 0, sizeof(buf));   snprintf(buf, sizeof(buf), "connect socket failed. errno: %d, error: %s", errno, strerror(errno));   perror(buf);   exit(-1);  }  printf("connect to %s success.n", host);  len = sizeof(sizeof(loc_addr));  memset(&loc_addr, 0, len);  if (-1 == getsockname(sockfd, (struct sockaddr *)&loc_addr, &len)) {// 获取socket绑定的本地address信息   memset(buf, 0, sizeof(buf));   snprintf(buf, sizeof(buf), "get socket name failed. errno: %d, error: %s", errno, strerror(errno));   perror(buf);   safe_close(sockfd);   exit(-1);  }  if (loc_addr.sin_family == AF_INET) {// 打印信息   printf("local port: %un", ntohs(loc_addr.sin_port));  }  safe_close(sockfd);  return 0; } void safe_close(int &sock) {  if (-1 != sock) {   shutdown(sock, SHUT_RDWR);   sock = -1;  } }

本程序首先会启动一个socket连接一个普通的http服务器(baidu,qq,163,csdn),当socket连通时就通过getsocketname获取连接绑定的本地地址,并通过该地址获取源端口号。

终端1: 编译及运行

$ g++ source_port.cpp$ ./a.out www.baidu.comconnect to www.baidu.com success.local port: 39702

终端2: 通过tcpdump抓包验证

$ sudo tcpdump host www.baidu.com -vtcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes18:38:32.381448 IP (tos 0x0, ttl 64, id 35033, offset 0, flags [DF], proto TCP (6), length 60)icentos.39702 > 220.181.111.188.http: Flags [S], cksum 0x8cd2 (incorrect -> 0x596a), seq 2381397554, win 29200, options [mss 1460,sackOK,TS val 3513497323 ecr 0,nop,wscale 7], length 018:38:32.425904 IP (tos 0x0, ttl 55, id 35033, offset 0, flags [DF], proto TCP (6), length 60)220.181.111.188.http > icentos.39702: Flags [S.], cksum 0xc315 (correct), seq 3561856904, ack 2381397555, win 8192, options [mss 1424,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 018:38:32.425930 IP (tos 0x0, ttl 64, id 35034, offset 0, flags [DF], proto TCP (6), length 40)

对比终端一和终端二表明获取的源端口地址是正确的。

总结

以上就是linux中关于socket通讯获取本地的源端口号的实现方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/183667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 08:44:24
下一篇 2025年11月1日 09:09:20

相关推荐

  • Reserve Rights Token(RSR)币是什么? RSR协议如何铸造RSV稳定币?

    目录 什么是Reserve Rights Token (RSR)?Reserve Rights Token (RSR) 如何运作?RSR 币的创始人是谁?RSR 币的独特之处是什么?RSR 币的价值来自哪里?RSR 币流通量是多少?RSR 币的其他技术数据 影响RSR币价格的因素RSR币价格预测20…

    2025年12月8日
    000
  • OKX平台网页版登录地址 OKX网页版最新入口

    想要安全便捷地进入 okx 平台进行数字资产交易?okx 网页版为你提供了一个稳定可靠的选择。通过网页版,你无需下载任何客户端,即可在浏览器中直接访问 okx 的各项功能,包括交易、充提币、查看行情、参与活动等等。无论你使用 windows、macos 还是 linux 系统,只要拥有一个现代浏览器…

    2025年12月8日
    000
  • btc看盘软件官网地址 btc看盘软件官方网页版入口

    BTC看盘软件应运而生,它不仅仅是一款简单的行情查看工具,更是您在数字货币交易世界中的得力助手。该软件集成了实时行情数据、专业的图表分析、个性化的预警设置等功能,旨在帮助用户更高效、更理性地进行交易。无论您是经验丰富的资深交易员,还是初入币圈的新手,这款软件都能满足您不同的需求,让您在波澜壮阔的数字…

    2025年12月8日
    000
  • 七大值得关注的链上新秀RWA项目:KTA/RWA/COLLAT/BUILDon/PVS/Linux/CVGT

    现在有哪些值得关注的新项目?随着传统金融巨头纷纷“带资进组”,叠加政策监管日趋清晰,rwa赛道正加速驶入主流视野。曾经属于小圈子探索的资产上链,如今正成为合规创新的桥头堡。而近期链上也悄然掀起一场“合规+想象力”的新浪潮,多个打着rwa标签的项目引发市场关注。 本文PANews盘点了最近7个活跃于R…

    2025年12月8日 好文分享
    000
  • 欧易官方入口正确地址 欧易下载教程

    欧易官方入口正确地址是:www.okx.com。该地址是欧易的全球官方网站,提供多语言支持和移动应用下载,确保用户数据安全和便捷交易体验。 进入欧易官方入口的正确地址是:。这个地址是欧易的全球官方网站,适用于大多数国家和地区的用户。访问该网站时,用户可以选择多种语言进行操作,极大地提升了用户体验。此…

    2025年12月8日
    000
  • 欧亿ouyi交易平台v6.120.0官方最新安装版入口

    欧亿ouyi交易平台作为全球领先的数字资产交易平台,其最新版本v6.120.0已经发布。该版本在用户体验、安全性和功能性上都进行了显著的提升,旨在为用户提供更流畅、更安全的交易体验。无论你是新手还是资深交易者,欧亿ouyi交易平台都能满足你的需求。本文将详细介绍如何下载和安装欧亿ouyi交易平台v6…

    2025年12月8日
    000
  • 安币交易所怎么安全下载 安币交易所安全入口

    安币交易所安全下载和访问的步骤包括:1.访问官方网站下载客户端;2.验证文件完整性;3.书签官方网站并使用HTTPS访问;4.启用双重认证并使用强密码进行安全交易。 安币交易所安全下载指南 安币交易所是许多加密货币投资者选择的平台之一。为了确保在使用该交易所时能够安全地进行下载和访问,我们将详细介绍…

    2025年12月8日
    000
  • 2025年最好的比特币,Litecoin和Dogecoin云挖掘平台

    在2025年,比特币、莱特币和狗狗币依然在加密矿业领域占据主导地位。 在2025年,得益于强劲的市值、稳定的市场需求以及可靠的网络性能,比特币、莱特币和狗狗币依然是最受欢迎的加密货币。这三种货币通常被认为是投资者的理想选择,而其他替代币则因交易速度、社区活跃程度及通货膨胀机制等因素而有所不同。 对于…

    2025年12月8日
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • Linux如何防止缓冲区溢出_Linux防止缓冲区溢出的安全措施

    缓冲区溢出可通过栈保护、ASLR、NX bit、安全编译选项和良好编码实践来防范。1. 使用-fstack-protector-strong插入canary检测栈破坏;2. 启用ASLR(kernel.randomize_va_space=2)随机化内存布局;3. 利用NX bit标记不可执行内存页…

    2025年12月6日 运维
    000
  • Linux如何优化系统性能_Linux系统性能优化的实用方法

    优化Linux性能需先监控资源使用,通过top、vmstat等命令分析负载,再调整内核参数如TCP优化与内存交换,结合关闭无用服务、选用合适文件系统与I/O调度器,持续按需调优以提升系统效率。 Linux系统性能优化的核心在于合理配置资源、监控系统状态并及时调整瓶颈环节。通过一系列实用手段,可以显著…

    2025年12月6日 运维
    000
  • Pboot插件数据库连接的配置教程_Pboot插件数据库备份的自动化脚本

    首先配置PbootCMS数据库连接参数,确保插件正常访问;接着创建auto_backup.php脚本实现备份功能;然后通过Windows任务计划程序或Linux Cron定时执行该脚本,完成自动化备份流程。 如果您正在开发或维护一个基于PbootCMS的网站,并希望实现插件对数据库的连接配置以及自动…

    2025年12月6日 软件教程
    000
  • Linux命令行中wc命令的实用技巧

    wc命令可统计文件的行数、单词数、字符数和字节数,常用-l统计行数,如wc -l /etc/passwd查看用户数量;结合grep可分析日志,如grep “error” logfile.txt | wc -l统计错误行数;-w统计单词数,-m统计字符数(含空格换行),-c统计…

    2025年12月6日 运维
    000
  • Linux命令行中fc命令的使用方法

    fc 是 Linux 中用于管理命令历史的工具,可查看、编辑并重新执行历史命令。输入 fc 直接编辑最近一条命令,默认调用 $EDITOR 打开编辑器修改后自动执行;通过 fc 100 110 或 fc -5 -1 可批量编辑指定范围的历史命令,保存后按序重跑;使用 fc -l 列出命令历史,支持起…

    2025年12月6日 运维
    000
  • VSCode终端美化:功率线字体配置

    首先需安装Powerline字体如Nerd Fonts,再在VSCode设置中将terminal.integrated.fontFamily设为’FiraCode Nerd Font’等支持字体,最后配合oh-my-zsh的powerlevel10k等Shell主题启用完整美…

    2025年12月6日 开发工具
    000
  • Linux命令行中locate命令的快速查找方法

    locate命令通过查询数据库快速查找文件,使用-i可忽略大小写,-n限制结果数量,-c统计匹配项,-r支持正则表达式精确匹配,刚创建的文件需运行sudo updatedb更新数据库才能查到。 在Linux命令行中,locate 命令是快速查找文件和目录路径的高效工具。它不直接扫描整个文件系统,而是…

    2025年12月6日 运维
    000
  • Linux文件系统rsync命令详解

    rsync通过增量同步高效复制文件,支持本地及远程同步,常用选项包括-a、-v、-z和–delete,结合SSH可安全传输数据,配合cron可实现定时备份。 rsync 是 Linux 系统中一个非常强大且常用的文件同步工具,能够高效地在本地或远程系统之间复制和同步文件与目录。它以“增量…

    2025年12月6日 运维
    000
  • Linux systemctl list-dependencies命令详解

    systemctl list-dependencies 用于查看 systemd 单元的依赖关系,帮助排查启动问题和优化启动流程。1. 基本语法为 systemctl list-dependencies [选项] [单元名称],默认显示 default.target 的依赖。2. 常见单元类型包括 …

    2025年12月6日 运维
    100
  • 如何在mysql中安装mysql插件扩展

    安装MySQL插件需先确认插件文件位于plugin_dir目录,使用INSTALL PLUGIN命令加载,如INSTALL PLUGIN keyring_file SONAME ‘keyring_file.so’,并确保用户有SUPER权限,最后通过SHOW PLUGINS验…

    2025年12月6日 数据库
    000

发表回复

登录后才能评论
关注微信