Мне удалось написать сервер веб-сокетов csharp, и клиенты могут подключаться, однако клиенты отправляют сообщение ping, но сервер не отвечает Pong, поэтому клиент разрывает соединение. p>
При дальнейшем расследовании выяснилось, что мне нужно запустить ReadAsync, чтобы перехватить сообщение ping, но тогда он находится в состоянии ожидания, поэтому все блокируется!
Мне бы хотелось получить доступ к базовому сокету, чтобы можно было выполнить команду socket.available для проверки считанных данных, но это невозможно.
Итак, как же это происходит? вы должны написать сервер веб-сокетов на C# (и не говорите SignalR!), который отвечает на пинг и может определить, упал ли клиент!
using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;
class Program
{
static async Task ClientHandler(HttpContext context)
{
using WebSocket socket = await context.WebSockets.AcceptWebSocketAsync();
Console.WriteLine("Websocket client connected from {0}", socket.SubProtocol);
var buffer = new byte[1024 * 4];
WebSocketReceiveResult payload = await socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
string? message = Encoding.UTF8.GetString(buffer);
Console.WriteLine("Received {0}", message);
// workaround for replying to ping from client which requires ReceiveAsync to be active
// Task.Run(async () =>
// {
// await socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
// });
while (socket.State == WebSocketState.Open)
{
Console.WriteLine("Sending message...");
byte[] msg = System.Text.Encoding.Default.GetBytes("Hello, World!");
await socket.SendAsync(new ArraySegment(msg, 0, msg.Length), payload.MessageType, true, CancellationToken.None);
Thread.Sleep(200);
}
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "No more messages", CancellationToken.None);
Console.WriteLine("Connection closed");
}
static void Main()
{
var app = WebApplication.CreateBuilder().Build();
app.UseWebSockets();
app.Use(async (context, next) =>
{
if (context.Request.Path == "/")
if (context.WebSockets.IsWebSocketRequest)
await ClientHandler(context);
else
context.Response.StatusCode = StatusCodes.Status400BadRequest;
else
await next(context);
});
app.Run("http://127.0.0.1:8001");
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... g-to-pings
Сервер C# WebSocket не отвечает на пинги ⇐ C#
Место общения программистов C#
1719422296
Anonymous
Мне удалось написать сервер веб-сокетов csharp, и клиенты могут подключаться, однако клиенты отправляют сообщение ping, но сервер не отвечает Pong, поэтому клиент разрывает соединение. p>
При дальнейшем расследовании выяснилось, что мне нужно запустить ReadAsync, чтобы перехватить сообщение ping, но тогда он находится в состоянии ожидания, поэтому все блокируется!
Мне бы хотелось получить доступ к базовому сокету, чтобы можно было выполнить команду socket.available для проверки считанных данных, но это невозможно.
Итак, как же это происходит? вы должны написать сервер веб-сокетов на C# (и не говорите SignalR!), который отвечает на пинг и может определить, упал ли клиент!
using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;
class Program
{
static async Task ClientHandler(HttpContext context)
{
using WebSocket socket = await context.WebSockets.AcceptWebSocketAsync();
Console.WriteLine("Websocket client connected from {0}", socket.SubProtocol);
var buffer = new byte[1024 * 4];
WebSocketReceiveResult payload = await socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
string? message = Encoding.UTF8.GetString(buffer);
Console.WriteLine("Received {0}", message);
// workaround for replying to ping from client which requires ReceiveAsync to be active
// Task.Run(async () =>
// {
// await socket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
// });
while (socket.State == WebSocketState.Open)
{
Console.WriteLine("Sending message...");
byte[] msg = System.Text.Encoding.Default.GetBytes("Hello, World!");
await socket.SendAsync(new ArraySegment(msg, 0, msg.Length), payload.MessageType, true, CancellationToken.None);
Thread.Sleep(200);
}
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "No more messages", CancellationToken.None);
Console.WriteLine("Connection closed");
}
static void Main()
{
var app = WebApplication.CreateBuilder().Build();
app.UseWebSockets();
app.Use(async (context, next) =>
{
if (context.Request.Path == "/")
if (context.WebSockets.IsWebSocketRequest)
await ClientHandler(context);
else
context.Response.StatusCode = StatusCodes.Status400BadRequest;
else
await next(context);
});
app.Run("http://127.0.0.1:8001");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78673823/c-sharp-websocket-server-not-responding-to-pings[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия