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

时间:2016-07-18 02:31:51

标签: c# sockets tcp tcpclient

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

他们的网络管理员不会打开该机器的所有端口,因为他们说这会给他们的组织带来安全风险。因此,我正在寻找一种方法来强制客户端在建立Tcp连接时打开特定的本地端口。我都看过MSDN文档并一直在谷歌搜索,但我还没有找到足够的答案。您是否可以建议可以执行此操作的变通方法或第三方库?谢谢堆。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如何像这样使用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));