Exception 侦听器.d:在不干净的断开连接时崩溃

Exception 侦听器.d:在不干净的断开连接时崩溃,exception,listener,d,Exception,Listener,D,对于我正在制作的一个小型聊天服务器,我决定使用D;发现自己 通过listener.d提供的一个非常简洁的示例,我决定 这是一个很好的例子!然而,我被一个我不能真正理解的错误所困扰 把我的手指包起来。很可能是我自己的错,我在做什么 错了,但考虑到我从示例中获取的代码,我更 倾向于相信这个例子是错误的 我将解释发生了什么: 列表项 我启动了我的服务器(没有问题,它正在正常运行并正在侦听) 我给它打电话。我的服务器接受连接 我使用telnet发送一些信息。服务器处理信息 正确地说,同样没有问题 我使

对于我正在制作的一个小型聊天服务器,我决定使用D;发现自己 通过listener.d提供的一个非常简洁的示例,我决定 这是一个很好的例子!然而,我被一个我不能真正理解的错误所困扰 把我的手指包起来。很可能是我自己的错,我在做什么 错了,但考虑到我从示例中获取的代码,我更 倾向于相信这个例子是错误的

我将解释发生了什么:

  • 列表项
  • 我启动了我的服务器(没有问题,它正在正常运行并正在侦听)
  • 我给它打电话。我的服务器接受连接
  • 我使用telnet发送一些信息。服务器处理信息 正确地说,同样没有问题
  • 我使用^]退出telnet,然后写入quit。断开连接 相当不礼貌
  • 服务器正确地识别出这不是一个干净的断开连接,并执行 删除套接字的代码
  • 然后我得到了一个射程违规
这是主要流程及其循环:

这是服务器类,它删除套接字的代码位于 功能插座的完整底部(int索引)

实际上,让我复制粘贴它。:-)

代码主要是从listener.d示例中接管的,如我所说 我得到的错误是:

core.exception.RangeError@server(61): Range violation 
---------------- 
----------------
我相信这个函数正在删除一些它不应该删除的东西 感兴趣的是,这是server.d中的第61行:

if (this.sset.isSet(this.reads[i])) { 
希望你们能帮我弄清楚这一点,我是不是遗漏了一些很明显的东西?

正如ratchet所指出的:

if (index != this.reads.length -1)
这不会验证索引是否在范围内。它只验证索引不是最后一个元素。只要已验证指数在范围内,这就可以了

void destroySocket(int index)
in {
    assert(index > -1);
    assert(index < this.reads.length);
} body {
{
void销毁套接字(int索引)
在{
断言(索引>-1);
断言(索引
你调查过i的值是多少吗?我只看到检查了
i==reads.length
没有检查任何其他可能的越界。我解决了我自己的问题。参见第60行,它应该是:'如果(i>=this.reads.length)return false;':如果可以的话,请回答你的问题并发布答案。缩小你的问题范围;你不能期望人们阅读整个源代码。@JesseBrands无意冒犯,但在我看来,棘轮怪胎解决了你的问题。我很久以前问过这个问题,最后有人回答了。这个问题当然解决了很久,但现在我可以了最后检查答案。@JesseBrands,这是我的意图。正在检查未回答的问题。
void destroySocket(int index)
in {
    assert(index > -1);
    assert(index < this.reads.length);
} body {
{