套接字概述
网络通信基础
套接字概述 是 CoddyKit 上的免费 C Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。
什么是套接字
套接字是网络通信的端点。在 POSIX 系统中,它是一个可以进行读写的文件描述符,使两个程序能够通过网络或同一台机器交换数据。
客户端—服务器模型
大多数网络应用使用客户端—服务器模型:
- 服务器绑定到一个地址并等待连接
- 客户端主动向服务器发起连接
连接建立后,双方都可以发送和接收数据。
TCP 与 UDP
两种主要的传输协议:
- TCP(SOCK_STREAM):可靠、有序、基于连接
- UDP(SOCK_DGRAM):速度快、无连接,但数据包可能丢失或乱序
需要正确性时使用 TCP,需要低延迟流式传输时使用 UDP。
创建套接字
socket() 调用会返回一个文件描述符。参数包括:地址族(IPv4 使用 AF_INET)、类型(TCP 使用 SOCK_STREAM)以及协议(使用默认协议时为 0)。
/* Conceptual: sockets need a network environment to run */
#include <sys/socket.h>
#include <netinet/in.h>
int create_tcp_socket(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
/* fd < 0 means error; check with perror */
return fd;
}套接字地址结构
IPv4 地址由 struct sockaddr_in 描述,其中包含地址族、端口和 IP 地址。函数接收通用的 struct sockaddr *,因此需要进行类型转换。
#include <netinet/in.h>
void fill_addr(struct sockaddr_in *addr, unsigned short port) {
addr->sin_family = AF_INET;
addr->sin_port = htons(port); /* host to network short */
addr->sin_addr.s_addr = INADDR_ANY; /* all interfaces */
}字节序很重要
网络使用大端序(网络字节序)。请使用以下函数进行转换:
htons/htonl将主机字节序转换为网络字节序(短整数/长整数)ntohs/ntohl将网络字节序转换为主机字节序
请始终转换端口和地址,否则您可能会连接到错误的位置。
IP 地址转换
inet_pton 会将类似 "127.0.0.1" 的文本 IP 转换为二进制形式,并存储在 sin_addr 中;inet_ntop 则执行反向转换,以便打印。
#include <arpa/inet.h>
#include <netinet/in.h>
int set_ip(struct sockaddr_in *addr, const char *ip) {
return inet_pton(AF_INET, ip, &addr->sin_addr); /* returns 1 on success */
}服务器调用顺序
TCP 服务器通常按以下顺序调用:
socket()创建套接字bind()绑定到地址和端口listen()将套接字标记为被动模式accept()获取连接
客户端调用顺序
TCP 客户端更简单:
socket()创建套接字connect()连接到服务器地址
之后,它可以在同一个描述符上调用 send 和 recv。
发送和接收
请使用 send() 和 recv()(或通用的 write() 和 read())。两者实际传输的字节数都可能少于请求的数量,因此实际代码需要循环,直到所有数据都处理完毕。
始终检查返回值
每个套接字调用都可能失败。返回 -1 时会设置 errno;请调用 perror 报告错误。recv 返回 0 表示对端已关闭连接。健壮的网络程序成败取决于错误检查。
快速检查
测试您对套接字基础知识的理解。
回顾
您已经学习了套接字编程的基础知识。
- 套接字是网络端点和文件描述符
- 客户端—服务器模型可以使用可靠的 TCP 或快速的 UDP
- 将
sockaddr_in与htons和inet_pton配合使用 - 服务器:socket、bind、listen、accept;客户端:socket、connect
常见问题解答
「套接字概述」课时是免费的吗?
是的 — 「套接字概述」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。
「套接字概述」这节课中我会学到什么?
网络通信基础 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「套接字概述」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C Academy 课中编写并运行代码吗?
能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。