對於我正在做的一個小型聊天服務器thingie,我決定使用D;發現自己 帶有一個來自listener.d的非常整潔的例子,以獲得一個開始啓動我決定 幾乎把這個例子!然而,我卡在一個錯誤,我不能真正圍繞我的手指。最有可能是我自己的錯,我正在做一些事情 錯了,但考慮到我從代碼很多,我更喜歡 傾向於相信這個例子是壞的。listener.d:在不乾淨的斷開連接時崩潰
我會解釋發生了什麼:
- 列表項
- 我開始了我的服務器(沒有錯,它的運行,因爲它應該和聽力)
- 我telnet到它。我的服務器接受連接。
- 我用telnet發送一些信息。服務器正確處理信息 ,再次沒有問題。
- 我使用^]退出telnet然後寫入退出。打破連接 而不是非常。
- 服務器正確識別出這不是乾淨的斷開連接並執行 代碼來刪除套接字。
- 然後我得到一個範圍違規。
這是主要的工藝和它的循環: https://github.com/JGBrands/BlaatServer/blob/master/source/bserver.d
這是服務器類,在那裏它會刪除所述插座的代碼是在函數void destroySocket(INT指數)的 完整底部;
https://github.com/JGBrands/BlaatServer/blob/master/source/server.d
其實讓我複製粘貼。 :-)
void destroySocket(int index) {
this.reads[index].close(); /* release resources. */
/* Remove the socket now. We don't want this around! It'll crash us! */
if (index != this.reads.length -1)
this.reads[index] = this.reads[this.reads.length -1];
this.reads = this.reads[0 .. this.reads.length -1];
writeln("Total connections: " ~ to!string(this.reads.length));
}
的代碼主要是從listener.d例如接管像我說的, 錯誤我得到的是這樣的:
[email protected](61): Range violation
----------------
----------------
我帶領相信該功能刪除一些不應該,對於那些有興趣 ,這是行61 server.d:
if (this.sset.isSet(this.reads[i])) {
希望你們能幫助我做這個更有意義,我是MI在這裏看到真正明顯的東西?
你有沒有調查過我的價值。我只看到'i == reads.length'的檢查不適用於任何其他可能的出界 – 2011-05-29 21:33:43
我解決了我自己的問題。看到第60行,它應該是:'if(i> = this.reads。長度)返回false; ':D – 2011-05-29 22:56:17
如果可以,請編輯您的問題併發布答案。縮小你的問題;你不能指望人們瀏覽整個源代碼。 – Arlen 2011-05-31 00:53:08