Linux网络编程socket错误码分析.pdf





《Linux网络编程socket错误码分析.pdf》由会员分享,可在线阅读,更多相关《Linux网络编程socket错误码分析.pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Linux 网络编程 socket 错误分析 socket 错误码:EINTR:4 阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。只能针对阻塞模式的 socket。读,写阻塞的 socket 时,-1 返回,错误号为 INTR。另外,如果出现 EINTR 即 errno 为 4,错误描述 Interrupted system call,操作也应该继续。如果 recv的返回值为 0,那表明连接已经断开,接收操作也应该结束。ETIMEOUT:110 1、操作超时。一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。2、服务器做了读数据做了超时限制,读时发生了超
2、时。3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”“目的地不可达”的 ICMP 消息,相应的客户进程返回的错误是 EHOSTUNREACH 或 ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不
3、存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。EAGAIN:1、Send 返回值小于要发送的数据数目,会返回 EAGAIN 和 EINTR。2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发EAGAIN,有可能返回 0 表示 TCP 连接已被关闭。3、当 socket 是非阻塞时,如返回此错误,表示写缓冲队列已满,可以做延时后再重试.4、在 Linux 进行非阻塞的 socket
4、 接收数据时经常出现 Resource temporarily unavailable,errno代码为 11(EAGAIN),表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏 socket 的同步,不用管它,下次循环接着 recv 就可以。对非阻塞socket 而言,EAGAIN 不是一种错误。EPIPE:1、Socket 关闭,但是 socket 号并没有置-1。继续在此 socket 上进行 send 和 recv,就会返回这种错误。这个错误会引发 SIGPIPE 信号,系统会将产生此 EPIPE 错误的进程杀死。所以,一般在网络程序中,首先屏蔽此消息,
5、以免发生不及时设置 socket 进程被杀死的情况。2、write(.)on a socket that has been closed at the other end will cause a SIGPIPE.3、错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应
6、FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。EBADF:read(.)or write(.)on a locally closed socket will return EBADF EFAULT:地址错误。EBUSY:ECONNREFUSED:1、拒绝连接。一般发生在连接建立时。拔服务器端网线测试,客户端设置 keep alive 时,recv 较快返回 0,先收到 ECONNREFUSED(Connection refused)错误码,其后都是 ETIMEOUT。2、an error returned from connect(),so it
7、can only occur in a client(if a client is defined as the party that initiates the connection ECONNRESET:1、在客户端服务器程序中,客户端异常退出,并没有回收关闭相关的资源,服务器端会先收到 ECONNRESET 错误,然后收到 EPIPE 错误。2、连接被远程主机关闭。有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与 ENETRESET 一起出现。3、远程端执行了一个“hard”或者“abortive”的关闭。
8、应用程序应该关闭 socket,因为它不再可用。当执行在一个 UDP socket 上时,这个错误表明前一个 send 操作返回一个 ICMP“port unreachable”信息。4、如果 client 关闭连接,server 端的 select 并不出错(不返回-1,使用 select 对唯一一个 socket进行 non-blocking 检测),但是写该 socket 就会出错,用的是 send.错误号:ECONNRESET.读(recv)socket 并没有返回错误。5、该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进
9、程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户 TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN(如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络 IO 接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RS
10、T 分节收到前执行的话,那么结果是客户进程会得到一个非预期的 EOF 错误。此时一般会输出“server terminated prematurely”“服务器过早终止”错误。EINVAL:无效参数。提供的参数非法。有时也会与 socket 的当前状态相关,如一个 socket 并没有进入 listening 状态,此时调用 accept,就会产生 EINVAL 错误。EMFILE:打开了太多的 socket。对进程或者线程而言,每种实现方法都有一个最大的可用 socket 数目处理,或者是全局的,或者是局部的。EWOULDBLOCK:EAGAIN 资源暂时不可用。这个错误是从对非阻塞 soc
11、ket 进行的不能立即结束的操作返回的,如当没有数据在队列中可以读时,调用 recv。并不是 fatal 错误,稍后操作可以被重复。调用在一个非阻塞的 SOCK_STREAM socket 上调用 connect 时会产生这个错误,因为有时连接建立必须消耗一定的时间。ENOTCONN 在一个没有建立连接的 socket 上,进行 read,write 操作会返回这个错误。出错的原因是 socket 没有标识地址。Setsoc 也可能会出错。ECONNRESET Connection reset by peer.连接被远程主机关闭。有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇
12、到失败,因为设置了“keep alive”选项,连接被关闭,一般与 ENETRESET 一起出现。ECONNABORTED 1、软件导致的连接取消。一个已经建立的连接被 host 方的软件取消,原因可能是数据传输超时或者是协议错误。2、该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。原因在于当服务和客户进程在完成用于 TCP 连接的“三次握手”后,客户 TCP 却发送了一个 RST(复位)分节,在服务进程看来,就在该连接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno
13、值必须 ECONNABORTED。源自 Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。服务器进程一般可以忽略该错误,直接再次调用 accept。当 TCP 协议接收到 RST 数据段,表示连接出现了某种错误,函数 read 将以错误返回,错误类型为 ECONNERESET。并且以后所有在这个套接字上的读操作均返回错误。错误返回时返回值小于 0。ENETUNREACH 网络不可达。Socket 试图操作一个不可达的网络。这意味着 local 的软件知道没有路由到达远程的 host。ENETRESET 网络重置时丢失连接。由于设置了keep-alive选项,
14、探测到一个错误,连接被中断。在一个已经失败的连接上试图使用 setsockopt 操作,也会返回这个错误。EINPROGRESS:操作正在进行中。一个阻塞的操作正在执行。ENOTSOCK:在非 socket 上执行 socket 操作。EDESTADDRREQ:需要提供目的地址。在一个 socket 上的操作需要提供地址。如往一个 ADDR_ANY 地址上进行 sendto 操作会返回这个错误。EMSGSIZE:消息体太长。发送到 socket 上的一个数据包大小比内部的消息缓冲区大,或者超过别的网络限制,或是用来接收数据包的缓冲区比数据包本身小。EPROTOTYPE 协议类型错误。标识了协议
15、的 Socket 函数在不支持的 socket 上进行操作。如 ARPA Internet UDP 协议不能被标识为 SOCK_STREAM socket 类型。ENOPROTOOPT 该错误不是一个 Socket 连接相关的错误。errno 给出该值可能由于,通过 getsockopt 系统调用来获得一个套接字的当前选项状态时,如果发现了系统不支持的选项参数就会引发该错误。EPROTONOSUPPORT 不支持的协议。系统中没有安装标识的协议,或者是没有实现。如函数需要 SOCK_DGRAM socket,但是标识了 stream protocol.。ESOCKTNOSUPPORT Sock
16、et 类型不支持。指定的 socket 类型在其 address family 中不支持。如可选选中选项SOCK_RAW,但实现并不支持 SOCK_RAW sockets。EOPNOTSUPP Operation not supported.The attempted operation is not supported for the type of object referenced.Usually this occurs when a socket descriptor to a socket that cannot support this operation,for example,
17、trying to accept a connection on a datagram socket.EPFNOSUPPORT Protocol family not supported.The protocol family has not been configured into the system or no implementation for it exists.Has a slightly different meaning to EAFNOSUPPORT,but is interchangeable in most cases,and all Windows Sockets f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 网络 编程 socket 错误 分析

限制150内