You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言Socket服务端accept阻塞无法接受客户端连接问题

Socket程序accept调用无响应问题修复方案

核心原因

你观察到的“程序冻结”是正常行为:accept() 函数默认工作在阻塞模式,在没有客户端主动连接到服务端监听的8070端口时,程序会一直停在accept调用处等待连接入站,不会执行后续代码。

解决方法

方法1:直接验证现有代码逻辑正确性

运行服务端程序后,新开一个终端窗口,执行以下任意一条命令发起本地连接,即可看到后续打印内容:

  • 使用curl测试:curl 127.0.0.1:8070
  • 使用telnet测试:telnet 127.0.0.1 8070

方法2:修改为非阻塞模式避免卡住

如果需要让程序在没有连接时也能继续执行其他逻辑,可以给服务端socket设置非阻塞属性,操作步骤如下:

  1. 引入fcntl相关头文件:
#include <fcntl.h>
  1. 在listen调用完成后、accept调用前,添加设置非阻塞的代码:
// 获取socket原有属性
int flags = fcntl(sockfd_server, F_GETFL, 0);
// 追加非阻塞属性
fcntl(sockfd_server, F_SETFL, flags | O_NONBLOCK);

非阻塞模式下,没有连接时accept会立刻返回-1,你可以配合轮询、select/epoll等IO多路复用机制处理连接,避免程序阻塞。

现有代码的其他可优化点

  • listen调用出错后仅打印了错误信息,没有终止程序,建议添加return -1逻辑,避免后续逻辑异常。
  • read调用的返回值没有做校验,如果客户端断开连接read会返回0或负值,直接打印buffer可能出现乱码。
  • 通信完成后建议主动调用close(new_Socket)和close(sockfd_server)释放socket资源,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Sairam Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:09:04