Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
.NET 6

Ошибка подключения к серверу WebSocket

12.06.2023, 14:35. Показов 2084. Ответов 14

Студворк — интернет-сервис помощи студентам
При большом количестве подключений к серверу я получаю ошибку на стороне клиента Unable to connect to the remote server Невозможно подключиться к удаленному серверу При запуске количество ошибок всегда разное от 0 до 100 и т.п. При этом проект с сервером при нагрузке в 1000 подключений потребляет на 10мб больше озу, у клиентского приложения нагрузка полностью отсутствует. Подскажите как можно стабилизировать работу с сокетами. Код сервера Program.cs
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
using Microsoft.AspNetCore.HttpOverrides;
using System.Text.Json.Serialization;
 
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
var connectionString = builder.Configuration.GetConnectionString("Programs");
builder.Services.AddSqlite<ContextProgram>(connectionString);
var app = builder.Build();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseHttpsRedirection();
 
var webSocketOptions = new WebSocketOptions
{
    KeepAliveInterval = TimeSpan.FromMinutes(15)
};
app.UseWebSockets(webSocketOptions);
app.UseAuthorization();
app.MapControllers();
 
app.Run();
Код контролера
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
public class SocketController : Controller
    {
        [HttpGet("/ws")]
        public async Task Get()
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                await Socket(webSocket);
            }
            else
            {
             //   HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
            }
        }
        private async Task Socket(WebSocket webSocket)
        {
            try
            {
                var buffer = new byte[1024 * 4];
                var receiveResult = await webSocket.ReceiveAsync(
                    new ArraySegment<byte>(buffer), CancellationToken.None);
 
                while (!receiveResult.CloseStatus.HasValue)
                {
                    await webSocket.SendAsync(
                        new ArraySegment<byte>(buffer, 0, receiveResult.Count),
                        receiveResult.MessageType,
                        receiveResult.EndOfMessage,
                        CancellationToken.None);
 
                    receiveResult = await webSocket.ReceiveAsync(
                        new ArraySegment<byte>(buffer), CancellationToken.None);
                    await Task.Delay(10);
                }
                await webSocket.CloseAsync(
                    receiveResult.CloseStatus.Value,
                    receiveResult.CloseStatusDescription,
                    CancellationToken.None);
            }
            catch (Exception ex) 
            {
                string message = ex.Message.ToString();
               // webSocket.Abort();
            }
        }
    }
Код для проверки нагрузки на сервер или же просто подключение в многопотоке к серверу

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
using System.Net.WebSockets;
using System.Text;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
 
 
SemaphoreSlim _semaphore;
CancellationTokenSource _cancelToken;
CancellationTokenSource CancellationTokenSource = new();
Console.WriteLine("Start");
 
int thread = 1000;
_semaphore = new SemaphoreSlim(thread);
_cancelToken = new CancellationTokenSource();
 
var pool = new List<Task>(thread);
 
for (int i = 0; i < thread; i++)
{
    await _semaphore.WaitAsync().ConfigureAwait(false);
    int val = i;
    ClientWebSocket webSocketClient = new ClientWebSocket();
    CancellationToken cancellationToken = new();
    pool.Add(Task.Run(async () =>
    {
        await Socket(webSocketClient, cancellationToken, val);
        _semaphore.Release();
    }, _cancelToken.Token));
}
 
await Task.WhenAll(pool.ToArray()).ConfigureAwait(false);
Console.WriteLine("Done");
Console.ReadKey();
async Task Socket(ClientWebSocket webSocketClient, CancellationToken cancellationToken, int i)
{
    string error = "";
    try
    {
        await webSocketClient.ConnectAsync(new Uri("ws://localhost:5000/ws"), cancellationToken).ConfigureAwait(false);
        if (webSocketClient.State == WebSocketState.Open)
        {
            await Send(webSocketClient, i.ToString(), cancellationToken);
            await SocketNew(webSocketClient);
        }
    }
    catch (Exception ex)
    {
        error = ex.Message.ToString();
        Console.WriteLine("Ошибка подключения" + $" {error}");
        return;
    }
}
async Task Send(ClientWebSocket webSocketClient, string requestString, CancellationToken cancellationToken)
{
    var requestBytes = UTF8Encoding.UTF8.GetBytes(requestString);
    var subscribeRequest = new ArraySegment<byte>(requestBytes);
    await webSocketClient.SendAsync(subscribeRequest, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false);
}
async Task SocketNew(WebSocket webSocket)
{
    try
    {
        var buffer = new byte[1024 * 4];
        var receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        while (!receiveResult.CloseStatus.HasValue)
        {
            string message = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);
            Console.WriteLine("Ответ от сокета " + message + $" Поток: {Thread.CurrentThread.ManagedThreadId}");
            if (message != "")
            {
                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection closed", CancellationToken.None);
                return;
            }
            receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Ошибка при получение ответа");
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2023, 14:35
Ответы с готовыми решениями:

Реализация клиента для подключения к серверу на WebSocket
Добрый день. Есть сервер разработанный на c++. Сервер использует подлинный сертификат и работает в режиме wss (https). Написанный мной...

WebSocket. Ошибка при создании подключения
Здравствуйте! У меня есть веб приложение - video chat. Работает при помощи WebSockets. Сразу скажу не я писал, скачал отсюда...

Ошибка подключения к серверу
Скажите пожалуйста как убрать эту ошибку? ЗАГОЛОВОК: Соединение с сервером ------------------------------ Не удается подключиться...

14
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
12.06.2023, 23:37
Причину надо искать в InnerException
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
12.06.2023, 23:47  [ТС]
nicolas2008, мне кажется что проблема все таки в настройке кода у проекта asp net core к которому я подключаюсь.
InnerException
на стороне серверного приложения не вызываются исключения, нет ошибок.
на стороне клиента при подключение в 1000 потоков ошибка вызывается при подключение

C#
1
await webSocketClient.ConnectAsync(new Uri("ws://localhost:5000/ws"), cancellationToken).ConfigureAwait(false);
Добавлено через 4 минуты
Сообщение из StackTrace
Unable to connect to the remote server
at System.Net.WebSockets.WebSocketHandle.Co nnectAsync(Uri uri, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.ClientWebSocket.Co nnectAsyncCore(Uri uri, CancellationToken cancellationToken)
at Program.<>c__DisplayClass0_0.<<<Main>$>g __Socket|0>d.MoveNext() in D:\Project\Visul studio\Delete2\Delete2\Program.cs:line 42
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
12.06.2023, 23:51
xellan24rus, Сделайте var message = ex.ToString(). На стороне клиента конечно.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
12.06.2023, 23:57  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
ex.ToString()
Я получаю
Ошибка подключения System.Net.WebSockets.WebSocketException (0x80004005): Unable to connect to the remote server
---> System.Net.Http.HttpRequestException: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение. (localhost:5001)
---> System.Net.Sockets.SocketException (10061): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
at System.Net.Sockets.Socket.AwaitableSocke tAsyncEventArgs.ThrowException(SocketErr or error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocke tAsyncEventArgs.System.Threading.Tasks.S ources.IValueTaskSource.GetResult(Int16 token)
at System.Net.Sockets.Socket.<ConnectAsync> g__WaitForConnectWithCancellation|277_0( AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.Conne ctToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.HttpConnectionPool.Conne ctToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.Conne ctAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.Creat eHttp11ConnectionAsync(HttpRequestMessag e request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.AddHt tp11ConnectionAsync(HttpRequestMessage request)
at System.Threading.Tasks.TaskCompletionSou rceWithCancellation`1.WaitWithCancellati onAsync(CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHt tp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendW ithVersionDetectionAndRetryAsync(HttpReq uestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendA syncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsyn c(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.WebSockets.WebSocketHandle.Co nnectAsync(Uri uri, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.WebSocketHandle.Co nnectAsync(Uri uri, CancellationToken cancellationToken, ClientWebSocketOptions options)
at System.Net.WebSockets.ClientWebSocket.Co nnectAsyncCore(Uri uri, CancellationToken cancellationToken)
at Program.<>c__DisplayClass0_0.<<<Main>$>g __Socket|0>d.MoveNext() in D:\Project\Visul studio\Delete2\Delete2\Program.cs:line 43

Добавлено через 1 минуту
Как и написал выше проблема кроется на стороне серверного приложения. Код в вопросе весь написал. Весь день бьюсь над этим вопросом

Добавлено через 1 минуту
В 500 потоков подключается успешно, без ошибок
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
13.06.2023, 01:04
xellan24rus, какой результат если сделать паузу между подключениями?
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
13.06.2023, 01:20  [ТС]
nicolas2008, ошибки все равно есть, поставил задержку между подключениями 1 сек
Также запустил сканер подключений, на скриншоте видно что есть успешные подключения и сброшенные.
TIME_WAIT указывает, что локальная конечная точка (эта сторона) закрыла соединение.
https://skr.sh/sKIYoc72F5m?a

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

Добавлено через 9 минут
Вот что мне удалось найти в гугле, для статистки посчитал количество успешных подключений на сервере, число 632 из 1000

С какой то статьи текст
Из-за того, как работает TCP/IP, соединения не могут быть закрыты сразу. Пакеты могут выйти из строя или быть переданы повторно после того, как соединение было закрыто. CLOSE_WAIT указывает, что удаленная конечная точка (другая сторона соединения) закрыла соединение. TIME_WAIT указывает, что локальная конечная точка (эта сторона) закрыла соединение. Соединение поддерживается таким образом, что любые задержанные пакеты могут быть сопоставлены с соединением и обработаны соответствующим образом. Соединения будут удалены
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
13.06.2023, 01:47
xellan24rus, видать какие то системные лимиты... было подобное в реальном веб приложении. количество подключений не меряли, но симптомы похожие. И в SignalR и в gRPC Web... Пока ничего умнее не придумали чем повторять попытки подключения.
1
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
13.06.2023, 02:02  [ТС]
nicolas2008, я тоже склоняюсь к тому что это какие то системные лимиты, ограничения. Так как поиск вопроса я нигде не находил каких то настроек кода, чтобы оптимизировать сокеты, касательно SignalR с примерами от Майкрософт тоже нет каких то настроек тонких.

Однако я отключил в серверном приложение UseHttpsRedirection и количество подключений выросло, хотя ошибки всё равно есть. Вывод сделал только один надо на вдске разместить приложение и попробовать к ней подключиться за раз в 1000 потоков ради интереса, так как в реальном приложение количество одновременных подключений может быть точно больше 1000

Добавлено через 6 минут
Может кому то пригодится, общие ошибки подключения
0
Эксперт .NET
 Аватар для Usaga
14090 / 9308 / 1348
Регистрация: 21.01.2016
Сообщений: 34,959
14.06.2023, 13:10
Цитата Сообщение от xellan24rus Посмотреть сообщение
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseHttpsRedirection();
Странная связка. Если приложение настраивается для работы с reverse proxy, то нафига тут HTTPS Redirection, если HTTPS на себя может взять сам прокси?
1
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
14.06.2023, 13:43
разве проблема не в пулинге?
который надо настраивать на веб сервере
на иисе надо включать на серваке возможность работать с кучей подлючений
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
15.06.2023, 02:14  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Странная связка. Если приложение настраивается для работы с reverse proxy, то нафига тут HTTPS Redirection, если HTTPS на себя может взять сам прокси?
Хорошее замечание, я не так давно изучаю asp.net core, поэтому не всё изучил, только учусь)

Добавлено через 2 минуты
Цитата Сообщение от Dr9vik Посмотреть сообщение
разве проблема не в пулинге?
который надо настраивать на веб сервере
на иисе надо включать на серваке возможность работать с кучей подлючений
Принял, все таки это в студии какие то системные лимиты? В комментариях я писал что запускаю веб приложение в студии для теста, а другим приложением делаю нагрузку в виде подключений. Думаю если проект был бы запущен на реальном сервере, то с такой ошибкой я бы не столкнулся?

Добавлено через 1 минуту
Есть статьи или документация на примете где можно узнать про настройку, лимиты для работы с сокетами на сервере? В мсдн то что я находил, там мало информативности в основном базовые примеры только.
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
15.06.2023, 14:21
Цитата Сообщение от xellan24rus Посмотреть сообщение
Думаю если проект был бы запущен на реальном сервере, то с такой ошибкой я бы не столкнулся?
столкнулись бы
просто надо протокол включить
вдруг поможет
Цитата Сообщение от xellan24rus Посмотреть сообщение
Принял, все таки это в студии какие то системные лимиты?
про студию невкурсах, может есть какие то лимиты, как убрать не знаю
да и зачем? если надо уже готовое тестить в боевой обстановке
Миниатюры
Ошибка подключения к серверу WebSocket  
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
15.06.2023, 15:06  [ТС]
Цитата Сообщение от Dr9vik Посмотреть сообщение
просто надо протокол включить
вдруг поможет
Не помогло, а как вы настраиваете webcoket для работы в веб приложении?
0
Эксперт .NET
 Аватар для Usaga
14090 / 9308 / 1348
Регистрация: 21.01.2016
Сообщений: 34,959
16.06.2023, 04:23
Цитата Сообщение от xellan24rus Посмотреть сообщение
Принял, все таки это в студии какие то системные лимиты?
Студия - это IDE. Ты в ней разработку приложения ведёшь, но приложение в студии не хостится. Как приложение хостишь? В IIS?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2023, 04:23
Помогаю со студенческими работами здесь

Ошибка подключения к серверу 10060
порт 8080 при подключении клиента к серверу с лок. комп. все работает, адрес подключения 127.0.0.1, при подключении клиента к серверу...

Ошибка подключения к ФТП-серверу
Тут люди умные, не такие пепеги как я, может кто подскажет. История. Речь пойдет о структурном подразделении организации из другого...

Ошибка подключения к SQL серверу
Есть проблемка. Подключил проект windows form application к sql серверу, подключение прошло нормально, могу лазить по файлам сервера через...

Ошибка подключения клиента к серверу
На одном компе соединение устанавливается и все работает,но на разных, клиент не подключается и после некоторого ожидания уходит в catch. ...

Ошибка подключения к прокси-серверу
Здравствуйте, ув. мастера. В общем, установил я себе Денвер, и сразу столкнулся с проблемой - открывался только локалхост. Пока решал эту...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru