NikFaraday
@NikFaraday
Student full-stack Developer

Как реализовать TcpLister, который будет ожидать запроса?

Здравствуйте!

Для своего asp.net web api нужно добавить Tcp сервер, который будет работать на заднем фоне как BackgroundService. Проблемы в самом сервисе нет, вопрос заключается в создании Tcp слушателя, который будет работать в режиме ожидания аналогично эндпоинтам контроллеров на web api.

Мне не нравится вот такой вариант:
while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine("Waiting for a connection...");
            TcpClient client = await _listener.AcceptTcpClientAsync();

            if (client != null)
            {
                Console.WriteLine("Connected!");
                _ = HandleClientAsync(client, stoppingToken);
            }
        }


И вот такой вариант:
private async void AcceptClientAsync()
    {
        try
        {
            TcpClient client = await _listener.AcceptTcpClientAsync();
            Console.WriteLine("Connected!");

            _ = HandleClientAsync(client);

            AcceptClientAsync();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Exception: {ex.Message}");
        }
    }


Есть ли лучшие варианты кроме этих, что бы поставить TcpListener в режим ожидания?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
А зачем вообще использовать TcpLister
Используйте класс Socket
void Init()
{
   listener = new Socket(loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
   listener.Bind(localEndPoint);
   listener.Listen(10);
   listener.BeginAccept(OnBeginAsyncCallback, this);
}
private void OnBeginAsyncCallback(IAsyncResult asyncResult)
{
   var clientSocket = listener.EndAccept(asyncResult);
   listener.BeginAccept(OnBeginAsyncCallback, this);
   // ...
}

Будет реально асинхронно и еще на портах ввода-вывода
Ответ написан
@mvv-rus
Настоящий админ AD и ненастоящий программист
Зависит от того, чего вы хотите.
Если вас устраивает, что задача, выполняющая HandleClientAsync для подключившегося клиента будет брошена на произвол судьбы, можно использовать оба варианта (но первый мне нравится больше). Если вы хотите узнать, чем она закончилась - надо делать по-друому.
PS См. также комментарии к вопросу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы