0

私は自分で使用するために、c# で簡単なローカル メッセンジャーを作成しました。今ではローカル ネットワーク (lan、wifi) で動作し、正常に動作します。今、私はそれを友人に渡してインターネット経由で使用したいのですが、ローカルホスト以外の別の IP を使用する方法がわかりません。

どんな助けにも感謝します。前もって感謝します。


    private void InitializeConnection()
    {

        ipAddr = IPAddress.Parse(txtIp.Text);
        tcpServer = new TcpClient();
        tcpServer.Connect(ipAddr, 1986);

        Connected = true;
        UserName = txtUser.Text;

        txtIp.Enabled = false;
        txtUser.Enabled = false;
        txtMessage.Enabled = true;
        btnSend.Enabled = true;
        btnConnect.Text = "Disconnect";

        swSender = new StreamWriter(tcpServer.GetStream());
        swSender.WriteLine(txtUser.Text);
        swSender.Flush();

        thrMessaging = new Thread(new ThreadStart(ReceiveMessages));
        thrMessaging.Start();
    }

これはクライアント部分です

    public ChatServer(IPAddress address)
    {
        ipAddress = address;
    }

    private Thread thrListener;

    private TcpListener tlsClient;

    bool ServRunning = false;

    public static void AddUser(TcpClient tcpUser, string strUsername)
    {
        ChatServer.htUsers.Add(strUsername, tcpUser);
        ChatServer.htConnections.Add(tcpUser, strUsername);

        SendAdminMessage(htConnections[tcpUser] + " has joined us");
    }

そしてこのサーバー部分。

4

1 に答える 1

3

はじめに

別のユーザーが自分のコンピューターに接続できるようにするには、やらなければならないことがたくさんあります。これでうまくいくはずですが、ネットワークは一般的に複雑になる可能性があり、すべてのネットワークが同じように動作するわけではありません。アクセスできるある種のルーターの背後でこれを実行していると思います。ネットワーキングは複雑であり、それがこの回答が非常に長い理由です (残りの部分を読んで疑問を呈している場合)。ほとんどの場合、それはかなり単純明快ですが、時間がかかる場合があります。

始める前に、次のことを確認してください。

予告

セキュリティについて考えると、コンピューターやネットワーク全般のほとんどすべてと同様に、「完全に安全」と呼ばれるものは実際にはありません (少なくとも私が知る限り)。ネットワークと同様に、ポートを開くことは完全に安全というわけではありません。私は一流のセキュリティ専門家ではありませんが、これを行うことで、他のコンピューターがあなたのコンピューターでデータを送受信できるようになります。これは、単純なテキスト チャットを行う場合には安全ですが、他の場合は同じではない可能性があります。SSH や FTP の処理など、より複雑で重要なケースでは、より多くのセキュリティが関与します。警告として、ネットワークや一般的なコンピュータをいじる際には注意してください。

入門

とにかく、(まだ怖がらせていない場合)チャットサーバーのようなものを機能させるために私が取らなければならなかった手順は次のとおりです。


ルーターのポートを転送する

最初に行う必要があるのは、ルーターのポートを転送または開くことです。これを行う前に、ネットワーキングについて理解しておく必要があることがいくつかあります。

基本的に、ルーターはコンピューターのネットワークをインターネットに接続し、ポートを介して接続できるようにするものです. ポートが何であるかを理解していない場合、それはインターネット接続を確立するために使用されるものであり、基本的に住所に対する番地のように機能します。それはその通りのどこに家があるかを示し、単なる通りの住所よりも具体的です。ネットワークに関して言えば、これは通信が行われている特定の場所を示す番号です。ポート番号 (「番地」) は、コンピュータの IP アドレス (「番地」) のどこに接続するかを示しています。

具体的には、ポート番号は 0 から 65535 までの範囲の 16 ビットの符号なし整数です (ただし、ポート番号 0 はWikipediaによると実際には使用できません)。これは 16 ビットの符号なし整数であり、C# ではaushortまたは a TcpClientまたはTcpListenerUInt16を使用して、代わりに標準または. また、ポートは通常、IP アドレスの後にコロン (" ") で示されますが、場合によっては異なる場合があります。これは IPv4 を使用していますが、まだ使用していない IPv6 もあります。intInt32:123.45.67.89:80

では、ポートの転送についてはどうでしょうか?なぜそれを行う必要があるのでしょうか? ポートの転送とは、ルーターの特定のポートへの接続を、代わりにルーターの背後にあるコンピューターに転送することです。ルーター会社によってこれを達成する方法が異なるため、これを行うための単純で直接的な方法が常にあるとは限りません。一般に、これを理解するには、Google で特定のルーターのポートを転送する方法を調べることができます。たとえば、「ルーター会社の名前のルーターでポートを転送する」を検索して見つけることができます。これを行うには、それを開始する前に、おそらくいくつかのことも必要になるでしょう。

  • ルーターの管理者ユーザー名とパスワードが必要になりますが、これは通常、接続に使用されるものではありません (おそらく使用すべきではありません)。それが何かわからない場合は、ルーターをセットアップした人なら誰でも知っているはずです。これが機能するようになったら、次に進む準備ができています。
  • また、ルーターのネットワーク内のコンピューターのアドレス指定に使用されるコンピューターのローカル IP アドレスも必要になるでしょう。これを見つけるには、ルーターがおそらくそれが何であるかを教えてくれますが、見つからないように見える場合に Windows で行う手順は次のとおりです。
    1. コマンドプロンプトを開く
      • Start >> Run...に移動するか、Win + Rを押して実行ダイアログを開きます
      • 入力cmdしてEnterキーを押します
    2. ipconfig入力してEnterキーを押して 実行し、コンピューターのIPアドレスを見つけます
      • ネットワーク インターフェイス接続のリストが表示されます。
      • 探しているものを見つけるには、ルーターを介してインターネットに接続するために使用しているネットワーク接続を見つける必要があります. おそらくコンピューターでは異なりますが、私の場合Wireless LAN adapter Wireless Network Connectionはラップトップを使用しているため、名前が付けられています。名前は、おそらくLANそれに含まれていると思います。
      • Media State . . . . . . . . . . . : Media disconnectedルーターに接続する必要があるため、これには以下がリストされているべきではありません。そうでない場合は、単にそうしてください。
      • 代わりに、IPv4 Address. . . . . . . . . . . :実際のコンピューターの IP アドレスが横にリストされている必要があります。これは、ポートを転送するコンピュータの IP アドレスです。もちろん、IPv6 を使用するルーターを使用している場合、これは異なる可能性があります。

また、これを行う過程で、使用していたポート番号が別のプロセスまたはサービスによって取得される可能性があります。これは問題なく、簡単に修正できます。ポート番号を変更するだけです。機能するものが見つかるまで、たとえば 8500 などの高い数値を試してください。その番号を取得したら、コード内のポート番号を更新するだけです。これをさらに簡単にするために、次のようにこれを格納する定数を使用する方がはるかに簡単です。

const int Port = 8500;

したがって、クライアントを次のように接続できます。

tcpClient.Connect(ipAddress, Port)

そして、サーバーにリッスンさせます

TcpListener tcpListener =  new TcpListener(ipAddress, Port);   

ポート番号などの他のグローバル変数と同様に、グローバル変数 classを作成することをお勧めしますが、同時に、スレッド化されたグローバル プロパティなどで使用すると、他の問題が発生する可能性があります。ただの提案と頭を上げてください。

ただし、ポートの転送を完了することができたら、友達を実際にサーバーに接続させるというより簡単な部分に進むことができます.


ルーターの IP アドレスを取得する

それをすべて実行できたら、ルーターを自分がやろうとしていたことと連携させるための実際の部分であるため、おそらく背中を軽くたたく必要があります. あとは、IP アドレス、ポート番号、そしてもちろんクライアント プログラムを友人に教えて、友人がサーバーに接続できるようにするだけです。ルーターのパブリック IP アドレスを取得するには、皮肉なことにhttp://www.whatismyip.com/という Web サイトにアクセスします。ここでパブリック IP アドレスを取得できますが、その下に「プロキシが検出されませんでした」と表示されていることも確認してください。プロキシを使用している場合は、それが何であるかを知っていて、IP アドレスを取得せずにインターネットに接続できることを願っています。(私を信じてください、あなたはしませんプロキシが今のところ必要であることを説明してほしい)

これを取得したら、その IP とポート番号を友人に送信する必要があります。賢明なことに、これを公に表示したくないのは、ランダムな人々がネットワークに侵入しようとするのを望まないからです。あなたの友人がそれを公に表示しない限り、IMまたは電子メールで送信することは(うまくいけば)問題ないはずです. そのため、IP アドレスを送信するときは、慎重に行ってください。

それが完了したら、実際にサーバーを起動することを忘れないでください! サーバーが実行されていないと、クライアントと通信して着信接続を受け入れる方法はありません。これにより、うっかり忘れてしまうことによるフラストレーションを大幅に軽減できます。


結論

うまくいけば、これはあなたがクールなチャットプログラムを作成し、その過程で他のいくつかのことを理解できるようにするのに役立ちます. これがそれほど長くないことを本当に願っていますが、ネットワーキングは実際にはほとんどの場合複雑です.

これがかなり役立つことを願っています!

于 2012-07-30T07:35:18.713 に答える