Node.js 常见网络错误信息

1.介绍
熟悉 Node.js 的同学一定见过 ETIMEDOUT、EADDRINUSE 等错误提示,那么这些错误信息到底是什么呢?答案其实很简单,因为 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 地址通过 addr 和 length 这两个参数来指定。(这个 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)等)。

 

4.参考资料

转载于:https://www.cnblogs.com/shenjingwa/p/11280482.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值