Linux----网络通信
一、IP地址详解
(一)核心概念
| 概念 | 说明 |
|---|---|
| IP地址 | 网络设备的唯一逻辑标识符,相当于网络世界的"门牌号" |
| 主机 | 任何接入网络的终端设备(计算机/手机/服务器等) |
| 核心作用 | ① 设备标识 ② 路由寻址 ③ 数据传输 |
(二)技术特性
1. 基础结构
32位IPv4地址结构
+----------------+----------------+
| 网络号 | 主机号 |
+----------------+----------------+
2. 关键组成
| 组成部分 | 作用 |
|---|---|
| 网络号 | 标识所属网络(类似城市+街道) |
| 主机号 | 标识具体设备(类似门牌号) |
3. 存储方式
- 数值形式:32位无符号整数(范围:0 ~ 2³²-1)
- 存储格式:大端序(Big-Endian)
// 示例:192.168.1.1的存储方式 0xC0 (192) 0xA8 (168) 0x01 (1) 0x01 (1)
(三)地址分类(经典分类)
1. 类型划分
| 类别 | 首位格式 | 网络号范围 | 主机号范围 | 典型示例 |
|---|---|---|---|---|
| A类 | 0XXXXXXX | 前8位 | 后24位 | 1.0.0.1 ~ 126.255.255.254 |
| B类 | 10XXXXXX | 前16位 | 后16位 | 128.0.0.1 ~ 191.255.255.254 |
| C类 | 110XXXXX | 前24位 | 后8位 | 192.0.0.1 ~ 223.255.255.254 |
| D类 | 1110XXXX | 组播地址 | 224.0.0.0 ~ 239.255.255.255 | |
| E类 | 1111XXXX | 保留地址 | 240.0.0.0 ~ 255.255.255.254 |
2. 特殊地址
| 地址类型 | 范围 | 用途 |
|---|---|---|
| 私有地址 | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | 局域网内部使用 |
| 环回地址 | 127.0.0.0/8 | 本机测试 |
| 自动配置地址 | 169.254.0.0/16 | DHCP失败时临时使用 |
(四)现代划分方式(CIDR)
1. 表示方法
格式:IP地址/前缀长度
示例:192.168.1.0/24
- 前缀长度:网络号的位数(范围:0-32)
- 子网掩码:网络号全1,主机号全0
/24 → 255.255.255.0 /16 → 255.255.0.0
2. 地址计算示例
给定地址:192.168.1.100/24网络地址:192.168.1.0 (IP & 子网掩码)
广播地址:192.168.1.255 (网络地址 | 主机位全1)
可用主机范围:192.168.1.1 ~ 192.168.1.254
最大主机数:2^8 - 2 = 254
(五)协议版本对比
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32位 | 128位 |
| 地址表示 | 点分十进制(192.168.1.1) | 冒号分隔十六进制(2001:db8::1) |
| 地址空间 | 约42.9亿 | 3.4×10³⁸ |
| 包头复杂度 | 简单 | 扩展头部机制 |
二、OSI七层模型(理论框架)
| OSI层级 | 名称 | 核心功能 | 典型协议/技术 | 数据单元 |
|---|---|---|---|---|
| 7 | 应用层 | 用户接口与应用服务 | HTTP、FTP、SMTP、DNS | 消息(Message) |
| 6 | 表示层 | 数据格式转换、加密/解密、压缩 | SSL/TLS、JPEG、ASCII、GZIP | |
| 5 | 会话层 | 建立/管理/终止会话连接 | RPC、PPTP、NetBIOS | |
| 4 | 传输层 | 端到端连接、流量控制 | TCP、UDP、SCTP | 段(Segment) |
| 3 | 网络层 | 寻址与路由选择 | IP、ICMP、NAT、OSPF | 包(Packet) |
| 2 | 数据链路层 | 帧封装、MAC地址访问、差错校验 | Ethernet、PPP、VLAN、ARP | 帧(Frame) |
| 1 | 物理层 | 比特流传输、物理介质规范 | RS-232、1000BASE-T、Wi-Fi | 比特(Bit) |

关键技术示例:
应用层:浏览器访问网页时使用的HTTP协议
表示层:HTTPS通信中的TLS加密过程
会话层:VPN连接使用的PPTP协议
传输层:TCP的三次握手建立连接
网络层:路由器使用OSPF协议计算最优路径
数据链路层:交换机的MAC地址表学习
物理层:光纤传输的激光信号调制
(二)TCP/IP四层模型(实际标准)
| TCP/IP层级 | 对应OSI层 | 核心功能 | 典型协议 | 设备示例 |
|---|---|---|---|---|
| 应用层 | 5-7 | 整合应用服务与网络接口 | HTTP、DNS、SMTP、MQTT | 网关设备 |
| 传输层 | 4 | 端到端数据传输管理 | TCP、UDP、QUIC | 负载均衡器 |
| 网络层 | 3 | 数据包路由与地址管理 | IP、ICMP、BGP、IPSec | 路由器 |
| 网络接口层 | 1-2 | 物理连接与本地网络传输 | Ethernet、Wi-Fi、PPP | 交换机/网卡 |
协议栈工作流程:
sequenceDiagram应用层->>传输层: 封装应用数据(如HTTP请求)传输层->>网络层: 添加TCP头+端口号网络层->>网络接口层: 添加IP头+IP地址网络接口层->>物理介质: 封装帧头+MAC地址
(三)关键对比分析
| 对比维度 | OSI模型 | TCP/IP模型 |
|---|---|---|
| 设计定位 | 理论参考模型 | 实际应用标准 |
| 层间关系 | 严格分层 | 松散分层 |
| 协议支持 | 未绑定具体协议 | 绑定TCP/IP协议族 |
| 普及程度 | 主要用于教学 | 互联网实际标准 |
| 地址管理 | 网络层独立寻址 | IP地址统一寻址 |
| 校验机制 | 每层独立校验 | 端到端校验为主 |
(四)核心协议详解
1. 帧结构示例(Ethernet II)
+---------------+---------------+-----------------+---------------+
| 目标MAC(6B) | 源MAC(6B) | 类型(2B) | 数据(46-1500B)| FCS(4B) |
+---------------+---------------+-----------------+---------------+
2. IP数据包分片
原始包:总长度5000B(超过MTU 1500B)
分片1:1480B数据 + 20B头(偏移0,MF=1)
分片2:1480B数据 + 20B头(偏移185,MF=1)
分片3:40B数据 + 20B头(偏移370,MF=0)
3. TCP连接管理
三次握手:
Client → SYN → Server
Client ← SYN+ACK ← Server
Client → ACK → Server四次挥手:
Client → FIN → Server
Client ← ACK ← Server
Client ← FIN ← Server
Client → ACK → Server
三、客户端/服务器(C/S)模型与传输协议详解
(一)C/S架构核心特性
| 特性 | 说明 |
|---|---|
| 角色划分 | 客户端(请求方)与服务端(响应方) |
| 通信模式 | 1:N 服务模式(单个服务端服务多个客户端) |
| 网络依赖 | 基于网络协议栈实现远程通信 |
| 协议支持 | 可基于TCP/UDP等不同传输层协议实现 |
(二)TCP协议深度解析
1. 核心特性
graph TDA[面向连接] --> B[三次握手建立连接]A --> C[四次挥手断开连接]D[可靠传输] --> E[序列号机制]D --> F[确认应答机制]D --> G[超时重传机制]H[字节流模式] --> I[无边界数据流]H --> J[数据顺序保证]
2. 协议头结构(20字节基础头)
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+---------------+-----------------+
| 源端口 | 目标端口 |
+-------------------------------+---------------+-----------------+
| 序列号(SEQ) |
+---------------------------------------------------------------+
| 确认号(ACK) |
+-----+---------+-----+-----------------------------------------+
|首部长度| 保留 |控制位| 窗口大小 |
+-----+---------+-----+-----------------------------------------+
| 校验和 | 紧急指针(URG) |
+---------------------+-----------------------------------------+
3. 典型应用场景
1. Web服务(HTTP/HTTPS)
2. 文件传输(FTP/SFTP)
3. 电子邮件(SMTP/POP3)
4. 数据库连接(MySQL/Oracle)
5. 远程登录(SSH/Telnet)
(三)UDP协议深度解析
1. 核心特性
graph TDA[无连接] --> B[无需建立连接]C[不可靠传输] --> D[无确认机制]C --> E[可能丢包]F[数据报模式] --> G[独立数据包]F --> H[保留边界]
2. 协议头结构(8字节固定头)
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+---------------+-----------------+
| 源端口 | 目标端口 |
+-------------------------------+---------------+-----------------+
| 数据长度 | 校验和 |
+-------------------------------+---------------+-----------------+
3. 典型应用场景
1. 实时视频/音频传输(Zoom/WebRTC)
2. DNS域名解析
3. 网络监控(SNMP)
4. 物联网通信(MQTT-SN)
5. 在线游戏(部分实时对战)
(四)协议对比分析
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输(确认+重传) | 尽最大努力交付 |
| 数据边界 | 字节流(无边界) | 数据报(保留边界) |
| 传输效率 | 较低(有连接开销) | 较高(无控制开销) |
| 头部开销 | 20-60字节 | 固定8字节 |
| 拥塞控制 | 完善机制(滑动窗口等) | 无控制 |
| 适用场景 | 需可靠传输的应用 | 实时性要求高的应用 |
四、socket() 函数详解
(一)函数原型
#include <sys/socket.h>int socket(int domain, int type, int protocol);
(二)核心功能
- 创建通信端点:在内核中创建套接字数据结构
- 分配资源:建立协议控制块(PCB)
- 返回描述符:类似文件描述符的操作接口
(三)参数详解
1. domain(地址族)
| 常用值 | 说明 | 典型应用 |
|---|---|---|
AF_INET | IPv4网络协议 | 互联网通信(TCP/IP) |
AF_INET6 | IPv6网络协议 | 下一代互联网通信 |
AF_UNIX | 本地通信(文件系统路径) | 同主机进程间高效通信 |
AF_PACKET | 底层包接口 | 网络嗅探器、协议分析工具 |
注意:
AF_*(地址族)与PF_*(协议族)在Linux中已统一,但推荐使用AF_前缀
2. type(套接字类型)
| 类型标志 | 特性 | 对应协议 |
|---|---|---|
SOCK_STREAM | 面向连接、可靠传输、字节流 | TCP |
SOCK_DGRAM | 无连接、不可靠、数据报 | UDP |
SOCK_RAW | 原始网络层访问 | IP/ICMP |
SOCK_SEQPACKET | 有序分组服务 | SCTP |
3. protocol(协议选择)
| 取值 | 说明 |
|---|---|
| 0 | 自动选择默认协议(推荐) |
IPPROTO_TCP | 显式指定TCP协议(=6) |
IPPROTO_UDP | 显式指定UDP协议(=17) |
IPPROTO_RAW | 原始IP协议(需要权限) |
标准协议组合:
// TCP套接字
socket(AF_INET, SOCK_STREAM, 0);// UDP套接字
socket(AF_INET, SOCK_DGRAM, 0);// 原始ICMP套接字
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
(四)返回值处理
| 返回值 | 说明 |
|---|---|
| 正整数 | 新创建的套接字描述符(>=3,0-2为stdin/stdout/stderr) |
| -1 | 创建失败,检查errno:<br>• EACCES(权限不足)<br>• EMFILE(描述符耗尽)<br>• EPROTONOSUPPORT(协议不支持) |
(五)使用示例
1. 创建TCP套接字
int tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_sock == -1) {perror("TCP socket creation failed");exit(EXIT_FAILURE);
}
2. 创建UDP套接字
int udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_sock == -1) {perror("UDP socket creation failed");exit(EXIT_FAILURE);
}
3. 创建原始套接字(需root权限)
int raw_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (raw_sock == -1) {perror("Raw socket creation failed");exit(EXIT_FAILURE);
}
五、connect() 函数详解
(一)函数原型
#include <sys/types.h>
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(二)核心功能
- 建立连接:在客户端与目标服务器之间建立通信链路(TCP三次握手)
- 地址绑定:对于UDP可预先指定默认接收地址
- 错误检测:验证网络可达性与服务可用性
(三)参数解析
| 参数 | 类型 | 说明 |
|---|---|---|
sockfd | int | 由socket()创建的套接字描述符 |
addr | struct sockaddr* | 目标服务器地址结构(需转换为实际协议地址结构) |
addrlen | socklen_t | 地址结构体的实际长度(字节数) |
(四)地址结构示例(IPv4)
struct sockaddr_in {sa_family_t sin_family; // 地址族(AF_INET)in_port_t sin_port; // 端口号(网络字节序)struct in_addr sin_addr; // IP地址(网络字节序)unsigned char sin_zero[8]; // 填充字段(全0)
};struct in_addr {in_addr_t s_addr; // 32位IPv4地址
};
(五)使用流程
sequenceDiagramClient->>Socket: 1. socket()Client->>Socket: 2. connect()Note right of Socket: 触发三次握手Socket-->>Client: 连接成功(返回0)or Socket-->>Client: 连接失败(返回-1)
(六)返回值处理
| 返回值 | 说明 |
|---|---|
| 0 | 连接建立成功 |
| -1 | 连接失败,检查errno:<br>• ECONNREFUSED(目标拒绝)<br>• ETIMEDOUT(超时)<br>• ENETUNREACH(网络不可达) |
(七)典型应用场景
1. TCP客户端连接
int main() {// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("Socket creation failed");exit(EXIT_FAILURE);}// 配置服务器地址struct sockaddr_in serv_addr = {.sin_family = AF_INET,.sin_port = htons(8080),.sin_addr.s_addr = inet_addr("192.168.1.100")};// 建立连接if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {perror("Connection failed");close(sockfd);exit(EXIT_FAILURE);}// 数据传输...close(sockfd);return 0;
}
2. UDP预连接(非必须)
// UDP套接字创建
int udp_sock = socket(AF_INET, SOCK_DGRAM, 0);// 指定默认接收地址
struct sockaddr_in serv_addr = {...};
connect(udp_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));// 后续可直接使用send()代替sendto()
send(udp_sock, buffer, strlen(buffer), 0);
六、网络字节序转换与IP地址处理
(一)字节序转换函数
1. 核心函数列表
| 函数原型 | 功能描述 | 常用场景 |
|---|---|---|
uint32_t htonl(uint32_t hostlong) | 主机到网络序(32位) | IP地址转换 |
uint16_t htons(uint16_t hostshort) | 主机到网络序(16位) | 端口号转换 |
uint32_t ntohl(uint32_t netlong) | 网络到主机序(32位) | 接收IP地址解析 |
uint16_t ntohs(uint16_t netshort) | 网络到主机序(16位) | 接收端口号解析 |
2. 使用示例
// 转换端口号
uint16_t port = 8080;
uint16_t net_port = htons(port);// 转换IPv4地址
uint32_t ip = 0xC0A80001; // 192.168.0.1
uint32_t net_ip = htonl(ip);
(二)IP地址转换函数
1. 传统方法(IPv4)
#include <arpa/inet.h>// 字符串转网络字节序(已过时但常见)
in_addr_t inet_addr(const char *cp);
特性:
- 支持点分十进制格式(如"192.168.0.1")
- 失败返回
INADDR_NONE(通常是0xFFFFFFFF) - 不支持IPv6地址
示例:
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("192.168.1.100");
if (addr.sin_addr.s_addr == INADDR_NONE) {perror("Invalid IP address");
}
2. 现代方法(推荐)
// 通用地址转换(支持IPv4/IPv6)
int inet_pton(int af, const char *src, void *dst);
| 参数 | 说明 |
|---|---|
| af | 地址族(AF_INET/AF_INET6) |
| src | 点分地址字符串 |
| dst | 存储转换结果的缓冲区 |
返回值:
- 1:成功
- 0:输入格式错误
- -1:系统错误
示例:
struct in_addr ipv4_addr;
if (inet_pton(AF_INET, "10.0.0.1", &ipv4_addr) <= 0) {perror("Address conversion failed");
}
(三)地址转换对照表
| 字符串地址 | 十六进制值(网络序) | 十进制值(主机序) |
|---|---|---|
| 127.0.0.1 | 0x7F000001 | 2130706433 |
| 192.168.1.100 | 0xC0A80164 | 3232235876 |
| 255.255.255.255 | 0xFFFFFFFF | 4294967295 |
(四)错误处理指南
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| inet_addr返回INADDR_NONE | 地址格式错误 | 使用正则表达式验证输入 |
| inet_pton返回0 | 地址与协议族不匹配 | 检查AF_INET/AF_INET6 |
| 转换后数值异常 | 字节序转换错误 | 确认使用ntohl/ntohs |
七、bind() 函数详解
(一)函数原型
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(二)核心功能
- 地址绑定:将套接字与指定的网络地址/端口绑定
- 资源分配:声明对特定网络接口的控制权
- 服务标识:为客户端提供可连接的目标端点
(三)参数解析
| 参数 | 类型 | 说明 |
|---|---|---|
sockfd | int | 由socket()创建的套接字描述符 |
addr | struct sockaddr* | 包含绑定地址信息的结构体指针 |
addrlen | socklen_t | 地址结构体的实际长度(字节数) |
(四)使用场景对比
| 场景 | 服务器端 | 客户端 |
|---|---|---|
| 必要性 | 必须调用(需固定服务端口) | 通常省略(系统自动分配临时端口) |
| 典型地址 | 明确指定IP和端口(如0.0.0.0:80) | 可指定为INADDR_ANY+0(自动选择) |
| 错误处理 | 严格检查EADDRINUSE(端口占用) | 关注EACCES(特权端口权限) |
(五)服务器端典型用法
// 创建TCP套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 配置绑定地址
struct sockaddr_in serv_addr = {.sin_family = AF_INET,.sin_port = htons(8080), // 明确指定端口.sin_addr.s_addr = htonl(INADDR_ANY) // 监听所有接口
};// 绑定地址
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {perror("Bind failed");close(sockfd);exit(EXIT_FAILURE);
}
(六)客户端特殊用法
// 创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);// 指定源端口(特殊需求)
struct sockaddr_in cli_addr = {.sin_family = AF_INET,.sin_port = htons(54321), // 固定客户端端口.sin_addr.s_addr = inet_addr("192.168.1.100")
};if (bind(sockfd, (struct sockaddr*)&cli_addr, sizeof(cli_addr)) == -1) {perror("Client bind failed");close(sockfd);exit(EXIT_FAILURE);
}
(七)错误处理指南
| 错误码 | 原因描述 | 解决方案 |
|---|---|---|
EADDRINUSE | 地址/端口已被占用 | 更换端口或等待释放 |
EACCES | 无权限绑定特权端口(<1024) | 使用sudo运行或改用非特权端口 |
EINVAL | 套接字已绑定过地址 | 检查是否重复调用bind() |
ENOTSOCK | 文件描述符不是套接字 | 验证sockfd来源 |
八、listen() 函数详解
(一)函数原型
#include <sys/socket.h>int listen(int sockfd, int backlog);
(二)核心功能
- 监听模式:将套接字设置为被动接收连接状态
- 队列管理:建立连接请求缓冲队列
- 服务准备:为后续
accept()调用提供就绪环境
(三)参数解析
| 参数 | 类型 | 说明 |
|---|---|---|
sockfd | int | 已绑定的流式套接字描述符(需先调用bind()) |
backlog | int | 等待连接队列的最大长度(详见下文说明) |
(四)队列机制详解
graph LRA[Client SYN] --> B{SYN队列<br>(未完成握手)}B -->|完成三次握手| C[ACCEPT队列<br>(已建立连接)]C --> D[accept()取出]style B fill:#f9d5e5,stroke:#f25287style C fill:#d5e8d4,stroke:#82b366
- SYN队列(半连接队列):存储未完成三次握手的请求
- ACCEPT队列(全连接队列):存储已完成握手的连接
- backlog参数:通常指ACCEPT队列的最大长度(不同系统实现有差异)
(五)使用规范
1. 前置条件
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 绑定地址(必须步骤)
struct sockaddr_in addr = {...};
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));// 开始监听
listen(sockfd, SOMAXCONN); // SOMAXCONN为系统允许的最大值
2. 推荐配置
| 操作系统 | 最大backlog值 | 说明 |
|---|---|---|
| Linux | /proc/sys/net/core/somaxconn | 默认值通常为4096 |
| FreeBSD | kern.ipc.soacceptqueue | 默认值通常为128 |
| 通用方案 | 使用SOMAXCONN宏定义 | 自动适配系统最大值 |
(六)错误处理
| 错误码 | 原因描述 | 解决方案 |
|---|---|---|
EADDRINUSE | 地址/端口已被占用 | 检查端口冲突,使用netstat -tulnp排查 |
EBADF | 无效套接字描述符 | 验证sockfd是否已正确创建 |
EINVAL | 套接字未绑定或类型错误 | 确保先调用bind()且为流式套接字 |
ENOTSOCK | 文件描述符不是套接字 | 检查sockfd来源 |

九、accept() 函数详解
(一)函数原型
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
(二)核心功能
- 连接接入:从已完成连接队列中取出首个连接
- 创建新套接字:生成专用于该连接的通信套接字
- 客户端信息获取(可选):记录客户端地址信息
(三)参数解析
| 参数 | 类型 | 说明 |
|---|---|---|
sockfd | int | 处于监听状态的流式套接字描述符 |
addr | struct sockaddr* | 客户端地址信息存储缓冲区(可NULL) |
addrlen | socklen_t* | 输入:缓冲区大小<br>输出:实际地址长度(值-结果参数) |
(四)使用流程
sequenceDiagramClient->>Server: SYNServer->>Client: SYN-ACKClient->>Server: ACKNote right of Server: 连接进入ACCEPT队列Server->>Server: accept()Server-->>Client: 建立数据通道
(五)典型用法
1. 基础用法(不获取客户端信息)
int new_sock = accept(listen_sock, NULL, NULL);
if (new_sock == -1) {perror("Accept failed");// 错误处理
}
2. 获取客户端信息
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);int new_sock = accept(listen_sock, (struct sockaddr*)&client_addr,&addr_len);if (new_sock != -1) {printf("Client from %s:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
}
(六)返回值说明
| 返回值 | 说明 |
|---|---|
| 正整数 | 新通信套接字描述符(>=3) |
| -1 | 失败,检查errno:<br>• EAGAIN/EWOULDBLOCK(非阻塞模式无连接)<br>• ECONNABORTED(连接中止)<br>• EINTR(被信号中断) |
综合应用:
client //作为主动的角色
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>//./client port ipint main(int argc, const char *argv[])
{if(argc != 3){printf("Usage: %s <port> <ip>\n",argv[0]);return -1;}int fd = socket(AF_INET,SOCK_STREAM,0);if(fd < 0){perror("socket fail\n");return -1;}struct sockaddr_in seraddr;bzero(&seraddr,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(atoi(argv[1]));seraddr.sin_addr.s_addr = inet_addr(argv[2]);if(connect(fd,(struct sockaddr*)&seraddr,sizeof(seraddr)) < 0){perror("connect fail");return -1;}printf("connect success!\n");char buf[1024];while(1){printf(">");fgets(buf,sizeof(buf),stdin);write(fd,buf,strlen(buf)+1);if(strncmp(buf,"quit",4) == 0){break;}read(fd,buf,sizeof(buf));printf("s: %s",buf);}close(fd);return 0;
}
server //被动角色
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>int main(int argc, const char *argv[])
{if(argc != 3){printf("Usage: %s <port> <ip>\n",argv[0]);return -1;}//1.socket 创建通信一端int fd = socket(AF_INET,SOCK_STREAM,0);if(fd < 0){perror("socket fail\n");return -1;}struct sockaddr_in seraddr;bzero(&seraddr,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(atoi(argv[1]));seraddr.sin_addr.s_addr = inet_addr(argv[2]);//2.bind--绑定服务端的地址信息if(bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0){perror("bind fail");return -1;}//3.listen 监听if(listen(fd,5) < 0){perror("listen fail");return -1;}//4.acceptint connfd = accept(fd,NULL,NULL);if(connfd < 0){perror("accept fail");return -1;}printf("-----client----connectted\n");char buf[1024];char sbuf[1024];while(1){read(connfd,buf,sizeof(buf));printf("c: %s\n",buf);if(strncmp(buf,"quit",4) == 0){break;}sprintf(sbuf,"server + %s\n",buf);write(connfd,sbuf,strlen(sbuf)+1);}close(fd);close(connfd);return 0;
}
相关文章:
Linux----网络通信
一、IP地址详解 (一)核心概念 概念说明IP地址网络设备的唯一逻辑标识符,相当于网络世界的"门牌号"主机任何接入网络的终端设备(计算机/手机/服务器等)核心作用① 设备标识 ② 路由寻址 ③ 数据传输 &…...
Android逆向:一文掌握 Frida 详细使用
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Frida 简介2. Frida 的工作原理3. 安装 Frida3.1 安装 Frida 工具3.2 安装 Frida Server4. Frida 的基本使用4.1 连接到目标设备4.2 附加到目标进程4.3 编写 Frida 脚本5. Frida 的高级用法5.1 Hook Java 方法5.2 修…...
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命 ——一场重塑人类认知边界的技术战争 一、OpenAI的“感性觉醒”:GPT-4.5的颠覆与争议 1.1 从“冷面学霸”到“温柔导师”:AI的情商跃迁 当用户输入“朋友放鸽子&…...
5G网络切片辨析(eMBB,mMTC,uRLLC)
URLLC有三大应用场景,分别是eMBB(增强型移动宽带)、uRLLC(高可靠低延时通信)和mMTC(海量机器通信)。 增强型移动宽带(eMBB):需要关注峰值速率,容…...
【MySQL篇】数据类型
目录 前言: 1,数据类型的分类 编辑 2 ,数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float类型 2.3.2 decimal类型 3,字符串类型 3.1 char 3.2 varchar 3.3 char与varchar的比较 3.4日期和时间类型 3.5 …...
DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順
DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ内でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…...
Skynet入门(一)
概念 skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。 设计初衷 如何充分利用它们并行运作数千个相互独立的业务。 模块设计建议 在 skynet 中,用服务 (service) 这…...
【音视频】图像基础概念
一、图像基础概念 1.1 像素 像素是一个图片的基本单位,pix使英语单词pixtureelement的结合“pixel”的简称,所以像素有图像元素之意。 例如2500*2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共500万个像素&#x…...
预训练(Pretraining)阶段为何被称为“自监督学习”(Self-Supervised Learning)?
预训练阶段为何被称为自监督学习? 在人工智能领域,尤其是自然语言处理(NLP)和深度学习的快速发展中,预训练(Pretraining)已经成为一种不可或缺的技术手段。而其中一个重要的概念是“自监督学习…...
【已解决】pyodbc 5.2 [ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
问题 当升级 pyodbc 5.2 版本后,连接 sqlserver 数据库,报错如下: 连接失败: (IM002, [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0) (SQLDriverConnect); [IM002] [Microsoft][ODBC 驱动程序管理…...
时钟树的理解
对应电脑的主板,CPU,硬盘,内存条,外设进行学习 AHB总线 -72MHZ max APB1总线 -36MHZ max APB2-72MHZ max 时序逻辑电路需要时钟线控制 ,含有记忆性的原件的存在。(只有时钟信号才能工作&…...
AI 实战2 - face -detect
人脸检测 环境安装源设置conda 环境安装依赖库 概述数据集wider_face转yolo环境依赖标注信息格式转换图片处理生成 train.txt 文件 数据集展示数据集加载和处理 参考文章 环境 安装源设置 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/f…...
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域,CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同,并结合实践案例…...
问题修复-后端返给前端的时间展示错误
问题现象: 后端给前端返回的时间展示有问题。 需要按照yyyy-MM-dd HH:mm:ss 的形式展示 两种办法: 第一种 在实体类的属性上添加JsonFormat注解 第二种(建议使用) 扩展mvc框架中的消息转换器 代码: 因为配置类继…...
为AI聊天工具添加一个知识系统 之127 详细设计之68 编程 核心技术:Cognitive Protocol Language 之1
本文要点 要点 今天讨论的题目:本项目(为使用AI聊天工具的两天者加挂一个知识系统) 详细程序设计 之“编程的核心技术” 。 source的三个子类(Instrument, Agent, Effector) 分别表示--实际上actually ,…...
多个pdf合并成一个pdf的方法
将多个PDF文件合并优点: 能更容易地对其进行归档和备份.打印时可以选择双面打印,减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf,双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …...
周边游平台设计与实现(代码+数据库+LW)
摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对旅游信息管理的提升,…...
深入解析Crawl4AI:为AI应用量身定制的高效开源爬虫框架
引言 在当今数据驱动的时代,人工智能(AI)和大型语言模型(LLM)的发展对高质量数据的需求日益增长。如何高效地从互联网上获取、处理和提取有价值的数据,成为了研究人员和开发者面临的关键挑战。Crawl4AI作为…...
python量化交易——金融数据管理最佳实践——qteasy创建本地数据源
文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心,删除后无法恢复!!总结 qteas…...
Python标准库【os】5 文件和目录操作2
文章目录 8 文件和目录操作8.7 浏览目录下的内容8.8 查看文件或目录的信息8.9 文件状态修改文件标志位文件权限文件所属用户和组其它 8.10 浏览Windows的驱动器、卷、挂载点8.11 系统配置信息 os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面…...
⭐算法OJ⭐矩阵的相关操作【动态规划 + 组合数学】(C++ 实现)Unique Paths 系列
文章目录 62. Unique Paths动态规划思路实现代码复杂度分析 组合数学思路实现代码复杂度分析 63. Unique Paths II动态规划定义状态状态转移方程初始化复杂度分析 优化空间复杂度状态转移方程 62. Unique Paths There is a robot on an m x n grid. The robot is initially lo…...
【Java基础】Java中new一个对象时,JVM到底做了什么?
Java中new一个对象时,JVM到底做了什么? 在Java编程中,new关键字是我们创建对象的最常用方式。但你是否想过,当你写下new MyClass()时,Java虚拟机(JVM)到底在背后做了哪些工作?今天&…...
Baklib云内容中台的核心架构是什么?
云内容中台分层架构解析 现代企业内容管理系统的核心在于构建动态聚合与智能分发的云端中枢。以Baklib为代表的云内容中台采用三层架构设计,其基础层为数据汇聚工具集,通过标准化接口实现多源异构数据的实时采集与清洗,支持从CRM、ERP等业务…...
一个基于vue3的图片瀑布流组件
演示 介绍 基于vue3的瀑布流组件 演示地址: https://wanning-zhou.github.io/vue3-waterfall/ 安装 npm npm install wq-waterfall-vue3yarn yarn add wq-waterfall-vue3pnpm pnpm add wq-waterfall-vue3使用 <template><Waterfall :images"imageList&qu…...
内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详…...
【pytest框架源码分析一】pluggy源码分析之hook常用方法
简单看一下pytest的源码,其实很多地方是依赖pluggy来实现的。这里我们先看一下pluggy的源码。 pluggy的目录结构如下: 这里主要介绍下_callers.py, _hooks.py, _manager.py,其中_callers.py主要是提供具体调用的功能,_hooks.py提…...
《Kafka 理解: Broker、Topic 和 Partition》
Kafka 核心架构解析:从概念到实践 Kafka 是一个分布式流处理平台,广泛应用于日志收集、实时数据分析和事件驱动架构。本文将从 Kafka 的核心组件、工作原理、实际应用场景等方面进行详细解析,帮助读者深入理解 Kafka 的架构设计及其在大数据领域的重要性。 1. Kafka 的背…...
【AHK】资源管理器自动化办公实例/自动连点设置
此处为一个自动连续点击打开检查的自动化操作案例,没有quicker的鼠键录制,不常用了,做个备份 #MaxThreadsPerHotkey 2 ; 这个是核心!!!!确保可以同时运行多个热键或标签global isRunning : tru…...
在docker容器中运行vllm部署deepseek-r1大模型
# 在本地部署python环境 cd /app/ python -m venv myenv # 激活虚拟环境 source /app/myenv/activate # 要撤销激活一个虚拟环境,请输入: deactivate# 进入虚拟环境安装modelscope pip install modelscope# 下载大模型(7B为例) modelscope do…...
Django基础环境准备
Django基础环境准备 文章目录 Django基础环境准备1.准备的环境 win11系统(运用虚拟环境搭建)1.1详见我的资源win11环境搭建 2.准备python环境2.1 winr 打开命令提示符 输入cmd 进入控制台2.2 输入python --version 查看是否有python环境2.3在pyhton官网下…...



