1. 网络编程基础概念解析
作为一名从事网络编程开发多年的工程师,我经常遇到新手对基础概念理解模糊的问题。今天我想系统梳理一下网络编程中最核心的那些"常识性"知识点,这些内容看似简单,但真正理解透彻的人并不多。
1.1 IP地址的本质与分类
IP地址相当于网络世界的"门牌号",但它的设计远比现实中的地址复杂。我们先从最基础的IPv4说起:
cpp复制// IPv4地址的典型表示形式
std::string ipv4 = "192.168.1.1";
IPv4采用32位地址,通常用点分十进制表示。但在实际编程中,我们需要注意:
- 地址存储:虽然示例中用string表示,但在底层通常会转换为32位整数(如
in_addr结构体) - 特殊地址:
- 127.0.0.1(回环地址):不经过网卡,直接环回
- 0.0.0.0:表示所有可用接口
- 255.255.255.255:有限广播地址
IPv6的出现解决了地址耗尽问题,采用128位地址:
cpp复制// IPv6地址示例(非真实地址)
std::string ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
注意:Windows下用
ipconfig查看IP,Linux/macOS用ifconfig。但在程序中获取IP地址时,建议使用跨平台的网络库函数。
1.2 端口的深入理解
端口是16位无符号整数(0-65535),它的作用常被低估。实际上:
cpp复制uint16_t port = 8080; // 推荐使用uint16_t明确表示端口范围
端口分配有约定俗成的规则:
- 0-1023:知名端口(如HTTP 80,HTTPS 443)
- 1024-49151:注册端口
- 49152-65535:动态/私有端口
在实际开发中,选择端口时要注意:
- 避免使用知名端口
- 测试时可以使用1024以上的任意端口
- 生产环境建议使用配置化的端口管理
1.3 客户端与服务端的本质区别
很多初学者认为客户端和服务端只是角色不同,实际上它们的编程模型差异很大:
服务端典型流程:
cpp复制1. 创建socket
2. 绑定(b
