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

linux——TCP服务器获取客户端IP地址

之前的服务器端代码不灵活,今天对他进行优化

1、优化1:使用INADDR_ANY绑定IP

旧代码

sin.sin_addr.s_addr = inet_addr("192.168.88.129");

优化后

sin.sin_addr.s_addr = INADDR_ANY;

这个优化的意思

  • 旧写法:服务器只绑定固定 IP换一台电脑、换一个网卡、换一个网段 →连接失败!

  • 新写法 INADDR_ANY服务器绑定本机所有网卡 IP!不管服务器 IP 是多少不管是哪个网卡不管是内网、外网、虚拟机客户端都能连接!

优点总结

  1. 不挑 IP
  2. 不挑网卡
  3. 代码可移植性极强
  4. 正式项目服务器 100% 这么写

2、优化2:accept 时获取客户端 IP + 端口(正式服务器必备)

旧代码

newfd = accept(fd, NULL, NULL);

只拿连接,不关心客户是谁

优化后

// 新版 struct sockaddr_in cin; socklen_t addrlen = sizeof(cin); newfd = accept(fd,(struct sockaddr *)&cin,&addrlen); char ipv4_addr[16]; inet_ntop(AF_INET, &cin.sin_addr, ipv4_addr, sizeof(ipv4_addr)); printf("Client:(%s,%d) is connect\n", ipv4_addr, ntohs(cin.sin_port));

struct sockaddr_in cin;
  • cin= client in 的意思
  • 作用:准备一个空盒子,用来装客户端的 IP、端口
  • 这个结构体和服务端的sin一模一样,只是名字不同

socklen_t addrlen = sizeof(cin);
  • addrlen:地址结构体的长度
  • 为什么要写?accept 函数要求必须传一个 “地址长度的指针”
  • 这是固定写法,背下来

newfd = accept(fd, (struct sockaddr *)&cin, &addrlen);

旧版后面的两个参数是NULL,优化后会自动的把客户端的IP、端口存到cin里!

char ipv4_addr[16];

用来存字符串格式的IP

inet_ntop(AF_INET, &cin.sin_addr, ipv4_addr, sizeof(ipv4_addr));

把cin里的二进制IP转成字符串IP

printf("Client:(%s,%d) is connect\n", ipv4_addr, ntohs(cin.sin_port));

打印两个东西:

  1. ipv4_addr→ 客户端 IP
  2. ntohs(cin.sin_port)→ 客户端端口

为什么用 ntohs?

因为端口在网络里是网络字节序,要转成主机字节序才能正常打印。

ntohs = network to host short

这个优化的意思

旧版:

只知道有人连接了,但不知道是谁连的

新版:

accept 时自动把客户端的 IP 地址、客户端端口号取出来,然后打印

这个优化的 3 个好处

  1. 可以知道谁连接了服务器
  2. 方便日志记录
  3. 正式网络程序必须这么写
#include<stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <unistd.h> #include<stdlib.h> #include <strings.h> #include <arpa/inet.h> #include<string.h> #define QUIT_STR "QUIT" #define BUFSIZE 1024 #define BACKLOG 5 #define SERV_IP 5001 #define SERV_IP_ADDR "192.168.88.129" int main() { int fd = -1; struct sockaddr_in sin; //1.socket fd = socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); exit(1); } bzero(&sin,sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(SERV_IP); //sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR); sin.sin_addr.s_addr = INADDR_ANY; /*if(inet_pion(AF_INET,SERV_IP_ADDR,(void *)sin.sin_addr.s_addr) != 1) { perror("inet_pton"); exit(1); } */ //2.bind if(bind(fd,(struct sockaddr *)&sin,sizeof(sin)) <0) { perror("bind"); exit(0); } //3.listen if(listen(fd,BACKLOG) < 0) { perror("listen"); exit(1); } //4.accept /*int newfd = -1; newfd = accept(fd,NULL,NULL); if(newfd < 0) { perror("accept"); exit(1); } */ int newfd = -1; struct sockaddr_in cin; socklen_t addrlen = sizeof(cin); newfd = accept(fd,(struct sockaddr *)&cin,&addrlen); if(newfd < 0) { perror("accept"); exit(1); } char ipv4_addr[16]; if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,ipv4_addr,sizeof(cin))) { perror("inet_ntop"); exit(1); } printf("Client:(%s,%d) is connect\n",ipv4_addr,ntohs(cin.sin_port)); char buf[BUFSIZE]; int ret = -1; //read while(1) { do { bzero(buf,BUFSIZE); ret = read(newfd,buf,BUFSIZE-1); }while(ret < 1); if(ret < 0) { exit(1); } if(!ret) { break; } printf("receive data:%s\n",buf); if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))) { printf("Client is exiting!\n"); break; } } close(newfd); close(fd); return 0; }

http://www.jsqmd.com/news/629530/

相关文章:

  • 突破下载瓶颈:XDM浏览器扩展的架构深度解析与技术实践
  • 玉米秸秆粉碎机毕业设计 论文
  • 深入理解 RBAC:基于角色的访问控制模型
  • 如何用imFile下载工具提升你的下载效率:完整使用指南
  • Ambari 3.0.0编译实战:从环境搭建到高效打包
  • AI Agent 跑完任务怎么通知你?我写了个微信推送服务韶
  • 别再瞎选了!CST时域和频域求解器到底怎么选?看完这篇实战对比就懂了
  • 2026年南京公司注册机构最新推荐:南京公司注册代办、公司注册代理、代办执照、代办营业执照机构选择指南 - 海棠依旧大
  • 手把手教学:基于Anything V5的Web服务搭建与使用详解
  • 真实案例:MedGemma辅助医学研究,快速分析CT影像异常区域
  • Upscayl:免费开源AI图像增强工具,让模糊照片重获新生
  • 分析江苏、浙江等地加砂高效制造商,哪家性价比高? - 工业品网
  • 避开这些坑,你的Optics Letters投稿能快一倍:格式、篇幅与审稿人沟通避坑指南
  • Word文档自动化:电子印章批量插入与智能定位技巧
  • 把近万个源文件喂给AI之前,我先做了一件事诺
  • ECAPA-TDNN说话人验证实战指南:实现0.86%等错误率的高性能声纹识别系统
  • 千问3.5-9B Python入门实战:零基础快速上手AI模型部署
  • 2026年4月服务好的UV平板打印机企业需要多少钱,支持多语言系统,方便不同用户 - 品牌推荐师
  • 大模型训练基石:在PyTorch 2.8镜像中配置与优化分布式训练环境
  • 暗黑破坏神2存档编辑器完全指南:专业级角色定制与装备管理解决方案
  • 基于S7-200控制的自动洗车系统总体设计
  • 2026年园林水景维护服务商多少钱,专业服务费用大揭秘 - 工业品牌热点
  • 保姆级教程:用Kotlin为德佟打印机封装一个健壮的异步打印队列框架
  • 土地征收律师正规律所怎么选择,北京性价比高的推荐 - 工业设备
  • 企业选型指南:如何挑选靠谱阿里云代理,高效落地数字化上云 - GrowthUME
  • Charticulator:零编程构建专业级数据可视化图表的终极解决方案
  • Qwen3.5-2B效果展示:上传PPT截图自动生成演讲备注与时间分配建议
  • 2026年说说超市投标方案撰写,世纪联华车站超市投标流程及售后方案 - 工业推荐榜
  • 2026 年企业服务优选推荐榜:南京衡天财务专业代办公司注册与执照,高效合规助力创业起步 - 海棠依旧大
  • 实战指南:在实验室服务器上构建Dify+本地大模型一体化开发环境