地址簇与数据序列

深入理解IP地址与端口号:网络通信的基础

IP地址:互联网的门牌号

IP地址(Internet Protocol Address)是分配给网络中每台设备的唯一标识符,就像现实世界中的门牌号一样。在计算机上,一个网卡对应一个IP地址。

IP地址分为两个主要版本:

IPv4地址

  • 32位(4字节)地址,通常表示为点分十进制(如192.168.1.1)
  • 结构:网络ID + 主机ID
  • 地址分类:
    • A类(0.0.0.0~127.255.255.255):大型网络
    • B类(128.0.0.0~191.255.255.255):中型网络
    • C类(192.0.0.0~223.255.255.255):小型网络

IPv6地址

  • 128位(16字节)地址,解决IPv4地址耗尽问题
  • 示例:2001:0db8:85a3:0000:0000:8a2e:0370:7334

数据在网络中的传输路径:先到达网络地址(路由器),再转发到具体的主机地址(PC)。

端口号:应用程序的专属通道

端口号是16位无符号整数(0~65535),用于区分同一主机上的不同应用程序:

  • 知名端口(0-1023):分配给系统或知名服务(如HTTP-80,FTP-21)
  • 注册端口(1024-49151):分配给用户注册的应用程序
  • 动态/私有端口(49152-65535):临时分配给客户端程序

重要特性

  • TCP和UDP可以使用相同的端口号而不会冲突
  • 操作系统通过端口号将接收到的数据分发给正确的应用程序

地址信息的表示:sockaddr_in结构体

在网络编程中,我们使用sockaddr_in结构体来表示IPv4地址信息:

struct sockaddr_in {sa_family_t sin_family;   // 地址族(如AF_INET)uint16_t sin_port;        // 16位端口号struct in_addr sin_addr;  // 32位IP地址char sin_zero[8];         // 填充字段,保持结构体大小一致
};struct in_addr {in_addr_t s_addr;         // 32位IPv4地址
};

sockaddr是更通用的地址结构体,实际使用时通常会转换为sockaddr_in进行填充。在传递参数的时候,需要将sockaddr_in转换为sockaddr

网络字节序与地址转换

字节序问题

  • 大端序(Big-endian):高位字节存储在低地址
  • 小端序(Little-endian):高位字节存储在高地址

网络协议统一使用大端序(网络字节序),因此需要进行主机字节序和网络字节序的转换,常用的转换函数如下:

// 主机到网络短整型(端口号)
uint16_t htons(uint16_t hostshort);// 主机到网络长整型(IP地址)
uint32_t htonl(uint32_t hostlong);// 网络到主机短整型
uint16_t ntohs(uint16_t netshort);// 网络到主机长整型
uint32_t ntohl(uint32_t netlong);

网络地址的初始化与分配

字符串与二进制地址转换

// 将点分十进制字符串转换为32位网络字节序整数
in_addr_t inet_addr(const char *cp);// 更安全的转换函数(推荐使用)
int inet_aton(const char *cp, struct in_addr *inp);// 将网络字节序地址转换为点分十进制字符串
char *inet_ntoa(struct in_addr in);

在Windows平台,建议使用更安全的inet_ptoninet_ntop函数。否则,如果没有加忽略安全警告的宏,则会报错:

// 将字符串地址转换为二进制形式
int inet_pton(int af, const char *src, void *dst);// 将二进制地址转换为字符串形式
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

自动获取IP地址

有时一台计算机上不止一个网卡,所以不止一个IP地址,使用下面的代码可以自动获取IP地址。

addr.sin_addr.s_addr = htonl(INADDR_ANY);  // 自动使用可用网卡的IP

INADDR_ANY是一个特殊值,表示:

  • 服务器程序可以监听所有可用网络接口
  • 当主机有多个网卡时,可以接收来自任意网卡的数据

bind函数:关联套接字与地址

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

bind函数完成三个关键任务:

  1. 将IP地址与套接字关联
  2. 将端口号与套接字关联
  3. 对于服务器程序,指定监听的网络接口

实际应用示例

该实例在Linux系统中运行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>int main() {int server_socket;struct sockaddr_in server_addr;// 创建套接字server_socket = socket(PF_INET, SOCK_STREAM, 0);// 初始化地址结构memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取IP地址server_addr.sin_port = htons(8080);// 绑定地址if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind error");exit(1);}printf("Server started on port 8080\n");close(server_socket);return 0;
}

总结

理解IP地址和端口号的概念是网络编程的基础。通过合理使用sockaddr_in结构体和相关转换函数,我们可以轻松处理网络地址信息。记住:

  • 始终注意字节序转换
  • 服务器程序通常使用INADDR_ANY简化多网卡配置
  • bind函数是建立套接字与地址关联的关键步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86469.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中学数集相等概念凸显无穷集不可~其真子集——初数一直将不是N的真子集误为⊂N

中学数集相等概念凸显无穷集不可&#xff5e;其真子集——初数一直将不是N的真子集误为⊂N 黄小宁 [摘要]证明了初等数学应有几何起码常识&#xff1a;当且仅当平移的距离0时才能使平移前、后的点集&#xff08;元点不少于两个&#xff09;重合。从而表明初中的直线公理使中学…

常规层叠设计需要了解的板材知识

常规层叠设计需要了解的板材知识: 层叠设计的第一个关键要点就是要了解板材的基本知识。 观点: PCB是由铜箔(“皮”)、树脂(“筋”)、玻璃纤维布及其他功能性补强添加物(“骨”)组成。层叠设计时&#xff0c;要对“筋骨皮”的材料特性参数有一定了解。 先来看看“皮”,在对常…

Zabbix 监控VMware Vcenter

本次实验测试如何在Zabbix中添加Vcenter监控对象实现对VMware虚拟化平台的监控。 一、测试环境 1、Zabbix服务器配置&#xff1a; Zabbix 版本: Zabbix 7.0.11 LTS 操作系统: Ubuntu 24.04 数据库: MySQL 8 Web 服务器: Apache IP&#xff1a;192.168.1.242 2、监控目标…

链表最终章——双向链表及其应用

———————————本文旨在交流探讨计算机知识&#xff0c;欢迎交流指正———————————— 上一章&#xff0c;我们介绍了链表的循环扩展&#xff0c;但是&#xff0c;单向链表毕竟是单向查询的&#xff0c;就算是经过循环来查找&#xff0c;终究是效率偏低&#x…

智能体的5个核心要素

文章目录 如何看待智能体智能体的发展阶段国内大模型厂家推出的智能体智能体的应用领域智能体架构智能体的核心要素1. ​​认知中枢&#xff08;大模型&#xff09;​​&#x1f9e0; 2. ​​记忆系统&#xff08;Memory&#xff09;​​&#x1f6e0;️ 3. ​​规划与决策&…

QUdpScoket 组播实现及其中的踩坑点记录

QUdpScoket 组播实现及其中的踩坑点记录 QUdpSocket要想组播需要打开MulticastTtlOption配置项&#xff0c;否则无法生效&#xff0c;亲身踩坑经历 m_socketnew QUdpSocket(this);m_socket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);确定一个组播地址&…

250627-结合Guacamole与FRP访问CentOS-Stream-9及Windows10

A. FRP的配置 A.1 FRP在CentOS中的配置 frps.toml [common] bind_port 7000 bind_addr 0.0.0.0dashboard_port 7500 dashboard_user admin dashboard_pwd admin启动&#xff1a;./frps -c frps.toml frpc.toml [common] server_addr 123.456.789.98 server_port 700…

环保法规下的十六层线路板创新:猎板 PCB 如何实现无铅化与可持续制造

在全球环保法规趋严的背景下&#xff0c;十六层线路板作为高端电子设备的核心组件&#xff0c;正面临无铅化与可持续制造的双重挑战。猎板 PCB 凭借材料革新与工艺升级&#xff0c;构建了从焊料到基材、从生产到回收的全链路绿色体系&#xff0c;为行业树立了合规标杆。 一、无…

OpenLayers 拖动旋转和缩放

前言 在 OpenLayers 框架中已经封装了很多便利的交互控件&#xff0c;可以做到开箱即用&#xff0c;非常方便。像拖动缩放、绘制、选择等交互控件可以供开发者直接使用。本篇给大家介绍拖动旋转交互控件 1. 旋转控件简介 此控件通过按住shift键结合鼠标左键或右键进行使用。在…

element ui Cascader 级联选择器 处理未全选时去除父节点值,选中父节点时去除子节点值

目前我这边的需求时&#xff1a;当用户的选择&#xff0c;只保留最顶层的选中节点 如果选中了父节点&#xff0c;则移除其所有子孙节点以及它的祖先节点&#xff08;因为选中父节点代表选中整个分支&#xff0c;所以不需要再显示子节点&#xff1b;同时&#xff0c;如果存在祖…

uniapp实现远程图片下载到手机相册功能

在 UniApp 中实现点击下载图片到相册的功能&#xff0c;需要以下几个步骤&#xff1a; 1. 下载图片到本地&#xff08;uni.downloadFile&#xff09; 2. 将图片保存到相册&#xff08;uni.saveImageToPhotosAlbum&#xff09; 完整代码示例&#xff1a; <template>&l…

【世纪龙科技】吉利博瑞汽车车身诊断与校正仿真教学软件

在汽车产业蓬勃发展的当下&#xff0c;汽车车身诊断与校正技术人才的需求与日俱增。然而&#xff0c;职业院校在汽车车身教学实践中&#xff0c;却面临着学生实训机会稀缺、教学互动匮乏、过程评价缺失、学生技能提升缓慢等诸多难题。江苏世纪龙科技凭借其卓越的技术实力与行业…

极速二刷leetcode hot100

简单题 1.移动0 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 刚开始没看到非零子串的顺序不变&#xff1a; // if(nums.size() 1){// return;// }// //所有 0 移动到数组的末尾//同时保持非零元素的相对顺序。// int n nums.size();// int notZero n-1;////…

技术博客:如何用针孔相机模型理解图像

引言 大家好&#xff01;今天我们来聊聊一个非常有趣的话题——针孔相机模型。这个模型可以帮助我们理解相机是如何捕捉图像的。我们会用一些简单的数学公式来解释这个过程&#xff0c;不用担心&#xff0c;我会尽量让这些内容简单易懂。 什么是针孔相机模型&#xff1f; 针…

Nanonets-OCR:Qwen2.5VL-3B的微调模型 更强大的文档解析能力|附效果实测

一 Nanonets-OCR 简介 Nanonets-OCR不再满足于单纯提取文本&#xff0c;它能智能解析图像中的公式、表格、水印、签名、图表、复选框等复杂结构&#xff0c;并输出格式清晰的 Markdown。 核心功能 ● LaTeX 公式识别&#xff1a;自动将文中数学公式转为标准 LaTeX 格式 ●…

Git下载与使用完全指南:从安装到基础操作详解,附上git的学习网站(很直观)(可以模拟git的全过程)

一、Git简介与下载安装 1.1 Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff0c;由Linus Torvalds&#xff08;Linux之父&#xff09;开发。它可以高效地处理从小型到大型项目的版本管理&#xff0c;具有以下特点&#xff1a; 分布式架构&#xff…

论分布式设计

20250419-作 题目 分布式是指将一个系统或任务分解成多个子部分&#xff0c;并在多个计算机或服务器之间进行协同工作的方式。每个子部分都可以在不同的计算机节点上运行&#xff0c;彼此之间通过网络进行通信和协调。分布式技术在当今互联网应用中起着重要作用&#xff0c;例…

Vue样式绑定与条件渲染详

一、Vue样式绑定 在Vue中&#xff0c;我们可以通过多种方式动态地绑定样式&#xff0c;让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景&#xff1a;样式的类名不确定&#xff0c;需要动态指定 <template><div><!-- 绑定…

固态电池火热-美国固态电池企业QuantumScape宣布,产能规模化迈出了重要一步

美国固态电池企业QuantumScape宣布&#xff0c;其先进的Cobra隔膜工艺已成功集成到基线电池生产中&#xff0c;标志着公司生产能力规模化迈出了重要一步。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 600478 科力远 业绩固态电池 | 1.科力远发布20…

Python 商务数据分析—— NumPy 学习笔记Ⅰ

一、NumPy 简介 1.1 NumPy 特性 高性能科学计算库&#xff1a;专为处理多维数组设计&#xff0c;底层用 C 语言实现&#xff0c;运算速度远超 Python 原生列表。 矢量运算&#xff1a;支持批量数据操作&#xff0c;避免显式循环&#xff0c;代码更简洁高效。 广播机制&…