socket遇到错误直接退出原因和解决办法

本文介绍了解决socket遇到错误时默认由系统处理导致程序直接关闭的问题。通过自定义错误处理函数,可以有效避免整个应用程序因单一错误而崩溃的情况,提高程序稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因:

socket遇到错误时,默认将错误信息交给系统处理,而系统的处理办法一般是直接关闭整个应用,所以就会出现遇到错误程序直接关闭,比如客户端关闭,服务器还在给客户端发信息,就会出现发送失败,导致服务器也直接关闭的现象

解决办法:

把错误交给自己定义的函数处理
先定义一个函数

void Perr(int signum)
{
    if(signum==SIGPIPE)
    {
      fprintf(stderr, "Port Error: %s\n", strerror(errno)); 
    }
}

然后将错误移交给定义的函数处理

signal(SIGPIPE,Perr);

如果要让系统处理,则

signal(SIGPIPE,SIG_IGN);
在使用 socket 编程时,错误码(`errno`)是诊断问题的关键依据。不同的错误码代表了不同类型的故障,以下是常见 socket 错误原因及其解决方法。 ### 常见 socket 错误原因及解决方案 #### 1. **errno = 104: Connection reset by peer** 此错误表示远程主机关闭了连接,通常是由于对端异常终止或网络中断导致的。例如,在非阻塞模式下进行 `connect()` 或 `write()` 操作时遇到该错误,可能是因为没有正确处理 `SIGPIPE` 信号。 - **原因**: - 对端关闭连接后仍尝试写入数据。 - 网络连接中断。 - 服务端异常退出。 - **解决方法**: - 在程序中添加对 `SIGPIPE` 信号的处理,可以选择忽略该信号或自定义信号处理函数。 - 使用 `signal(SIGPIPE, SIG_IGN)` 忽略信号以避免程序意外退出。 - 检查网络稳定性及对端服务是否正常运行。 #### 2. **errno = 118: Socket operation on non-socket** 此错误通常出现在尝试对无效的文件描述符执行 socket 操作时。例如在 ESP32 开发中设置 `SO_REUSEADDR` 后出现该错误,可能是套接字未正确初始化或配置顺序不当。 - **原因**: - 文件描述符不是有效的 socket。 - 套接字未成功创建即调用 `setsockopt()`。 - **解决方法**: - 确保在调用任何 socket API 前,先通过 `socket()` 成功创建 socket 描述符。 - 避免重复使用已关闭的 socket。 - 正确设置 socket 选项顺序,确保 `bind()` `listen()` 等操作按预期执行。 #### 3. **errno = 111: Connection refused** 当尝试连接到一个未监听的端口或服务未启动时会触发该错误。 - **原因**: - 目标主机未运行对应服务。 - 防火墙阻止了连接请求。 - 地址或端口配置错误。 - **解决方法**: - 确认目标服务是否正在运行。 - 检查本地远程防火墙设置。 - 核实 IP 地址端口号是否正确。 #### 4. **errno = 110: Connection timed out** 连接超时通常发生在长时间未收到响应或网络延迟过高时。 - **原因**: - 网络延迟过大。 - 服务器无响应。 - 超时设置不合理。 - **解决方法**: - 增加连接超时时间。 - 检查网络连接质量。 - 实现重试机制以应对短暂网络波动。 #### 5. **errno = 4048 / ERR_SOCKET_TIMEOUT (npm 报错)** 在 Node.js 中使用 npm 安装包时,若出现 `ERR_SOCKET_TIMEOUT`,则可能是代理设置或网络连接问题。 - **原因**: - 代理配置不正确。 - 网络不稳定或 DNS 解析失败。 - 远程服务器无响应。 - **解决方法**: - 检查并更新 npm 的代理配置:`npm config set proxy http://your-proxy-url:port`。 - 更换 DNS 或检查网络连通性。 - 使用 `npm config set timeout 300000` 提高超时限制。 --- ### 示例代码:忽略 SIGPIPE 信号 ```c #include <signal.h> // 忽略 SIGPIPE 信号 signal(SIGPIPE, SIG_IGN); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值