2017-02-16 21 views
0

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

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

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

  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(); 
} 

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

ответ

1

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

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

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

(схема для транспорта способ выбор здесь: How does SignalR decide which transport method to be used?).

+0

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

+0

@TolgaEvcimen Я не уверен, как настроен ваш брандмауэр, но обычно брандмауэры блокируют входящие порты и, как правило, исходящие. В этом случае исходящие от вашего клиента на сервер –

+0

Эти клиенты являются исключительными клиентами, поэтому да брандмауэры настроены строго. –