5

LAN の下で完全に動作するクライアント サーバー プログラムを 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

4 に答える 4

2

この場合:

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

ファイアウォールが正しく設定されている場合でも、クライアントコードに含まれているのはまさにそれであり、おそらく問題が存在する場所です。クライアントプログラムを変更して、IPを構成設定、コマンドラインパラメーター、テキストボックスなどとして取得し、代わりにそれを使用する必要があります。

最初に、サーバーを実行しているボックスのアドレスを使用して、可能であれば、同じLAN上の2台のコンピューターでこれをテストします。接続できない場合は、IPが正しいことを確認し(サーバーを実行しているマシンでipconfigを実行して)、サーバーでWindowsファイアウォールがオンになっているかどうかを確認します。そうである場合は、プログラムを許可するか、ポート3000を開く必要があります。

サーバーが接続されているネットワークの外部IPを使用して、別のネットワークから完全に機能していることが確認されたら。これは、http: //icanhazip.com/などにアクセスして(whatismyipよりも優先されます。広告はありません。IPアドレスのみが返されます)、ファイアウォール/ルーターのポート3000が転送されるように設定されていることを確認してください。サーバーボックスの内部IPに。

于 2012-10-03T01:12:15.357 に答える
2

以下に、発生する可能性のある一般的な問題をいくつか示します。

サーバ

  1. Windowsファイアウォール。
    • プログラムがファイアウォールを通過できるようにする方法に関するチュートリアルは次のとおりです
  2. ルーターでのポート転送。
    • http://portforward.com/は良いリソースです。ルーターを選択すると、その手順が表示されると思います。サーバーをホストしているマシンの LAN IP アドレスと、接続しようとしているポート (この場合は 3000) を選択する必要があります。

クライアント

クライアントの場合、正常に接続できるはずですが、サーバーの LAN IP アドレスではなく、外部 IP アドレスを指定する必要があります。サーバーをホストしているコンピューターでhttp://whatismyip.comにアクセスすると、それを見つけることができます。

--

Msn や同様のチャット プログラムは、このような単純なクライアント/サーバー アプローチを使用しています。これは非常に簡単に実現できます。ただし、非常に興味深いチャット プログラムは、Skype です。クライアント サーバーではなく、P2P システムを使用します。これは、Nat Hole Punching を使用して実現されます。(学生として) 興味がある場合は、ネットワーキングの知識を広げるために調べてみることをお勧めします。

于 2012-10-03T00:58:04.367 に答える
0

外部 NIC にバインドする必要があります。ループバック アダプターにバインドしている可能性があります

コードを提供していただければ、診断 (または修正) できるかもしれません

于 2012-10-03T00:46:19.957 に答える
-1

127.0.0.1次の場所で実際のIPアドレスに置き換える必要があります。

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

IPを取得するには、Googleの「whatis my ip」を使用するか、サーバーからwww.whatismyip.com/にアクセスします。

また、クライアントとサーバーの両方にWiresharkをインストールすることをお勧めします。このツールは、ソケットやその他のネットワークの問題をデバッグするときによく使用します。

于 2012-10-03T01:15:11.183 に答える