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;
    }

但是当我尝试使用 te 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 回答