检查我的ip与以前的ip相比是否唯一
本文关键字:ip 是否 唯一 我的 检查 | 更新日期: 2023-09-27 17:58:09
我做了一个简单的应用程序来检查我的ip。想法是:
1)如果我点击一个按钮,应用程序将检查我的ip并与以前的ips 进行比较
2)如果我的新ip和以前一样,什么都不做
3)如果我的新ip与以前不同,并且我以前从未使用过此ip,则递增unique
并添加到dataGridRow1
新行
4)如果我的新ip是我的默认ip增量my_ip
5)如果我的新ip与以前不同,但我在递增duplicate
并添加到dataGridRow1
新行之前已被分配到此ip
6)每个包含重复ip的dataGrid1
BackColor行都是红色的。如果它包含默认ip,它是绿色的
好的,让我们进入代码:
全局变量:
string old_ip = "";
string new_ip = "";
int new_row = 0; //new added row position
int duplicate = 0;
int my_ip = 0;
int unique = 0;
延迟功能
public void MyDelad(int milliseconds)
{
Stopwatch stopwatch = Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds <= (long)milliseconds)
{
Application.DoEvents();
}
}
按钮点击事件
MyDelad(500);
while (true) //force obtain new_ip
{
try
{
new_ip = new System.Net.WebClient().DownloadString("https://api.ipify.org");
}
catch
{
MyDelad(500);
continue;
}
break;
}
if (old_ip != new_ip) //compare old and new ip
{
unique++;
dataGridView1.Rows.Add(new_ip);
if (new_ip == "121.464.544.122") //if new ip is my default
{
my_ip++;
unique--; //if it's default ip instead of unique
dataGridView1.Rows[new_row].Cells[0].Style.BackColor = System.Drawing.Color.Green;
}
else //check every row if ip existed before
{
for (int x = 0; x < dataGridView1.Rows.Count - 2; x++) //check from first to penultimate row
{
if (dataGridView1.Rows[x].Cells[0].Value.ToString() == new_ip.ToString())
{
duplicate++;
}
}
}
new_row++; //increment new added row position
}
old_ip = new_ip;
}
我的第一个问题是:我听说使用全局变量是错误的。但是,如果我在button_click
事件中使用局部变量,它将在每次单击按钮后重置变量的值(例如存储unique
值的变量)。那么我应该使用全局变量吗?
第二个问题:我可以用另一种方式存储unique
值吗?现在它正在增加unique
值,如果是old_ip != new_ip
。如果是new_ip == '121.464.544.122'
,那么它将减去unique
的值,因为这是我的默认值。
第三个问题:运行Button_Click
事件时,如何避免"冻结"我的应用程序?。
第四个问题:你对如何改进我的代码有什么想法吗?也许将以前的ip存储在文本文件或数组中会更好?
只有一些指针。。。
对于数据,我只会创建一个简单的类,将变量作为属性。在您的表单中,您只能有一个类的实例。这个类还可以有一个Dictionary,其中包含您收集的所有ip地址(作为关键字)和找到它们的次数(作为值)。这也将使搜索更容易。
至于冷冻。。。您应该在一个单独的线程中执行点击事件的(阻塞)代码。然后,您也可以通过Application.DoEvents()
调用忘记MyDelad()
函数。当然,你需要牢记线程安全。。。