powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TcpClent ограничение время жизни и кол-ва коннектов
4 сообщений из 4, страница 1 из 1
TcpClent ограничение время жизни и кол-ва коннектов
    #38558749
Cy4eHoK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли как то стандартными метомади\свойствами ограничить время жизни (т.е. давать например 30 сек на все про все, а потом закрывать клиент) и кол-во коннектов???

Код самый обычный:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void start_listener()
{
                ClientListener = new TcpListener(IPAddress.Parse(server_ip), Convert.ToInt32(server_port));
                ClientListener.Start();
                while (true)
                {
                    client_connected(ClientListener.AcceptTcpClient());
                }
}

private void client_connected(TcpClient client)
{
                //обработка
}
...
Рейтинг: 0 / 0
TcpClent ограничение время жизни и кол-ва коннектов
    #38559233
Cy4eHoK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что неужели нету?

И придется вводить переменные-счетчики числа коннектов и запускать таймеры, которые после определенного времени будет делать Client.Close() и минусовать коннект из переменной????
...
Рейтинг: 0 / 0
TcpClent ограничение время жизни и кол-ва коннектов
    #38559400
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TcpClent ограничение время жизни и кол-ва коннектов
    #38561389
Cy4eHoK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79 Task.Wait

А можно пример (не обезательно связанный с Сокетами) который можно подогнать под мою задачу. Заранее спасибо.

И еще вопрос, как корректно нужно завершать прослушку и клиент на сервере, чтобы клиент (все подключенные клиенты) получил(и) уведомление об этом (как при закрытие программы), т.к. при Client.Close() этого не происходит.

Вот, более полный мой код:

Код: 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.
        protected TcpListener ClientListener;
        protected TcpClient ClientSocket;
        protected Thread th1;
        public static string server_ip = string.Empty;
        public static string server_port = string.Empty;

        internal void start_potok()
        {
            Protection.Ban.ban_del();
            th1 = new Thread(start_listener);
            th1.Start();
        }

        internal void stop_potok()
        {
            th1.Abort();
            if (ClientSocket != null)
            {
                ClientSocket.Close();
            }
            ClientListener.Stop();
        }

        private void start_listener() //тут только процедура старта и начала ожидания входящих коннектов
        {
            try
            {
                ClientListener = new TcpListener(IPAddress.Parse(server_ip), Convert.ToInt32(server_port));
                ClientListener.Start();
                ClientSocket = default(TcpClient);
                while (true)
                {
                    ClientSocket = ClientListener.AcceptTcpClient();
                    client_connected(ClientSocket);
                }
            catch (ThreadAbortException ex)
            {
                //не ловим это исключение
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка сервера авторизации для клиентов: " + ex.Message);
            }
        }

        private void client_connected(TcpClient client)
        {
            //тут всякие проверки на бан и тому подобное
            LoginClientProc lcp = new LoginClientProc(client);
        }



Класс в котором идет асинхронное чтение:

Код: 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.
    class LoginClientProc
    {
        internal EndPoint address;
        internal TcpClient client;
        internal NetworkStream stream;
        private byte[] buffer;

        internal LoginClientProc(TcpClient Client)
        {
            address = Client.Client.RemoteEndPoint;
            client = Client;
            stream = Client.GetStream();

            new System.Threading.Thread(read).Start();
        }

        void read()
        {
            try
            {
                buffer = new byte[2];
                stream.BeginRead(buffer, 0, 2, new AsyncCallback(OnReceiveCallbackStatic), null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void OnReceiveCallbackStatic(IAsyncResult result)
        {
            int rs = 0;
            try
            {
                rs = stream.EndRead(result);

                if (rs > 0)
                {
                    short Length = BitConverter.ToInt16(buffer, 0);
                    buffer = new byte[Length - 2];
                    stream.BeginRead(buffer, 0, Length - 2, new AsyncCallback(OnReceiveCallback), result.AsyncState);
                }
                else
                    //0 = клиент отключился
            }
            catch (Exception s)
            {
            }
        }

        private void OnReceiveCallback(IAsyncResult result)
        {
            stream.EndRead(result);

            byte[] buff = new byte[buffer.Length];
            buffer.CopyTo(buff, 0);
            if (!тут_проверка_на_правильность_пакета)
            {
                //выдаем ошибку
            }
            else
            {
                handle(buff);
                new System.Threading.Thread(read).Start();
            }
        }

        private void handle(byte[] buff)
        {
            byte id = buff[0];
            switch (id)
            {
                //кейсы_под_заголовки_пакетов
                default:
                    //неизвестный_пакет
                    break;
            }
           //овтет_на_пакеты
    }



P.S. Принимаю здравую критику :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TcpClent ограничение время жизни и кол-ва коннектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]