Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.07.2022
Сообщений: 29

System.ArgumentOutOfRangeException - индекс вне диапазона

01.10.2022, 18:49. Показов 397. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю клиент серверные приложения. Возникла проблема. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Threading;
using System.Management;
using System.IO;
using System.Diagnostics;
namespace HackersRoomServer
{
    internal class Program
    {
        static TcpClient clientSocket;
        static TcpListener serverSocket = new TcpListener(System.Net.IPAddress.IPv6Any, 7000);
        static NetworkStream stream;
        static List<TcpClient> clients = new List<TcpClient>();
        static bool connectionCheckerOn = true;
        static void Main(string[] args)
        {
            serverSocket.Start();
            Thread listenerThread = new Thread(Listener);
            listenerThread.Start();
            Thread connectionCheckerThread = new Thread(ConnectionChecker);
            connectionCheckerThread.Start();
            while (true)
            {
                if (clients.Count != 0)
                {
 
                }
            }
        }
 
        static void Listener()
        {
            TcpClient listenerClient;
            NetworkStream versionStream;
            while (true)
            {
                listenerClient = serverSocket.AcceptTcpClient();
                versionStream = listenerClient.GetStream();
                clients.Add(listenerClient);
                byte[] versionBytes = new byte[1024];
                versionStream.Read(versionBytes, 0, versionBytes.Length);
                string MessageNotFilter = Encoding.UTF8.GetString(versionBytes), Message = "";
                for (int i = 0; i < MessageNotFilter.Length; i++)
                {
                    if (MessageNotFilter[i] == '\0') break;
                    Message += MessageNotFilter[i];
                }
                if (Message == "Version: 1.2")
                {
                    versionBytes = new byte[1000];
                    versionBytes = Encoding.UTF8.GetBytes("CorrectVersion\0");
                    versionStream.Write(versionBytes, 0, versionBytes.Length);
                }
                else
                {
                    connectionCheckerOn = false;
                    versionBytes = new byte[1000];
                    versionBytes = Encoding.UTF8.GetBytes("InvalidVersion:KickUser\0");
                    versionStream.Write(versionBytes, 0, versionBytes.Length);
                    clients[clients.Count].Close();
                    clients.RemoveAt(clients.Count);
                    connectionCheckerOn = true;
                }
            }
        }
 
        static void ConnectionChecker()
        {
            NetworkStream checkerStream;
            while (true)
            {
                Thread.Sleep(1000);
                for (int i = 0; i < clients.Count && connectionCheckerOn; i++)
                {
                    try
                    {
                        checkerStream = clients[i].GetStream();
                        byte[] checkerBytes = Encoding.UTF8.GetBytes("\0");
                        checkerStream.Write(checkerBytes, 0, checkerBytes.Length);
                    }
                    catch
                    {
                        clients[i].Close();
                        clients.RemoveAt(i);
                    }
                }
                Console.WriteLine("Clients : " + clients.Count);
            }
        }
    }
}
Это сервер, и он выбивает ошибку на clients[clients.Count].Close() - System.ArgumentOutOfRangeException. (65 строка). Понять не могу, почему вне диапазона. Я писал так, что бы до того как отключить клиента программа мне писала clients.Count, и при ошибке так же писала client.Count. И они всегда были равны единице. Тогда вопрос - почему выбивает ошибку про то, что индекс вне диапазона, хотя на деле это не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2022, 18:49
Ответы с готовыми решениями:

System.ArgumentOutOfRangeException: Индекс за пределами диапазона
После отладки всё работает нормально, когда же запускаю .exe выдает ошибку!

System.ArgumentOutOfRangeException: Индекс за пределами диапазона (передача данных в DataGridView)
Здравствуйте! В целях практики разбираю задачу по взаимодействию форм - передаче данных из одной формы в другую. В первой форме у...

Ошибка "System.ArgumentOutOfRangeException: "Индекс и длина должны указывать на позицию в строке"
Ошибка возникла в строке &quot;a = phrase.Substring(2, 2);&quot; не могу понять почему. Прошу помочь. private void textBox1_TextChanged(object...

2
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
01.10.2022, 19:16
Лучший ответ Сообщение было отмечено Koresup как решение

Решение

Скорее всего должно быть clients.Count - 1, т.к. индекс начинается с 0...
0
0 / 0 / 0
Регистрация: 25.07.2022
Сообщений: 29
01.10.2022, 19:45  [ТС]
Someone007, и правда, спасибо большое, кажется я всю жизнь допускал эту ошибку)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2022, 19:45
Помогаю со студенческими работами здесь

System.IndexOutOfRangeException: "Индекс находился вне границ массива."
Здравствуйте форумчане... Ситуация такая...через ком порт приходят 6 байт данных я их помещаю в массив и каждый байт через индекс...

System.IndexOutOfRangeException: "Индекс находился вне границ массива."
По идеи должно выводить в новый файл но изменённый но пишет ошибку System.IndexOutOfRangeException: &quot;Индекс находился вне границ...

System.IndexOutOfRangeException: "Индекс находился вне границ массива."
for (I = 1; I &lt;= textBox1.Text.Length - 1; I++) { for (J = I + 1; J &lt;= textBox1.Text.Length; J++) ...

System.IndexOutOfRangeException: "Индекс находился вне границ массива."
Не могу никак сообразить, как исправитьSystem.

System.IndexOutOfRangeException: "Индекс находился вне границ массива."
Помогите решить проблему, при запуске кода меняя число строк и столбцов выдаёт в TextBox двух найденных элементов &quot;Матрицы.Form1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru