Ошибка загрузки сетевой инфраструктуры обычно разрешается только одно

Занимаемые 1С порты и их нехватка
   P_Mis

13.09.19 — 14:39

Сервер 1С находится на одном сервере, пользователи подключаются с другого сервера по тонкому клиенту.

Столкнулись с проблемой: после какого-то кол-ва пользователей зашедших в базу, новых перестает пускать — просто падает платформа. Началось внезапно, ничего не меняли, ни конфигурацию, ни платформу, ни сервер. На текущей платформе проработали больше месяца нормально. Через технологический журнал на клиенте выцепил ошибку, с которой падает платформа «Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)». Ошибку это возвращает платформе винда, везде пишут, что проблема в том, что не хватает динамических портов, которые можно расширить через реестр, но это не помогло.

Через netstat -ano на сервере удаленных рабочих столов, откуда подключаются пользователи видно, что заняты все порты с 1560 по 1591 тонким клиентом. Но многие клиенты сидят на рандомных портах типа 45434. Заметили, что новые пользователи не могут зайти в базу, когда все порты 1560-1591 заняты. Если убить любого тонкого клиента, который занимает порт в этом диапазоне и порт освобождается, то новый пользователь может зайти в базу.

Так же, когда все эти порты заняты, не получается запустить отладку из конфигуратора, ругается на «Для выполнения отладки необходимо включить поддержку сетевого протокола TCP/IP» — что тоже описано в инете как проблема занятых портов.

Не понятно, зачем тонкому клиенту на сервере удаленных рабочих столов занимать эти порты, ведь используются они сервером 1С для рабочих процессов. И почему когда свободных портов нет на РДП сервере, клиент не может подключиться к серверу 1С. Но часть клиентов спокойно висят на рандомных портах типа 45434. Такое ощущение, что при коннекте, клиент все таки занимает какой-то из портов в этом диапазоне, а после этого его перекидывает на любой свободный до 65535, но эти порты из диапазона 1560-1591 не успевают освободиться.

Объясните, по какому принципу клиент занимает порты и можно ли это как-то где-то настроить? То, что происходит в описанной ситуации это какой-то сбой либо некорректная настройка и достаточно в настройках службы 1С указать бОльший пул портов? Но никогда не слышал, чтобы в базах, где работает большое кол-во пользователей, увеличивали диапазон портов для рабочих процессов на сервере 1С.

   P_Mis

1 — 13.09.19 — 14:57

В первый раз появилось на платформе 8.3.14.1854, после этого откатились на 8.3.12.1685, на которой были несколько месяцев, ситуация не изменилась.

   eklmn

2 — 13.09.19 — 15:53

вам хватит на 1 локальный порт 1561 всех подключить

сбрасывайте настройки в дефолт, переустанавливайте платформу.

   P_Mis

3 — 13.09.19 — 16:03

(2) Так какие настройки? На РДП сервере стоит только тонкий клиент, какие и где там настройки можно сбросить?

   fbear

4 — 13.09.19 — 16:05

https://its.1c.ru/db/metod8dev#content:5908:hdoc

6. Необходимо настроить сетевой стек для обеспечения возможности обработки большого числа подключений

Настройки, которые необходимо выполнить (в дополнение к настройке 5.2. Настроить рабочий сервер в соответствии с инструкцией):

Запустить regedit и в ветке HKLMSystemCurrentControlSetServicesTcpipParameters указать

MaxFreeTcbs= 100000

TcpTimedWaitDelay= 30

MaxUserPort= 65535

Запустить regedit и в ветке HKLMSystemCurrentControlSetServicesAFDParameters указать

EnableDynamicBacklog= 1

MinimumDynamicBacklog= 20

MaximumDynamicBacklog= 20000

DynamicBacklogGrowthDelta= 10

Устанавливаем диапазон исходящих портов (1025; 65535)

Выполнить: netsh int ipv4 set dynamic port tcp start=1025 num=64510

Выполнить: netsh int ipv4 set dynamic port udp start=1025 num=64510

   P_Mis

5 — 13.09.19 — 16:16

(4) Все эти настройки сделаны, это все как раз гуглится по ошибке «Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)». Но легче не стало вообще. Да и 80 пользователей не так много.

   P_Mis

6 — 13.09.19 — 16:17

Проблема в том, что тонкий клиент почему-то занимает 1560-1591 порты на рдп сервере (не на 1С сервере) и из-за этого не могут подключаться новые клиенты. Так как если через netstat выбрать клиента, который занял 1560 порт, завершить его, то другой пользователь сможет зайти.

   Fragster

7 — 13.09.19 — 16:19

кто-то подкрутил параметр количество соединений на процесс?

   Fragster

8 — 13.09.19 — 16:19

сколько rphost на сервере?

   P_Mis

9 — 13.09.19 — 16:27

(7) Вроде никто ничего не крутил. Сейчас стоит 128.

(8) 1.

   Fragster

10 — 13.09.19 — 17:59

режим отладки при запуске клиента?

   P_Mis

11 — 13.09.19 — 18:43

(10) О, интересная мысль, надо будет проверить. Вообще запускается все без отладки, но вдруг каким-то образом она включается…

   P_Mis

12 — 13.09.19 — 18:46

(10) (11) Во блин, точно! На одном из клиентов, который занял 1562 порт запущена отладка. Каким образом она могла включиться сама то?

   P_Mis

13 — 16.09.19 — 11:25

Нашел в чем была причина, очень все нетривиально оказалось ) У нас в одном документе добавлено очень много доп.реквизитов, а чтобы они не подряд располагались на форме, была изменена форма в пользовательском режиме, красиво и по группам расположили доп.реквизиты.

Чтобы эта настройка применилась у всех, копировали все настройки эталонного пользователя другим пользователям. Видимо, в момент копирования настроек эталонного пользователя, у него была включена отладка, которая так и прилетела всем. Ну и в какой-то момент пользователей просто стало слишком много и проблема проявилась.

  

P_Mis

14 — 16.09.19 — 11:28

(13) Соответственно решение это в личных настройках пользователей очистить настройку из закладки Прочие настройки — Прочие настройки. Ну и переписать копирование настроек, если это делается автоматом.

Tweekaz

24 / 23 / 3

Регистрация: 21.04.2012

Сообщений: 253

1

Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)

10.11.2012, 18:51. Показов 57157. Ответов 6

Метки нет (Все метки)


При запуске вызывается ошибка на строчке с Bind.

Код

Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Thread main_server_thread = new Thread(delegate()
            {
                IPAddress ip = IPAddress.Parse("192.168.1.101");
                IPEndPoint point = new IPEndPoint(ip, 7777);
                Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                main.Bind(point);
                main.Listen(10);
                while (true)
                {
                    Form1 r = new Form1();
                    r.qwe("123456");
                    
                }
            });

Вот такое у нас..
Помогите, кто чем может ))

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт .NET

16931 / 12508 / 3286

Регистрация: 17.09.2011

Сообщений: 20,745

10.11.2012, 19:01

2

Какое-то другое приложение уже принимает соединения на пор 7777.



1



24 / 23 / 3

Регистрация: 21.04.2012

Сообщений: 253

10.11.2012, 19:08

 [ТС]

3

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Какое-то другое приложение уже принимает соединения на пор 7777.

так на любом порте



0



Эксперт .NET

16931 / 12508 / 3286

Регистрация: 17.09.2011

Сообщений: 20,745

10.11.2012, 19:29

4

Цитата
Сообщение от Tweekaz
Посмотреть сообщение

так на любом порте

Значит ваше же приложение, но с разных потоков.



1



Tweekaz

24 / 23 / 3

Регистрация: 21.04.2012

Сообщений: 253

10.11.2012, 19:42

 [ТС]

5

Цитата
Сообщение от kolorotur
Посмотреть сообщение

Значит ваше же приложение, но с разных потоков.

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            start_work();
        }
        public void qwe(string text)
        {
            textBox1.Text = "bla bla blarn";
        }
        public static void start_work()
        {
            Thread main_server_thread = new Thread(delegate()
            {
                IPAddress ip = IPAddress.Parse("192.168.1.101");
                IPEndPoint point = new IPEndPoint(ip, 5271);
                Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                main.Bind(point);
                main.Listen(10);
                while (true)
                {
                    Form1 r = new Form1();
                    r.qwe("123456");
                    
                }
            });
            main_server_thread.Start();
 
        }
    }
}

Вот весь код, то есть никак не могу сам забивать порт.



0



kolorotur

Эксперт .NET

16931 / 12508 / 3286

Регистрация: 17.09.2011

Сообщений: 20,745

10.11.2012, 20:55

6

Цитата
Сообщение от Tweekaz
Посмотреть сообщение

никак не могу сам забивать порт.

Ну как же не можете, если забиваете?

C#
1
2
3
4
5
6
7
8
                main.Bind(point);
                main.Listen(10);
                while (true)
                {
                    Form1 r = new Form1(); // Погнали на строчку 19 и смотрим что там происходит.
                    r.qwe("123456");
                    
                }



2



24 / 23 / 3

Регистрация: 21.04.2012

Сообщений: 253

10.11.2012, 23:10

 [ТС]

7

kolorotur, спасибо, не додумался)



0



Понимаю, что тем с таким заголовком уже уйма, но ответа я так и не увидел. А точнее — что делать в моем случае.

Итак, делаю сервер, который слушает локалку по указанному порту. За основу взял эту библиотеку — https://github.com/nterry/AwesomeSockets.
Вот так выглядит метод запуска прослушивания:

public async void StartListening(int port)
{
    if (CancellationTokenSource == null)
        CancellationTokenSource = new CancellationTokenSource();
    _cancellationToken = CancellationTokenSource.Token;
    Clients = new ObservableCollection<Client>();
    BindingOperations.EnableCollectionSynchronization(Clients, _lockObject);

    try
    {
        while (_tcpListen == null)
        {
            ShowCallbackMessageAction?.Invoke("Try to start server");
            _tcpListen = AweSock.TcpListen(port);

            if (_tcpListen != null)
            {
                ShowCallbackMessageAction?.Invoke("Server started");

                var waitForConnectionTask = Task.Run(() => WaitForConnectionLoop(), _cancellationToken);
                var checkClientsConnectionTask = Task.Run(() => CheckClientsConnectionLoop(), _cancellationToken);

                await Task.WhenAll(waitForConnectionTask, checkClientsConnectionTask);
            }

            // https://stackoverflow.com/a/32768637/4944499
            await Task.Delay(1000, _cancellationToken).ContinueWith(task => { });
        }
    }
    catch (Exception exception)
    {
        ShowCallbackMessageAction?.Invoke($"Error on start server: {exception.Message}");
    }
}

Вот так метод остановки прослушивания:

public void StopListening()
{
    ShowCallbackMessageAction?.Invoke("Begin stop server...");
    ShowCallbackMessageAction?.Invoke("Disconnect all clients");
    DisconnectAllClients();
    CancellationTokenSource?.Cancel();
    _tcpListen?.Close();
    _tcpListen = null;
    ShowCallbackMessageAction?.Invoke("Server stopped");
}

Метод из библиотеки, вызываемый в моем методе StartListening:

public static ISocket TcpListen(int port, int backlog = 10)
{
    var listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //var ip = new IPAddress(new byte[] { 0, 0, 0, 0 });
    //var localEndPoint = new IPEndPoint(ip, port);
    IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
    listenSocket.Bind(localEndPoint);
    listenSocket.Listen(backlog);
    return AwesomeSocket.New(listenSocket);
}

Так вот — это все работает до того момента, пока я приложение свое не закрою без отписки от прослушивания. Т.е., например, случился крэш. После того, как я повторно запускаю сервер, то вижу сообщение:

Лог из моего приложения

Везде пишут, что это нормально и порт сам освободится через некоторое время (вроде 240 секунд), но в моем случае этого не происходит. Помогает только перезагрузка компа.
Как быть?

Понравилась статья? Поделить с друзьями:
  • Ошибка записи cmos как исправить
  • Ошибка загрузки ростелеком телевидение
  • Ошибка записи asio драйвер не работает cubase
  • Ошибка загрузки рокстар лаунчер
  • Ошибка записи 6 неверный дескриптор при копировании файлов