我有一个客户端/服务器风格的应用程序,它使用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?如果没有,有什么替代方案,实施替代方案有多容易。
请记住,我们无法直接访问防火墙配置,并且可能需要数周时间才能实施更改。
答案 0 :(得分:2)
您的应用程序应仅绑定到计算机上的内部IP地址。问题是防火墙不会通过端口转发自动将外部IP地址传递到内部IP地址。由于您无法轻松修改防火墙配置,因此有3种选择:
更改意义,以便客户端连接到服务器。服务器通过UPnP命令动态打开端口,或者只在防火墙中打开一个端口块供该应用程序使用。
对于任何一种情况,请确保WCF连接受到安全保护,以便其他任何人无法通过端口扫描进入,并在未经授权的情况下访问这些文件。
答案 1 :(得分:0)
当您尝试绑定到计算机上无效的地址时,通常会发生该异常。您尝试绑定的IP是否已分配给计算机上的某个网络接口?