对于我正在制作的小型聊天服务器,我决定使用D;找到自己 来自listener.d的一个非常简洁的例子,我决定开始 差不多拿这个例子!但是,我陷入了一个我无法真正做到的错误 用手指环住。很可能这是我自己的错,我正在做点什么 错了,但考虑到我从代码中得到了相当多的代码我更多 倾向于相信这个例子被打破了。
我会解释会发生什么:
这是主要过程及其循环: 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])) {
希望你们能帮助我对此有所了解,我在这里错过了一些非常明显的东西吗?
答案 0 :(得分:0)
正如棘轮所指出的那样:
if (index != this.reads.length -1)
这不会验证索引是否在范围内。它只验证索引不是最后一个元素。只要索引已经被验证在范围内,这就没问题了。
void destroySocket(int index)
in {
assert(index > -1);
assert(index < this.reads.length);
} body {
{