1

ログオフするのを忘れた場合に備えて、特定のアプリを使用してスマートフォンを使用してログオフできるラップトップ用のアプリケーションを作成しようとしています。だから私は通常、あなたがルーターを持っているかどうかを考えていました...あなたが使用できる外部IPとポートを持っていないという問題があります。そのために、この関数を使用して外部 IP を取得しました。

        public string adresaIP()
    {
        UTF8Encoding utf8 = new UTF8Encoding();
        WebClient clientWeb = new WebClient();
        String adresaIP = utf8.GetString(clientWeb.DownloadData("http://bot.whatismyipaddress.com"));
        return adresaIP;
    }

しかし、IpEndPoint を使用しようとすると、機能しません。例外エラーが発生し、間違っていたかどうかわかりません。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;


namespace bluetooth_LogOff
{
public partial class Form1 : Form
{
    static byte[] buffer { get; set; }
    static Socket soket;


    public Form1()
    {
        InitializeComponent();
        try
        {
            string ip = adresaIP();

            soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //soket.Bind(new IPEndPoint(IPAddress.Parse(ip),1234)); <<-- in this way dosen't work 

            soket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),1234)); // <<- in this way it works....
            soket.Listen(100);


            Socket accept = soket.Accept();
            buffer = new byte[accept.SendBufferSize];
            int bytesRead = accept.Receive(buffer);
            byte[] format = new byte[bytesRead];
            for (int i = 0; i < bytesRead; i++)
            {
                format[i] = buffer[i];
            }
            string primescMesaj = Encoding.ASCII.GetString(format);
            MessageBox.Show(primescMesaj);
            soket.Close();
            accept.Close();



        }
        catch (Exception messaj)
        {
            MessageBox.Show(messaj.ToString());

        }


    }

    private void button1_Click(object sender, EventArgs e)
    {

        label1.Text = adresaIP();





    }
    public string adresaIP()
    {
        UTF8Encoding utf8 = new UTF8Encoding();
        WebClient clientWeb = new WebClient();
        String adresaIP =    `utf8.GetString(clientWeb.DownloadData("http://bot.whatismyipaddress.com"));`
        return adresaIP;
    }
}

}

しかし、面白いことに、「127.0.0.1」のようにアドレスを入力すると機能しますが、文字列アドレスを入力すると機能しません

4

1 に答える 1

3

アドレスがルーターに属する外部アドレスにバインドすることはできません。

ラップトップのアドレス 0.0.0.0 (すべてのアドレス) にバインドし、ラップトップ ポートを転送する (または UPnP を使用する) ようにルーターを構成する必要があります。

ラップトップに直接アクセスできない理由は、ほとんどのルーターと同様にルーターが NAT (ネットワーク アドレス変換) ルーターであるためです。これにより、複数のコンピューターが単一の IP アドレスの背後に隠れることができます。したがって、ルーターにはパブリック IP アドレスが割り当てられ、ルーターの背後にあるラップトップやその他のデバイスにはプライベート IP アドレス (192.168.xx の範囲内のものなど) が割り当てられます。

ほとんどの NAT ルーターは、静的ポート転送で構成できます。つまり、特定のプライベート アドレスのポートは、パブリック IP の同じポートまたは別のポートに反映されます。これにより、パブリック インターネットから内部デバイスにアクセスできます。UPnP は同じことを行うプロトコルですが、ルーターを手動で構成する必要はありません。通常、UPnP は、P2P アプリケーションや一部のマルチプレイヤー ゲームが、人間の介入なしにパブリック アクセス可能なポートを取得する方法です。また、コンピューターの所有者がそのような転送を認識していない可能性があるため、UPnP がセキュリティ上の危険と見なされる可能性がある理由でもあります。

于 2013-03-29T11:01:31.887 に答える