SignalR 接收端口是随机的还是可以预定义的?

Is SignalR receive port random or can be predefined?

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

注意:我无法模拟客户端环境,因此我什至不确定这是否会成为问题,但我不想感到惊讶在我们安装客户端的时候,因为客户已经指出了这个需求。

常规 TCP/IP 通信从随机(或至少不是固定的)源端口进行。这是因为你不能有多个 clientip:sourceport-serverip:destport 组合,所以 TCP 实现将保留一个已使用的本地端口列表,并在建立新连接时选择一个未使用的端口。

您可以选择 .NET TcpClient constructor overload 的源端口,但如果该源端口已被使用,您的应用程序将 运行 出现问题。

由于 SignalR 会自动检测是否使用 Websockets、http 长轮询或其他传输机制,我认为您无法为此设置源端口。

(传输方式选择图在此:How does SignalR decide which transport method to be used?)。