C#套接字通过互联网

时间:2012-10-03 00:44:12

标签: c# sockets

嘿,伙计们我成功地在C#中使用C#完美地运行客户端服务器程序,我们使用了TcpListener和TcpSocket类。

我们无法让它在互联网上工作,我知道它与防火墙,路由器端口阻塞等有关。

我们转发了我们使用的端口并关闭了我们的防火墙但仍然没有运气。

为了使这项工作,我必须做些什么?就像某个使用的端口可以正常工作?怎么说“Msn Messenger”呢?

服务器代码:

  private static TcpListener serverTcpListener;

   public static bool Run()
    {
        // Initialize new thread for client communications
        Thread listenThread = new Thread(new ThreadStart(ListenForClients));

        // Initialize TCP listener and attempt to start
        ServerTcpListener = new TcpListener(IPAddress.Any, 3000);

        try
        {
            ServerTcpListener.Start();
        }
        catch (SocketException)
        {
            return false;
        }


        // Start client communications thread
        listenThread.Start();

        return true;
    }






    public static void ListenForClients()
    {
        while (true)
        {
            TcpClient client = ServerTcpListener.AcceptTcpClient();
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

客户代码:

    private TcpClient myClient;
    private NetworkStream clientStream;

   public InitializeResult Initialize()
    {
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

        try
        {
            MyClient.Connect(serverEndPoint);
        }
        catch (SocketException)
        {
            return InitializeResult.AccessError;
        }
        catch (ArgumentNullException)
        {
            return InitializeResult.NullRemote;
        }

        try
        {
            ClientStream = MyClient.GetStream();
        }
        catch (Exception)
        {
            return InitializeResult.StreamFail;
        }

        if (!Authenticate())
        {
            return InitializeResult.AuthenticateFail;
        }


        return InitializeResult.Success;

    }

4 个答案:

答案 0 :(得分:2)

以下是您可能遇到的一些常见问题:

服务器

  1. Windows防火墙。
  2. 路由器上的端口转发。
    • http://portforward.com/是一个很好的资源,我相信你可以选择你的路由器,它会为你提供相应的步骤。您需要选择托管服务器的计算机的LAN IP地址,以及您尝试连接的端口(在您的情况下为3000)。
  3. 客户端

    对于客户端,它应该能够正常连接,但您必须指定外部IP地址,而不是服务器的LAN IP地址。您可以通过访问托管服务器的计算机上的http://whatismyip.com找到它。

    -

    Msn和类似的聊天程序使用这样简单的客户端/服务器方法 - 非常容易实现。尽管如此,一个非常有趣的聊天程序是Skype。它使用P2P系统,而不是客户端服务器。它使用Nat Hole Punching完成它,如果你感兴趣(作为一名学生),我建议你去研究它以扩展你的网络知识。

答案 1 :(得分:2)

如果:

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

正是您的客户端代码中的内容,即使防火墙设置正确,也可能是问题所在。您必须修改客户端程序以将IP作为配置设置,命令行参数,文本框等,然后使用它。

我首先使用运行服务器的盒子的地址,在同一局域网上使用两台计算机进行测试。如果无法连接,请确保IP正确(通过在运行服务器的计算机上运行ipconfig),并查看服务器上是否启用了Windows防火墙。如果是,您将要么允许您的程序,要么只打开端口3000。

一旦确认工作,完全从另一个网络,使用网络的外部IP服务器开启。你可以通过转到http://icanhazip.com/或类似的方式来获得这个(我更喜欢这个,而不是广告,它只回送IP地址),并确保防火墙/路由器上的端口3000被设置为转发到内部服务器盒的IP。

答案 2 :(得分:0)

您需要绑定到外部NIC。有可能绑定到Loopback适配器

如果您提供一些代码,我们可能会诊断(甚至修复)

答案 3 :(得分:-1)

您需要将127.0.0.1替换为您的实际IP地址:

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

要获取您的IP,您可以使用Google“我的IP是什么”或从服务器转到www.whatismyip.com/

我还建议在客户端和服务器上安装Wireshark。我在调试套接字和其他网络问题时经常使用这个工具。