2017-07-18 88 views
0

我正在用node.js製作多人遊戲,但當客戶端發送無效數據包時它會崩潰。當客戶端發送無效數據包時Node.js崩潰

服務器:

msg.readFloatLE(1, true); 

客戶:

C:\Program Files\nodejs\node.exe: src\node_buffer.cc:752: Assertion `(offset + sizeof(T)) <= (ts_obj_length)' failed.

msg.setUint8(1, 1); 

所以,如果服務器正在等待浮動,但客戶端發送一個int,它與此錯誤崩潰我正在使用ws library,但我很確定它是關於node.js.我怎樣才能解決這個問題?

+0

你爲什麼要讀一個浮點數,但設置一個int? –

+0

@SterlingArcher我想看看服務器是否崩潰。每個人都可以輕鬆設置一個int和crash服務器。 – user234

+0

它是自定義包裝嗎?我在ws中看不到這些方法。 – Lazyexpert

回答

1

可以使用trycatch

try { 
    msg.readFloatLE(1, true); 
} 
catch(e) { 
    console.log(e,"error) 
} 
+0

但嘗試抓住它看起來非常難看。沒有其他辦法可以擺脫它嗎? – user234

+2

你在開玩笑吧。這裏有什麼醜陋的?這是我們處理異常的方式。 – Ved

+0

**注意**:try/catch只有在@ snovakovic的答案中指出沒有第二個參數。 – user234

0

處理異常正如@Ved在他的回答指出 - 的try/catch將是最好的辦法。如果你看看爲readFloatLE節點文檔上面清清楚楚地寫着它拋出異常,爲您例如

const defaultCriticalValue = 0.0; 
const floatNum = parseFloat('a') || defaultCriticalValue; 
msg.readFloatLE(floatNum, true); 
0

只是建議不是標準的東西。

// Throws an exception: RangeError: Index out of range 
console.log(buf.readFloatLE(1)); 

你可以看看文件here

的問題是,究竟你試圖完成什麼?並readFloatLE正確的工具呢?

相關問題