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

本文关键字:绑定 连接 TcpClient 服务器 Tcp | 更新日期: 2023-09-27 17:57:27

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

他们的网络管理员不会为机器打开所有端口,因为他们说这会给他们的组织带来安全风险。因此,我正在寻找一种方法来强制客户端在建立Tcp连接时打开特定的本地端口。我查阅了MSDN文档并在谷歌上搜索过,但都没有找到合适的答案。你能建议一个变通方法或第三方库来做到这一点吗?非常感谢。

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

我不知道有任何方法可以对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));