Leonid Kazakov Ответов: 1

C# как закрыть соединения, перечисленные в tcpconnectioninformation


Я создаю список подключений с помощью TcpConnectionInformation, после чего нахожу в этом списке адрес, который используется в моей программе внешним IP-адресом Поля remoteendpoint Какая команда используется для закрытия найденного соединения? Эта задача аналогична программе Russinovich TCPView.

private void ClearConnection()
{
  IPGlobalProperties IPGproperties = IPGlobalProperties.GetIPGlobalProperties();
  TcpConnectionInformation[] connections = IPGproperties.GetActiveTcpConnections();
  foreach (TcpConnectionInformation tcp in connections)
  {
    if (IP_Address.Equals(tcp.RemoteEndPoint.ToString()))
    {
	// What to write to close the found connection?
    }	
  }
}


Что я уже пробовал:

Я нашел похожий вопрос с решением, которое не действовать.
private void ClearConnection()
{
  IPGlobalProperties IPGproperties =
                            IPGlobalProperties.GetIPGlobalProperties();
  TcpConnectionInformation[] connections =
                            IPGproperties.GetActiveTcpConnections();
  foreach (TcpConnectionInformation tcp in connections)
  {
    if (IP_Address.Equals(tcp.RemoteEndPoint.ToString()))
    {
      Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
                          ProtocolType.Tcp);
      try
      {
        mySocket.Bind(tcp.LocalEndPoint);
        mySocket.Shutdown(SocketShutdown.Both);
      }
      catch (Exception ex) {}
      finally
      {
        mySocket.Close();
      }
    }	
  }
}

Dave Kreskowiak

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

Gerry Schmitz

То, что сказал Дэйв.

Afzaal Ahmad Zeeshan

Почему вы не можете закрыть соединения внутри вашего приложения до того, как оно завершится?

Leonid Kazakov

Я использую Telegram API
https://github.com/telegramdesktop/tdesktop

Сайт webproxy сайт webproxy = новый сайт webproxy(telegramProxy, правда);
TelegramBotClient Bot = новый TelegramBotClient(telegramToken, webProxy);
Эти две команды создают 2 соединения.

Я хочу отключиться от бота. Я выполняю код.

Бот.StopReceiving();
Бот.SetWebhookAsync("");
Bot = null;
сайт webproxy = нуль;

В результате остается одно соединение. При повторном выполнении кода.

сайт webproxy = новый сайт webproxy(telegramProxy, правда);
Бот = новый TelegramBotClient(telegramToken, webProxy);

2 соединения создаются снова. При 3 циклах включения и выключения уже создано 3 неполных соединения. Часто Telegam считает это нарушением и запрещает подключение. Чтобы решить эту проблему, закройте приложение, чтобы сборщик мусора закрыл все соединения.

Afzaal Ahmad Zeeshan

Так что, оставляя его на сборке мусора, обычно не работает. Одна вещь, которую вы можете сделать, - это использовать это внутри блока using, чтобы приложение очищало ресурсы до того, как оно закроется.

Dave Kreskowiak

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

В этом заключается проблема с использованием библиотек с GitHub, которые не имеют прикрепленных к ним форумов поддержки. Вы, по сути, сами по себе и должны сами во всем разбираться и, возможно, даже исправлять ошибки в проекте.

1 Ответов

Рейтинг:
11

Leonid Kazakov

Прежде всего посетите
CurrPorts: мониторинг сетевых подключений TCP/IP в Windows
и скачать программу CurrPorts. Похоже, что C # не может решить проблему закрытия порта. Мы будем использовать утилиту:

private void ClearConnection()
{
  string programma = Directory.GetCurrentDirectory() + "\\cports.exe";
  string programmParam = "/close * * ";
  IPGlobalProperties IPGproperties = IPGlobalProperties.GetIPGlobalProperties();
  TcpConnectionInformation[] connections = IPGproperties.GetActiveTcpConnections();
  foreach (TcpConnectionInformation tcp in connections)
  {
    if (IP_Address.Equals(tcp.RemoteEndPoint.ToString()))
    {
      string[] parameters = tcp.RemoteEndPoint.ToString().Split(':');
      programmParam = "/close * * " + parameters[0] + " " + parameters[1];
      Process.Start(programma, programmParam);
    }
  }
}

Внимание! Этот код должен быть запущен от имени администратора, чтобы были права на удаление соединения.


Dave Kreskowiak

Таким образом, вы используете внешнюю утилиту для "принудительного закрытия" соединения в своем собственном приложении. Удачи вам в поддержке этого, когда ваше приложение таинственно выходит из строя.

Решение состоит не в том, чтобы "принудительно закрыть" связи. У вас есть два возможных правильных решения. Первый - изучить библиотеку, которую вы используете, понять, как она работает, а затем правильно закрыть соединения.

Второе решение состоит в том, чтобы найти другую библиотеку, которая делает то же самое, что вам нужно, и поддерживается, когда вы сталкиваетесь с проблемами.

Leonid Kazakov

Дорогая, я просил решения проблемы, а не очевидных инструкций.

Dave Kreskowiak

Поскольку я никогда не пользовался библиотекой, я не могу этого сделать.

Очень маловероятно, что кто-то еще, кто отвечает на вопросы здесь, тоже знает, по той же причине.

Ваш лучший источник информации о том, как пользоваться библиотекой, - это люди, которые ее написали!