gpt4 book ai didi

exception - listener.d : crashes upon unclean disconnect

转载 作者:行者123 更新时间:2023-12-05 01:26:59 27 4
gpt4 key购买 nike

对于我正在制作的小型聊天服务器,我决定使用 D;找到自己
用 listener.d 的一个非常简洁的例子来开始我决定
几乎把这个例子拿过来了!但是,我遇到了一个我无法真正做到的错误
环绕我的手指。很可能是我自己的错,我正在做某事
错了,但考虑到我从示例中获取了代码,我更喜欢
倾向于相信这个例子被打破了。

我将解释会发生什么:

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

  • 这是主要过程,它是循环:
    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])) { 

    希望你们能帮助我更了解这一点,我在这里遗漏了一些非常明显的东西吗?

    最佳答案

    正如棘轮指出的那样:

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

    这并不能验证索引是否在范围内。它只验证 index 不是最后一个元素。只要索引已经被验证在范围内,这很好。
    void destroySocket(int index)
    in {
    assert(index > -1);
    assert(index < this.reads.length);
    } body {
    {

    关于exception - listener.d : crashes upon unclean disconnect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6170431/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com