如何将TCPListener绑定到外部IP地址?

时间:2009-06-10 12:43:15

标签: .net wcf tcplistener internet-connection

我有一个客户端/服务器风格的应用程序,它使用WCF进行通信,这一切都很有效。该应用程序的一个功能是将文件从客户端计算机获取到服务器上(中央控制)。

Central Control请求客户端上指定文件夹中的文件列表,并使用套接字打开一个端口,以便客户端连接并流式传输每个文件。它为每个文件使用不同的端口号。

这在本地测试时工作正常,但在部署到我们的客户环境时,我开始遇到以下异常。

The requested address is not valid in its context
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at System.Net.Sockets.TcpListener.Start(Int32 backlog)
   at System.Net.Sockets.TcpListener.Start()
   at AMIGA.Library.TransferFile.listenerThread()

终点的IP地址是10. 。*地址。我搜索了一个答案,普遍的共识是tcpListener不能与外部IP地址绑定。我不认为10. 。*地址是外部的。

抛出异常的代码如下:

tcpListener = New TcpListener(IEndPoint)
Dim handlerSocket As Socket
Dim thdHandler As Thread
tcpListener.Start()
RequestFile()

我是否无法为此作业使用TcpListener?如果没有,有什么替代方案,实施替代方案有多容易。

请记住,我们无法直接访问防火墙配置,并且可能需要数周时间才能实施更改。

2 个答案:

答案 0 :(得分:2)

您的应用程序应仅绑定到计算机上的内部IP地址。问题是防火墙不会通过端口转发自动将外部IP地址传递到内部IP地址。由于您无法轻松修改防火墙配置,因此有3种选择:

  1. 使用应用程序中的UPnP(Universal Plug N Play)命令 到路由器打开选中的 港口。 UPnP将无法启用 更安全的防火墙配置。
  2. (更复杂)使用TCP Hole punching建立 通过防火墙连接。
  3. 更改意义,以便客户端连接到服务器。服务器通过UPnP命令动态打开端口,或者只在防火墙中打开一个端口块供该应用程序使用。

    对于任何一种情况,请确保WCF连接受到安全保护,以便其他任何人无法通过端口扫描进入,并在未经授权的情况下访问这些文件。

答案 1 :(得分:0)

当您尝试绑定到计算机上无效的地址时,通常会发生该异常。您尝试绑定的IP是否已分配给计算机上的某个网络接口?