В течение нескольких месяцев я не запускал разрабатываемое нами приложение .NET, которое в прошлый раз работало нормально.Тем временем я обновил свой компьютер до Windows 10 Pro 1809 (как и дома).
Сегодня я попытался запустить его, и он не работал должным образом.Я отладил его и сузил до исключения после попытки кода запустить сервер TCP на настраиваемом порту, который по умолчанию 2000
.
Исключением является следующее:
System.Net.Sockets.SocketException (0x80004005): An attempt was made to access a socket in a way forbidden by its access permissions
Выдается при выполнении этого кода:
listener = new TcpListener("127.0.0.1", 2000);
listener.Start();
Я сделал обычные диагностические шаги, но безрезультатно:
- Что-нибудь ужепрослушивание этого порта
- Отключение брандмауэра
- Повторное включение брандмауэра, затем удаление правил, окружающих приложение и рассматриваемый порт
- Включение ведения журнала брандмауэра, чтобы увидеть, есть ли какие-либо доказательстваон отвергает
Поэтому я быстро тестирую то же самое в сценарии PowerShell:
$port = 2000
$listener = new-object System.Net.Sockets.TcpListener ("127.0.0.1", $port)
try
{
$listener.start()
Write-Output "Successfully opened port $port"
}
catch
{
Write-Error $_
}
finally
{
$listener.Stop()
}
И получаю почти то же исключение: Exception calling "Start" with "0" argument(s): "An attempt was made to access a socket in a
way forbidden by its access permissions"
ДалееЯ решил изменить порт на 3000
, и он работает нормально.
Затем я адаптирую скрипт для циклического переключения между портами с 1
до 2500
и получаю кучу сбоев, включая диапазоны от 1657
до 2156
и 2179
до 2279
.
Куда пойти дальше, чтобы найти основную причину?Какой механизм может использовать Windows, чтобы отклонить попытку привязки (?)?
UPDATE
Попробовал это приложение C #, и я получил тот же результат:
namespace TcpBindTest
{
using System.Net;
using System.Net.Sockets;
class Program
{
static void Main(string[] args)
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(new IPAddress(new byte[]{127, 0, 0, 1}), 2000);
listener.Bind(endpoint);
listener.Listen(1);
}
}
}