2011-05-29 83 views
3

對於我正在做的一個小型聊天服務器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在這裏看到真正明顯的東西?

+1

你有沒有調查過我的價值。我只看到'i == reads.length'的檢查不適用於任何其他可能的出界 – 2011-05-29 21:33:43

+0

我解決了我自己的問題。看到第60行,它應該是:'if(i> = this.reads。長度)返回false; ':D – 2011-05-29 22:56:17

+1

如果可以,請編輯您的問題併發布答案。縮小你的問題;你不能指望人們瀏覽整個源代碼。 – Arlen 2011-05-31 00:53:08

回答

0

作爲棘輪指出:

if (index != this.reads.length -1) 

這不驗證索引是在範圍內。它只驗證索引不是最後一個元素。只要指數已經被驗證在範圍內,這就沒有問題。

void destroySocket(int index) 
in { 
    assert(index > -1); 
    assert(index < this.reads.length); 
} body { 
{ 
+0

很久以前我問過這個,最後有人回答。當然這已經很久了,但現在我終於可以檢查答案了。 – 2014-07-28 23:51:14

+0

@JesseBrands,是我的意圖。正在回答未解答的問題。 – 2014-07-29 14:18:10