.net - 如何将 TCPListener 绑定(bind)到外部 IP 地址?

标签 .net wcf tcplistener internet-connection

我有一个客户端/服务器样式的应用程序,它使用 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 地址绑定(bind)。我不认为 10...* 地址是外部地址。

抛出异常的代码如下:

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

我不能为这个工作使用 TcpListener 吗?如果没有,还有哪些替代方案?实现这些替代方案有多容易。

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

最佳答案

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

  1. 在您的应用程序中使用 UPnP(通用即插即用)命令 到路由器打开选中的 港口。 UPnP 将不会启用 更安全的防火墙配置。

  2. (更复杂)使用TCP Hole punching建立一个 通过防火墙连接。

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

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

关于.net - 如何将 TCPListener 绑定(bind)到外部 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/975323/

相关文章:

c# - wcf web.config 文件

c# - 在 IIS 6 中托管 .net 4.0 REST WCF 服务

http - Web 服务器可以处理多少个套接字连接?

c# - 将 SSL 添加到 TcpListen 服务器?

c# - 使用 DataTable.Load() 而不创建所有列属性

.net - 在teamcity中构建nuget包

c# - 使用 .NET 在 Windows XP 中刻录 DVD 所需的基本 COM 组件是什么?

.net - 在 WPF 中实例化用户控件时 PresentationFramework.dll 中的 System.IO.IOException

.net - WCF:处理程序 "svc-ISAPI-4.0_32bit"有一个坏模块 "IsapiModule"

c# - 无法从远程机器连接