listener.d:在不干净的断开连接时崩溃

时间:2011-05-29 21:09:52

标签: exception listener d

对于我正在制作的小型聊天服务器,我决定使用D;找到自己 来自listener.d的一个非常简洁的例子,我决定开始 差不多拿这个例子!但是,我陷入了一个我无法真正做到的错误 用手指环住。很可能这是我自己的错,我正在做点什么 错了,但考虑到我从代码中得到了相当多的代码我更多 倾向于相信这个例子被打破了。

我会解释会发生什么:

  • 列表项
  • 我启动了我的服务器(没有错,它正在运行,并且正在倾听)
  • 我telnet到它。我的服务器接受连接。
  • 我使用telnet发送一些信息。服务器处理信息 恰当地,再次,没有问题。
  • 我使用^]退出telnet,然后编写quit。断开连接 相当不合理。
  • 服务器正确识别出这不是干净的断开连接并执行 删除套接字的代码。
  • 然后我违反了范围。

这是主要过程及其循环: https://github.com/JGBrands/BlaatServer/blob/master/source/bserver.d

这是服务器类,删除套接字所在的代码 函数void destroySocket(int index);

中的完整底部

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示例,就像我说的那样 我得到的错误是:

core.exception.RangeError@server(61): Range violation 
---------------- 
----------------

我认为该功能正在删除它不应该删除的内容 感兴趣的是,这是server.d中的第61行:

if (this.sset.isSet(this.reads[i])) { 

希望你们能帮助我对此有所了解,我在这里错过了一些非常明显的东西吗?

1 个答案:

答案 0 :(得分:0)

正如棘轮所指出的那样:

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

这不会验证索引是否在范围内。它只验证索引不是最后一个元素。只要索引已经被验证在范围内,这就没问题了。

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