0

TcpClient とソケットを使用して P2P チャット アプリケーションに取り組んでいます。

tcpclient を受け入れるために、次のコードを作成しました。

IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress ip_local = Dns.GetHostAddresses(Dns.GetHostName())[0];
// IPAddress ip_local = IPAddress.Parse(ip_local);
TcpListener tcpl = new TcpListener(new IPEndPoint(ip_local, 9277));
while (true)
{
    try
    {
        tcpl.Start();
        TcpClient tcpClient = tcpl.AcceptTcpClient();
        StateObject state = new StateObject();
        state.workSocket = tcpClient.Client;
        tcpClient.Client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(OnReceive), state);
    }
    catch (Exception ex)
    {

    }
}

問題は、[1 つの LAN と 2 つの VMWARE ネットワークがあるため] 毎回異なるネットワークを選択することです。問題は、LAN、つまり特定のネットワークのネットワーク アドレスを強制的に取得する方法です。

4

3 に答える 3

0

DNSホスト名からローカルIPアドレスを取得しています。問題は、一方または両方が(ただし順番に)アドレスをホスト名として自動的に登録している可能性があります。いくつかのオプションがあります。1)正しいアドレスを指すようにDNSホスト名を変更します。2)具体的にアドレスを取得します。関数GetHostAddressesは、パラメーターまたはホスト名としてIPアドレスを取得します。

于 2012-04-09T05:43:37.687 に答える
0

使用しないことを推奨し、より徹底的なアプローチを提供するこの回答を見てください。Dns.GetHostAddresses

確かではありませんが、 System.Net.NetworkInformation.IPInterfacePropertiesがここで興味深いと思います。

于 2012-04-09T05:44:15.840 に答える
0

したがって、これは、すでに行っているように、正しい localIP を検出して TcpListener コンストラクターにも渡す方法に関するものです。

TcpListener tcpl = new TcpListener(new IPEndPoint(ip_local, 9277));

これは、オープンソースのネットワーク フレームワークであるnetworkComms.netで解決した特に重要な問題でした。ここの80 行目の LocalIP の Getter を見ると、いくつかの方法があります。

  1. 既知の外部 IP に ping を実行し、OS によって選択されたネットワーク アダプターを使用します (iphlpapi.dll を使用するため、Windows のみがサポートされます)。
  2. NetworkInterface.GetAllNetworkInterfaces() を使用してすべての既知の IP アダプターを検索し、192.* などの指定されたプレフィックスに IP が一致するものを選択します。

networkComms.net の使用方法の基本的な 11 の例も興味深いかもしれませ

于 2012-04-09T13:24:05.717 に答える