C语言Socket网络编程核心函数:socket、connect与accept详解

Jasper
Jasper
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析C语言Socket网络编程中的三大基石函数:`socket()`、`connect()`与`accept()`。文章详细说明了各函数的头文件依赖、参数定义(包括地址族、协议类型)、返回值处理机制以及常见的系统级错误代码(errno),为开发者构建TCP/UDP应用提供准确的操作依据。

目标与结果

在网络编程中,程序需要明确地建立通信端点(Server或Client)。使用标准的Berkley Socket API,通常遵循以下步骤实现基础通信:

  • 服务端:创建Socket → 绑定地址 → 监听端口 → 接受连接。
  • 客户端:创建Socket → 发起连接 → 数据传输。

理解以下三个核心函数的行为,是实现上述流程的前提。

准备条件

所有C语言的Socket操作均依赖于标准库,且在类Unix系统(如Linux)中最为通用。开始编码前需包含必要的头文件:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>    // 用于IP地址转换,如inet_pton

注意:虽然在大多数系统中`<sys/types.h>`会被间接包含,但显式声明是最佳实践。

真实操作顺序

第1步:创建通信端点 socket()

目的:向操作系统内核申请一个通信通道,并指定使用的协议族和传输类型。

入口:调用int socket(int domain, int type, int protocol);

动作与参数:

  • domain:地址域。常用选项包括:
    • AF_INET:IPv4 网络协议(最常用)。
    • AF_INET6:IPv6 网络协议。
    • AF_UNIX 或 PF_LOCAL:本地进程间通信(IPC)。
  • type:传输类型。主要选项包括:
    • SOCK_STREAM:提供双向、连续、可靠的数据流(即TCP)。在使用前必须通过connect()或accept()建立连线状态。
    • SOCK_DGRAM:无连接、不可靠的数据包传输(即UDP)。
    • SOCK_RAW:提供对底层网络协议的直接访问。
  • protocol:具体协议号。通常情况下,若domain和type已明确,此值设为0即可让系统自动选择默认协议。

完成状态:成功时返回非负整数(文件描述符 fd);失败返回 -1。

常见错误排查:

  • EPROTONOSUPPORT:指定的域名不支持该类型或协议。
  • EMFILE / ENFILE:进程文件表溢出或内核内存不足。
  • EACCES:权限不足。

第2步:建立网络连接 connect()

目的:客户端主动向指定服务器IP和端口发起TCP握手请求(仅适用于SOCK_STREAM)。

入口:int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

动作与参数:

  • sockfd:socket()创建的socket文件描述符。
  • serv_addr:指向存储目标地址的结构体指针。对于IPv4,通常使用struct sockaddr_in填充IP地址(sin_addr.s_addr)和端口号(sin_port)。
  • addrlen:地址结构体的长度,通常使用sizeof(serv_addr)。

完成状态:成功返回0,此时TCP三路握手已完成;失败返回-1。

常见错误排查:

  • ECONNREFUSED:目标主机拒绝连接(通常是服务未启动或防火墙拦截)。
  • ETIMEDOUT:操作超时,通常意味着目标不可达或路由有问题。
  • EISCONN:socket已经处于连接状态,不应重复调用。

第3步:接受入站连接 accept()

目的:服务器从等待队列中提取一个已完成连接的客户端,生成一个新的socket用于后续通信,原socket继续用于监听。

入口:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

动作与参数:

  • sockfd:经过bind()和listen()准备好的服务器监听socket。
  • addr:用于输出远程客户端的地址信息(可填NULL如果不关心是谁连的)。
  • addrlen:输入时指定地址结构长度,输出时更新为实际地址长度。

完成状态:返回一个新的socket文件描述符,后续的send()/recv()应针对这个新描述符进行。原描述符sockfd仍可继续使用accept()接受其他连接。

常见错误排查:

  • EOPNOTSUPP:socket类型不是SOCK_STREAM(例如UDP不能用accept)。
  • EBADF:传入的描述符无效。

简要总结

C语言Socket编程的核心逻辑围绕这三步展开:先用socket申请资源,再由客户端发起connect或服务端执行accept建立通道。掌握这些函数的参数细节与错误返回值,是排查“连接失败”、“拒绝连接”等问题的关键基础。

以上就是C语言Socket相关网络编程函数详细内容的介绍,更多关于Linux网络编程的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。