GuestIP依赖项:
cs
using System.Data.SQLite; //这是第三方依赖项,要从nuget下载
cs
static class GuestIP
{
public static void ReadLastGuestIP(string constr = "Data Source=guestip_log.db;")
{
using (var connection = new SQLiteConnection(constr))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM ip_guest ORDER BY id DESC LIMIT 1;";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var id = reader.GetInt32(0); // 假设id是第一列
var ts = reader.GetDateTime(1).AddHours(8); // 假设ts是第二列(日期时间) //将UTC时间转换成北京时间
var ip = reader.GetString(2); // 假设ip是第三列(文本)
//var id = reader.GetInt32(reader.GetOrdinal("id"));
//var ts = reader.GetDateTime(reader.GetOrdinal("ts"));
//var ip = reader.GetString(reader.GetOrdinal("ip"));
Console.WriteLine($"ID: {id}, Timestamp: {ts}, IP: {ip}");
}
}
}
connection.Close();
connection.Dispose();
}
}
/// <summary>
/// 读取时间时将UTC时间处理成北京时间
/// </summary>
/// <param name="constr"></param>
public static void ReadGuestIPlog(string constr = "Data Source=guestip_log.db;")
{
using (var connection = new SQLiteConnection(constr))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM ip_guest";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var id = reader.GetInt32(0); // 假设id是第一列
var ts = reader.GetDateTime(1).AddHours(8); // 假设ts是第二列(日期时间) //将UTC时间转换成北京时间
var ip = reader.GetString(2); // 假设ip是第三列(文本)
//var id = reader.GetInt32(reader.GetOrdinal("id"));
//var ts = reader.GetDateTime(reader.GetOrdinal("ts"));
//var ip = reader.GetString(reader.GetOrdinal("ip"));
Console.WriteLine($"ID: {id}, Timestamp: {ts}, IP: {ip}");
}
}
}
connection.Close();
connection.Dispose();
}
}
/// <summary>
/// 注意SQLite只存储UTC时间,读取时可以处理成北京时间。
/// </summary>
/// <param name="constr"></param>
public static void CreateTableIfNotExists(string constr = "Data Source=guestip_log.db;")
{
using (var sqliteConnection = new SQLiteConnection(constr))
{
// 开始事务
var transaction = sqliteConnection.BeginTransaction();
try
{
using (var command = sqliteConnection.CreateCommand())
{
command.Transaction = transaction;
command.CommandText = @"
CREATE TABLE IF NOT EXISTS ip_guest (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
ip TEXT NOT NULL
)";
command.ExecuteNonQuery();
// 提交事务
transaction.Commit();
}
}
catch (Exception e)
{
// 如果出现异常,则回滚事务
Console.WriteLine($"An error occurred: {e.Message}");
transaction.Rollback();
}
sqliteConnection.Close();
}
}
public static void RecordIpToDatabase(string ip, string constr = "Data Source=guestip_log.db;")
{
using (var sqliteConnection = new SQLiteConnection(constr))
{
sqliteConnection.Open();
using (var command = sqliteConnection.CreateCommand())
{
// 开始事务
var transaction = sqliteConnection.BeginTransaction();
try
{
command.Transaction = transaction;
command.CommandText = @"
CREATE TABLE IF NOT EXISTS ip_guest (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
ip TEXT NOT NULL
)";
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO ip_guest (ip) VALUES (@ip)";
command.Parameters.AddWithValue("@ip", ip);
command.ExecuteNonQuery();
// 提交事务
transaction.Commit();
}
catch (Exception e)
{
// 如果出现异常,则回滚事务
Console.WriteLine($"An error occurred: {e.Message}");
transaction.Rollback();
}
}
sqliteConnection.Close();
}
}
public static void RecordIpToDatabase(TcpClient client, string constr = "Data Source=guestip_log.db;")
{
try
{
string ipAddress = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();
Console.WriteLine("Accepted connection from " + ipAddress);
// 记录IP地址到SQLite数据库
RecordIpToDatabase(ipAddress, constr);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
public static async Task RecordIpToDatabaseAsync(string ipAddress, string constr = "Data Source=guestip_log.db;")
{
using (var conection = new SQLiteConnection(constr))
{
await conection.OpenAsync();
// 开始事务
var transaction = conection.BeginTransaction();
using (var command = new SQLiteCommand())
{
command.Connection = conection;
command.Transaction = transaction;
command.CommandText = "INSERT INTO ip_guest (ip) VALUES (@ip)";
command.Parameters.AddWithValue("@ip", ipAddress);
await command.ExecuteNonQueryAsync();
// 提交事务
transaction.Commit();
}
conection.Close();
}
}
}
Refresh依赖项:
cs
using System.Collections.Generic;
using System.Timers;
using System;
cs
public class Refresh
{
private System.Timers.Timer timer = new System.Timers.Timer();
private List<(Action updateMethod, int interval)> tasks = new List<(Action, int)>();
public void AddTask(Action updateMethod, int interval)
{
tasks.Add((updateMethod, interval));
}
public void StartTimer()
{
if (timer == null)
{
this.timer = new System.Timers.Timer();
}
if (tasks.Count > 0)
{
int gcdInterval = GCD(tasks.Select(t => t.interval).ToArray()); // 计算所有任务间隔时间的最大公约数
timer.Interval = gcdInterval;
}
else
{
timer.Interval = 1000 * 10; // 默认时间间隔为1000*10毫秒,10秒
}
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true; // 设置为true,以便定时器在每次触发后自动重置
timer.Enabled = true;
timer.Start();
}
public void RestartTimer()
{
timer.Stop();
if (tasks.Count > 0)
{
int gcdInterval = GCD(tasks.Select(t => t.interval).ToArray()); // 计算所有任务间隔时间的最大公约数
timer.Interval = gcdInterval;
}
else
{
timer.Interval = 1000 * 10; // 默认时间间隔为1000*10毫秒,10秒
}
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true; // 设置为true,以便定时器在每次触发后自动重置
timer.Enabled = true;
timer.Start();
}
public void StopTimer()
{
timer.Stop();
timer.Dispose();
}
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
foreach (var task in tasks)
{
if (DateTime.Now.Ticks % task.interval == 0) // Check if it's time to run the task
{
try
{
task.updateMethod();
}
catch (Exception ex)
{
// Log or handle exception
Console.WriteLine($"Error executing task: {ex.Message}");
}
}
}
}
private int GCD(int a, int b)
{
while (b != 0)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}
private int GCD(int[] numbers)
{
int result = numbers[0];
for (int i = 1; i < numbers.Length; i++)
{
result = GCD(result, numbers[i]);
if (result == 1) // 如果GCD已经是1,则无需继续计算
{
break;
}
}
return result;
}
}