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