Linux Socket 编程基础:从监听端口到连接建立

云浩吖_7732

云浩吖_7732

2026-08-30

787人浏览

原创

linux socket编程中,服务端监听到连接建立的标准化流程是:先socket创建套接字,再setsockopt设置端口复用,接着bind绑定ip和端口,然后listen启动监听,最后accept阻塞获取新连接;客户端则通过socket创建套接字后直接connect发起三次握手。

linux socket 编程基础:从监听端口到连接建立

Linux Socket 编程中,从监听端口到连接建立是一套标准化、分阶段的流程,核心在于服务端主动“守候”,客户端主动“叩门”。关键不是写多少代码,而是每一步的语义和依赖关系是否清晰——比如 bind 必须在 listen 之前,listen 又必须在 accept 之前,顺序错一步,连接就无法建立。

服务端:如何正确监听一个端口

监听端口不是简单地“打开一个门”,而是让内核把该端口纳入管理,并准备排队处理连接请求。

  • 先创建套接字:用 socket(AF_INET, SOCK_STREAM, 0) 获取一个 TCP 类型的文件描述符,这是后续所有操作的基础
  • 设置端口复用(可选但推荐):调用 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)),避免程序重启时因 TIME_WAIT 状态导致 “Address already in use” 错误
  • 绑定地址与端口:填充 struct sockaddr_in,指定 sin_addr.s_addr = INADDR_ANY(监听所有网卡)和目标端口号(如 8080),再执行 bind()。若绑定失败,常见原因是端口被占用或权限不足(1024 以下端口需 root)
  • 启动监听:调用 listen(sockfd, 5),其中 backlog=5 表示已完成三次握手、等待 accept() 处理的连接队列长度上限。超出此数的新连接会被内核拒绝(客户端收到 ECONNREFUSED)

客户端:怎样发起一次有效连接

客户端不监听,只主动寻找服务端并完成三次握手。它的动作更轻量,但对地址信息准确性要求更高。

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载
  • 同样先创建套接字:和服务端一样调用 socket(),类型一致(SOCK_STREAM)
  • 直接 connect:填好服务端 IP 和端口后,调用 connect()。该调用会触发 SYN 包发送,阻塞直到收到 SYN-ACK 并发出 ACK(即连接建立完成),或超时/失败返回
  • 错误需及时判断:若 connect() 返回 -1,检查 errno —— ECONNREFUSED 表示服务端未运行或未 listen;ETIMEDOUT 表示网络不可达或防火墙拦截;EINPROGRESS 则出现在非阻塞模式下,需配合 select 或 poll 等待结果

连接建立后的状态确认

服务端调用 accept() 才真正拿到一个“已连接的套接字”,它和原始监听套接字是两个独立的 fd。

  • accept() 返回一个新的文件描述符,代表与特定客户端的专属通信通道;原监听 fd 仍保持不变,继续接受新连接
  • 成功返回时,accept() 会把客户端地址信息写入传入的 sockaddr* 参数,可用于日志记录或访问控制
  • 如果服务端未做任何读写操作,仅靠 accept() 成功不能保证应用层通信就绪——还需确保双方都准备好收发数据(例如客户端调用 write() 后,服务端才能 read() 到)

常见卡点与绕过思路

实际调试中,90% 的连接失败问题集中在几个固定环节:

  • 服务端 bind 失败 → 检查端口是否被占用(netstat -tuln | grep :端口号)、是否用了 INADDR_LOOPBACK 却试图从外部连接
  • 客户端 connect 超时 → 确认服务端 IP 可达(ping)、端口开放(telnet IP 端口 或 nc -zv IP 端口)、本地防火墙(iptables 或 ufw)是否放行
  • accept 一直阻塞 → 正常行为,说明没有客户端连入;若想非阻塞,需提前用 fcntl(sockfd, F_SETFL, O_NONBLOCK)
  • 连接建立后立刻断开 → 查看是否服务端或客户端在 accept() 或 connect() 后没做任何 I/O 就直接 close(),造成 RST 包发送

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

900

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2772

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

916

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

829

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

414

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2496

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4632

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

747

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习