0Pricing
C Academy · 课时

套接字概述

网络通信基础

套接字概述 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 套接字概述
  2. TCP 服务器
  3. TCP 客户端
  4. 处理多个客户端
← 返回 C Academy