gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:37:12 28 4
gpt4 key购买 nike

我有一个客户端/服务器样式的应用程序,它使用 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 Holepunching建立一个通过防火墙连接。

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

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com