2009-06-10 90 views
3

我有一个客户端/服务器风格的应用程序,使用WCF进行通信,这一切都很好。应用程序的一个功能是从客户机上获取文件到服务器上(中央控制)。如何将TCPListener绑定到外部IP地址?

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这份工作?如果不存在,还有什么替代方案,实施替代方案会有多容易。

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

+0

“外部”的定义根据上下文的不同而有很大的不同......但您是对的,10.0.0.1/8被指定为私有子网。 – 2009-06-10 12:47:48

回答

2

您的应用程序应该只绑定到机器上的内部IP地址。问题是防火墙不会通过端口转发自动将外部IP地址传递到内部IP地址。既然你不能轻易修改防火墙配置,有3种选择:

  1. 使用UPnP(通用即插即用N播放)从应用程序 到路由器上,打开所选 端口的命令。 UPnP将不会启用 更安全的防火墙配置。
  2. (更复杂)使用TCP Hole punching建立通过防火墙的 连接。
  3. 改变意义,以便客户端连接到服务器。服务器通过UPnP命令动态地打开一个端口,或者只在防火墙中打开一个端口块供这个应用程序使用。

    无论哪种情况,请确保WCF连接受到安全保护,以便其他人无法通过端口扫描来访问并在未经授权的情况下访问文件。

0

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

+0

可以通过WCF(服务模型)进行连接,并且可以进行连接,但在调用TcpListener.start方法时会出现问题。 – Hooloovoo 2009-06-10 12:53:29

+0

是的,我只是想确保你传递给TcpListener构造函数的IPEndpoint是一个在你的机器上有效的IPEndpoint。它应该是您的网络接口之一的IP或IPAddress.Any。 – heavyd 2009-06-10 12:59:25