`
lzy.je
  • 浏览: 148548 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

几个常见的 Socket 连接错误及原因

阅读更多

          下面列出了几个在客户与服务进程连接中常见的几个 Socket 错误,并分析了原因。后续再逐渐补充吧。

 

ECONNABORTED

          该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用accept。

 

ECONNABORTED

 

/* Linux system */

include/asm-alpha/errno.h:#define ECONNABORTED 53 /* Software caused connection
abort */
include/asm-generic/errno.h:#define ECONNABORTED 103 /* Software caused
connection abort */
include/asm-mips/errno.h:#define ECONNABORTED 130 /* Software caused connection
abort */

 

accept(2) man page 写道
[ECONNABORTED] A connection arrived, but it was closed while waiting on the listen queue.

 

ECONNRESET

          该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户 TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN (如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的 EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错误。

 

EPIPE

          错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。

 

ETIMEDOUT

          错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。

 

作者:lzy.je
出处:http://lzy.iteye.com
本文版权归作者所有,只允许以摘要和完整全文两种形式转载,不允许对文字进行裁剪。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

// 2009.05.20 21:42 添加 ////

 

ENOPROTOOPT

          该错误不是一个 Socket 连接相关的错误。errno 给出该值可能由于,通过 getsockopt 系统调用来获得一个套接字的当前选项状态时,如果发现了系统不支持的选项参数就会引发该错误。

 

getsockopt/setsockopt(2) man page 写道
getsockopt, setsockopt -- get and set options on sockets.

#include <sys/socket.h>

int getsockopt(int socket, int level, int option_name,
void *restrict option_value, socklen_t *restrict option_len);

int setsockopt(int socket, int level, int option_name,
const void *option_value, socklen_t option_len);

Getsockopt() and setsockopt() manipulate the options associated with a socket. Options may exist at multiple protocol levels; they are always present at the uppermost "socket" level.

 

          此外,getsockopt 和 setsockopt 还可能引发以下错误:

 

getsockopt/setsockopt(2) man page 写道
ERRORS

The getsockopt() and setsockopt() system calls will succeed unless:

[EBADF] The argument socket is not a valid file descriptor.
[EFAULT] The address pointed to by option_value is not in a valid part of the process dress space. For getsockopt(), this error may also be returned if option_len is not in a valid part of the process address space.
[EINVAL] The option is invalid at the level indicated.
[ENOBUFS]Insufficient memory buffers are available.
[ENOPROTOOPT] The option is unknown at the level indicated.
[ENOTSOCK] The argument socket is not a socket (e.g., a plain file).

The setsockopt() system call will succeed unless:

[EDOM] The argument option_value is out of bounds.
[EISCONN]socket is already connected and a specified option cannot be set while this is the case.

 

// 2009.12.21 16:21 添加 ////

 

          一定要检查 write 方法的返回值,尤其是服务端程序,当返回 -1 的时候很有可能是“connection reset by peer”(ECONNRESET 104)。如果服务程序没有处理 SIGPIPE 信号的话,第二次程序在这条已经 close 的 socket 再次 write 时 SIGPIPE 信号就发送到 socket 关联的 owen 进程,也就是上面说的管道破裂,而该信号的默认处理是结束进程。今天不小心又因为这个浪费了两小时,在客户程序连续通信的时候,直接结束客户进程就造成服务进程也同时退出。开来还是太粗心。

 

  • 大小: 14.1 KB
3
0
分享到:
评论

相关推荐

    Socket编程实战

    本文着重介绍现在用的最多的networksocket,包括其在网络模型中的位置、API的编程范式、常见错误等方面,最后用Python语言中的socketAPI实现几个实际的例子。Socket中文一般翻译为“套接字”,不得不说这是个让人...

    Ice-3.7.4.msi for windows版

    7 服务器端没有指定adapter的端口和ip,仅仅随便给了一个名字,并使用该名字从配置文件中读取信息: 启动服务器时没有问题正常,但是客户端无法连接 原因: 对象适配器无效 错误信息: 抛出异常: Ice::...

    C语言FAQ 常见问题列表

    C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日 版权所有 © 2005 * 目录 * 1. 前言 * 2. 声明和初始化 o 2.1 我如何决定使用那种整数类型? o 2.2 64 位机上的 ...

    【Python3 网络编程】ConnectionRefusedError: [Errno 111] Connection refused

    服务器拒绝,有几个可能性: 服务器没启动或未监听端口(用TCP工具连一下你的服务器,看下服务器是否正常监听端口。如果是Windows开发者也可以使用Windows的CMD命令行telnet测试下,格式是 telnet 地址 端口); ...

    亮剑.NET深入体验与实战精要2

    1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 ...

    亮剑.NET深入体验与实战精要3

    1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 ...

    美河提供.智能手机操作系统编程Symbian及60系列1

     6.4.1 与视频相关的几个基本概念  6.4.2 视频播放  6.4.3 视频录制  6.5 位图  6.5.1 位图API概述  6.5.2 位图的使用  6.5.3 位图变换  6.6 图像格式转换  6.6.1 基于活动对象的图像处理  6.6.2 图像解码...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    智能手机操作系统编程Symbian及60系列

     6.4.1 与视频相关的几个基本概念  6.4.2 视频播放  6.4.3 视频录制  6.5 位图  6.5.1 位图API概述  6.5.2 位图的使用  6.5.3 位图变换  6.6 图像格式转换  6.6.1 基于活动对象的图像处理  6.6.2 图像解码...

    java面试宝典

    75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private ...

    x-scan-v3.3-cn

    多线程扫描是这个扫描器的一大特色,所谓多线程就是说同时在本地系统开辟多个socket连接,在同一时间内扫描多个服务器,这样做的好处是提高了扫描速度,节省时间,根据系统的资源配置高低,线程数字也可以自行设定...

    JAVA面试题最全集

    找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中需要处理HTML标记时,应做什么样的处理,要筛选那些字符(&lt; &gt; & “”) 3.在...

    千方百计笔试题大全

    75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private ...

    浅谈黑客与网络安全-.docx

    特洛伊木马程序常被伪装成工具程序或游戏,一旦用户翻开了带有特洛伊木马程序的邮件附件或从网上直接下载,或执行了这些程序之后,当你连接到互联网上时,这个程序就会通知黑客用户的IP地址及被预先设定的端口。...

    Linux编程从入门到精通

    8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 8.4.5 接受连接请求 100 8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 ...

    LINUX编程白皮书

    6.2.5 关于半双工管道需要注意的几个问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 ...

    linux编程白皮书

    8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 8.4.5 接受连接请求 100 8.5 IP层 100 8.5.1 套接字缓冲区 100 8.5.2 接收IP报文 101 8.5.3 发送IP报文 102 8.5.4 数据分片 102 8.6 地址解析协议 ...

Global site tag (gtag.js) - Google Analytics