3

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

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

这在本地测试时效果很好,但是当部署到我们的客户环境时,我开始遇到以下异常。

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 来完成这项工作?如果没有,还有哪些替代方案以及实施这些替代方案的难易程度。

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

4

2 回答 2

2

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

  1. 使用从应用程序到路由器的 UPnP(通用即插即用)命令打开所选端口。将不会启用 UPnP 以获得更安全的防火墙配置。

  2. (更复杂)使用TCP 打孔通过防火墙建立连接。

  3. 改变感觉,使客户端连接到服务器。服务器通过 UPnP 命令动态打开一个端口,或者只在防火墙中打开一个端口块供该应用程序使用。

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

于 2009-06-10T13:00:15.643 回答
0

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

于 2009-06-10T12:49:08.927 回答