Nodejs檢測端口占用問題

問題:

在Windows機器上裝了我們的PC端(Electron)應用(TcpServer默認監聽20000端口),隨後啓動應用,發現安卓端登錄學生賬號後發現無法正常連接pc端(Tcp通信)。

系統環境:

Win7 64位

原因:

對nodejs中net.createServer的listen方法認知不全面,導致20000端口被其他應用程序佔用,但同時PC端的端口檢查更換機制既沒有生效,也沒有報錯。

Listen方法可以指定host。如果你不指定,程序會創建 0.0.0.0 和 172.18.96.46 兩個ip對於port的監聽,此時如果 0.0.0.0:port 端口被其他程序佔用,API並不會拋出異常

解決方案:

顯示在listen端口的時候,指定host

const server = net.createServer().listen(port, ‘0.0.0.0’);

過程:

通過在PC端的log中我們發現,Android端並沒有與PC端的TcpServer創建socket連接,根據經驗來看,有以下兩種可能

1.一體機和安卓平板不在一個內網段,無法互相ping通

2.一體機防火牆未關閉

經過了互ping和查看防火牆設置,排除了上述兩個問題點。

接下來對tcp請求進行抓包,找到了一些規律

這裏寫圖片描述

PS: 172.18.96.46爲PC端IP 172.18.102.211爲Android端IP

根據圖中可以看出,Android端在與PC端建立連接之後,不久之後就斷開了。一直重複這個過程。

在每次斷開之前,兩個端互發了一條數據,長度爲114和135。

這裏寫圖片描述

第一個請求是Android端向PC端發送,數據內容如下:

這裏寫圖片描述

數據內容爲Android端向PC端發送是哪個學生在請求連接,所以這裏沒問題,再看下一個請求內容。

這裏寫圖片描述

這裏發現了問題,這個含有 customError 的消息內容,並不是我們PC端程序發送的。。

所以可以判斷出,20000端口被其他程序使用了,Android的消息發到了其他程序。

通過 netstat -ano 和 tasklist 命令發現如下信息

ip:port pid

0.0.0.0:20000 5444

pid name

5444 Service.exe

找到了佔用20000端口的進程,是另一個服務,進程名稱爲Service.exe。

在原有的程序設計中,我們在創建TcpServer之前,會通過 net.createServer().listen(port)的方法去檢查默認端口20000是否被佔用。

如果被佔用,程序會拋出錯誤,我們在捕獲錯誤的時候,會在待選端口列表中選出下一個再進行嘗試,以此類推,知道有一個端口可用。

在之前對這個功能的測試中,我們通過 net.createServer().listen(port) 方法先創建了一個tcpserver後,如果再調用該方法監聽同一個端口,發現我們的策略是有效的。

但是這裏卻失效了,20000被佔用後,tcpserver依然正常創建並監聽,但是收不到消息。

通過查閱Nodejs net.createServer().listen 方法文檔,發現listen方法可以指定host。如果你不指定,程序會創建 0.0.0.0 和 172.18.96.46 兩個ip對於port的監聽,此時如果 0.0.0.0:port 端口被其他程序佔用,API並不會拋出異常。

所以解決方案是在調用listen方法的時候,顯示指定host。此時如果端口被其他程序佔用,就會拋出異常。

const server = net.createServer().listen(port, ‘0.0.0.0’);

server.on(‘error’, function(){

//try next port

})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章