0

我正在尝试制作一个 winforms 客户端/服务器聊天应用程序。我已经有一个客户端和一个服务器,两者都工作正常,我可以登录,发送消息等。问题是它只有在我连接到我的本地 IP 时才有效。当我尝试使用我的外部 IP 运行程序时,我收到以下错误:

"The requested address is not valid in its context".

换句话说,我可以在自己的计算机上运行服务器,启动(例如)3 个客户端并让它们连接到正在运行的服务器。这基本上意味着我在自言自语。我想做的是在我的电脑上运行聊天服务器,让其他人运行客户端程序并通过互联网连接到服务器。

这是我输入外部 IP 时出错的部分:

public void StartListening()
    {

        // Get the IP of the first network device, however this can prove unreliable on certain configurations
        IPAddress ipaLocal = ipAddress;

        // Create the TCP listener object using the IP of the server and the specified port
        tlsClient = new TcpListener(ipaLocal, 50702);

        // Start the TCP listener and listen for connections
        tlsClient.Start(); <--- THINGS GO SOUTH HERE

        // The while loop will check for true in this before checking for connections
        ServRunning = true;

        // Start the new tread that hosts the listener
        thrListener = new Thread(KeepListening);
        thrListener.Start();
    }

我不确定我想做的事情是否可行?我无法想象它是,但我有点不知道如何进行。我是网络编程的新手,因此将不胜感激。

亲切的问候,简

4

2 回答 2

1

简,

我认为您的问题与您的 IP 地址设置有关。这是网络连接问题。您需要外部 IP 地址,以便外部客户端可以联系您的 PC。您需要更高级的网络。您的 ISP 提供的 IP 地址用于家庭用途。您需要专门的公共 IP 地址,以便客户端可以在防火墙之外找到您。这是网络/ISP/外部 IP 问题。

于 2012-05-12T17:45:12.277 回答
1

您的服务器应用程序需要在指定的本地安装的 NIC 上侦听指定端口上的传入连接。这就是为什么TcpListener总是需要使用本地IP 地址创建的原因:因为它只关心应该使用哪个 NIC(如果您安装了多个)。

MSDN 页面TcpListener也明确指出:

TcpListener 构造函数 (IPAddress, Int32) 初始化 TcpListener 类的新实例,该实例侦听指定本地IP 地址和端口号上的传入连接尝试。

外部 IP 地址与 TCP/IP 服务器完全无关。一路上您可以拥有许多路由器和网络设备,然后它们可以将传入的连接转发到您的机器。

只需确保您的防火墙和路由器配置正确,以允许指定端口上的传入连接。为此,请启动 TCP/IP 服务器以打开端口,然后使用CanYouSeeMe 之类的服务查看是否可以从外部访问服务器。

关于您的评论(这在某些配置上可能被证明是不可靠的),当您考虑它时,它显然是“不可靠的”:笔记本电脑可以很容易地拥有一个 IP 地址与 Wifi 网络适配器完全不同的以太网网络控制器。您的服务器应用程序应允许用户选择要使用的 IP 地址,而不是选择它获得的第一个地址。

于 2012-05-12T18:19:37.817 回答