将 TcpClient 连接到远程 Tcp 服务器,绑定到特定的本地端口

Connect TcpClient to a remote Tcp server, binding to a specific local port

我为我的组织构建了 tcp client/server 应用程序。服务器打开并监听特定的端口,每个客户端与服务器端口建立Tcp连接。没什么特别的。该应用程序运行良好。但是今天,一位客户希望 Tcp 客户端应用程序能够在带有防火墙的 WiFi 网络上工作。默认情况下,WiFi 防火墙配置为阻止所有端口。如果我想让我的应用程序正常工作,我必须向他们的网络管理员提供一个端口列表,以便为我的应用程序打开。服务器侦听端口是可配置的,因此很容易。一旦我配置了端口,我就可以给他们这个服务器的特定端口。但是,客户端应用程序无法连接到服务器,因为每次 TcpClient 建立连接时,它都会创建一个随机的本地 Tcp 端口,该端口将被其防火墙阻止。

他们的网络管理员不会打开机器的所有端口,因为他们说这会给他们的组织带来安全风险。因此,我正在寻找一种方法来强制客户端在建立 Tcp 连接时打开特定的本地端口。我已经查看了 MSDN 文档并进行了谷歌搜索,但我没有找到足够的答案。您能否建议一个解决方法或可以做到这一点的第三方库?谢谢堆。

我不知道有什么方法可以使用 TcpClient 进行这种级别的控制。但是,如果您手动创建 Socket 对象,则可以绑定到您选择的本地端口:

var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Specify the local port to use
var endpoint = new IPEndPoint(IPAddress.Any, 9999);
sock.Bind(endpoint);
// And connect to the remote end point
sock.Connect("example.com", 80);

当然,通过这样做,您可以将自己限制在机器上的一个连接。

像这样使用 bind() 怎么样(如果你使用的是 c++)

struct sockaddr_in cli;
    memset(&cli, 0x00, sizeof(cli));
    cli.sin_family = AF_INET;
    cli.sin_port = htons(YOUR PORT);
    cli.sin_addr.s_addr = inet_addr(YOUR IP ADDRESS);

int on = 1;
if (setsockopt(hSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0){
    perror("Set Error");
}

bind(hSocket, (struct sockaddr *)&cli, sizeof(struct sockaddr)); 

int nRet = connect(hSocket,(sockaddr*)&svr, sizeof(svr));