listener.d: вылетает при нечистом отключении - PullRequest
3 голосов
/ 30 мая 2011

Для небольшого сервера чата, который я делаю, я решил использовать D;Оказавшись на очень аккуратном примере с listener.d, чтобы начать, я решил в значительной степени взять этот пример на себя!Тем не менее, я застрял на ошибке, которую я не могу по-настоящему обернуть пальцем вокруг.Скорее всего, это моя вина, и я делаю что-то не так, но, учитывая, что я взял код из примера, я склонен полагать, что пример не работает.

Я объясню, что происходит:

  • Элемент списка
  • Я запускаю свой сервер (ничего плохого, он работает так, как должен, и слушает)
  • Я телнет к нему.Мой сервер принимает соединение.
  • Я использую 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 
---------------- 
----------------

Я верюфункция удаляет что-то, чего не должно быть, для тех, кто заинтересован, это строка 61 в server.d:

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

Надеюсь, вы, ребята, можете помочь мне разобраться в этом, я упускаю что-то действительно очевидноездесь

1 Ответ

0 голосов
/ 24 июня 2014

Как указывает храповик:

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

Это не подтверждает, что индекс находится в пределах диапазона.Это только подтверждает, что индекс не последний элемент.Это нормально, если индекс уже проверен, чтобы быть в пределах диапазона.

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