转载

Node.js 常见网络错误信息

Node.js 常见网络错误信息

1.介绍

熟悉 Node.js 的同学一定见过 ETIMEDOUTEADDRINUSE 等错误提示,那么这些错误信息到底是什么呢?答案其实很简单,因为 Node.js 底层使用的是 glibc 库 ,这些错误信息都是 glibc 库在 socket 连接时使用的 connect 函数中定义的错误类型,当然,v8在使用glibc库时也会加入一些自定义的错误类型,但许多错误情况还是和glibc中的定义一致的。

connect 函数的定义为: int connect (int socket, struct sockaddr *addr, socklen_t length)

connect 函数会使用文件描述符(file descriptor) socket 表示的 socket 发起连接,socket 地址通过 addrlength 这两个参数来指定。(这个 socket 一般是其他机器的 socket,而且必须已经配置成了服务器)。

socket 地址解析

一般情况下, connect 函数会等待服务器响应请求才返回。当然也可以将 socket 设置为非阻塞模式来不等待响应就快速返回(可以参考下 nginx 是怎么使用 socket 的)。

文件状态标记

2.错误类型

connect 函数正常的返回值为 0,在有错误时会返回 -1。函数中定义了如下错误条件:

EBADF

socket 不是有效的文件描述符(file descriptor)。

ENOTSOCK

文件描述符 socket 不是 socket 。

EADDRNOTAVAIL

指定的地址在远程机器上不可用。

EAFNOSUPPORT

socket 不支持 addr 的命名空间。

EISCONN

socket 已经连接。

ETIMEDOUT

连接尝试超时。

ECONNREFUSED

服务器主动拒绝建立连接。

ENETUNREACH

从本机到给定 addr 的网络不通。

EADDRINUSE

给定 addr 的 socket 地址已经在使用。(这种错误最常见,我们有时候本地已经启动了一个 Node.js 程序,再次启动会看到这个错误,也就是端口号已经被占用了)

EINPROGRESS

socket 是非阻塞的,连接不能立即建立。可以使用 select 来确定连接完全建立的时间。参考 等待I/O 。在连接完全建立前如果在相同的 socket 上调用 connect,会以 EALREADY 失败。

EALREADY

socket 是非阻塞的而且有一个挂起的连接(参考上面的 EINPROGRESS )。

3.注意

connect 是作为多线程程序的取消点定义的,开发者需要确保线程取消后释放了占用的资源(例如内存、文件描述符、 semaphore )等)。

参考资料

libc: Making a Connection

正文到此结束
Loading...