Является ли порт приема SignalR случайным или может быть предопределен?

Я использую концентратор SignalR в качестве собственного хостинга в службе Windows. Есть winforms клиентов, которые разговаривают с хабом. Сервер работает на 80 порту и работает нормально.

Мне интересно, на какой порт клиент отправляет или получает сообщения?

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

  1. Правильно ли я так думаю?
  2. Как я могу создать соединение на стороне клиента, чтобы клиентский порт всегда был одинаковым?

Вот мой клиентский код:

IHubProxy _TextCopierHub;
HubConnection _HubConnection { get; set; }

public TextCopierHub ( string url )
{
    _HubConnection = new HubConnection(url);
    _TextCopierHub = _HubConnection.CreateHubProxy("TextCopierHub");
    _HubConnection.Credentials = CredentialCache.DefaultCredentials;

    if ( !_HubConnection.Start().Wait(10000) )
        throw new TimeoutException("Hub didn't start in 10 seconds");

    RegisterEvents();
}

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


person Tolga Evcimen    schedule 16.02.2017    source источник


Ответы (1)


Обычные соединения TCP/IP осуществляются со случайного (или, по крайней мере, не фиксированного) исходного порта. Это связано с тем, что у вас не может быть нескольких комбинаций clientip:sourceport-serverip:destport, поэтому реализация TCP будет хранить список используемых локальных портов и выбирать неиспользуемый порт при установлении нового соединения.

Вы можете выбрать исходный порт в конструкторе .NET TcpClient перегрузить, но ваше приложение столкнется с проблемами, если этот исходный порт уже используется.

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

(Схема выбора метода транспортировки здесь: Как SignalR решает какой способ транспортировки использовать?).

person RasmusW    schedule 17.02.2017
comment
Итак, вы говорите, что это происходит автоматически и не может быть обработано явно. Затем, скажем, все порты закрыты в брандмауэре, кроме нескольких, сможет ли он найти и выбрать один из этих доступных портов и работать? Или случайно выйдет из строя? - person Tolga Evcimen; 17.02.2017
comment
@TolgaEvcimen Я не уверен, как настроен ваш брандмауэр, но обычно брандмауэры блокируют входящие порты и реже исходящие. В этом случае исходящий от вашего клиента на сервер - person Oscar Siauw; 17.02.2017
comment
Эти клиенты являются исключительными клиентами, поэтому да, брандмауэры настроены строго. - person Tolga Evcimen; 17.02.2017
comment
В этом случае никакие стандартные приложения Windows не будут работать на их клиентских ПК. Вы не можете заставить все приложения использовать предопределенные исходные порты. Но я думаю, вы это уже знаете. - person RasmusW; 17.02.2017
comment
Нет, я этого не знал. На самом деле это одна часть вопроса. Можете ли вы направить меня к официальной документации, которую я могу использовать в качестве доказательства? - person Tolga Evcimen; 17.02.2017
comment
Я не знаю какой-либо официальной документации, но ознакомьтесь с заголовком security.stackexchange.com/questions/55747/ и этот ответ serverfault. com/a/627889. Вы не можете заставить все приложения использовать определенный исходный порт, поэтому ограничение всего исходящего трафика по исходному порту неудобно, сложно или невозможно. - person RasmusW; 20.02.2017