Node.js 常見網絡錯誤信息

jopen 9年前發布 | 40K 次閱讀 Node.js Node.js 開發
 

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 )等)。

參考資料

libc: Making a Connection

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!