-
Notifications
You must be signed in to change notification settings - Fork 12
/
Utility.cs
145 lines (138 loc) · 4.57 KB
/
Utility.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Threading;
namespace XiaoFeng.Onvif
{
/// <summary>
/// 通用工具类
/// </summary>
public static class Utility
{
public static async Task<List<UdpReceiveResult>> UdpOnvifClient(int timeout, string netMask)
{
var sendBuffer = OnvifAuth.UdpProbeMessage();
var ipa = new IPEndPoint(IPAddress.Parse(netMask), 3702);
var udp = new UdpClient()
{
EnableBroadcast = true
};
await udp.SendAsync(sendBuffer, sendBuffer.Length, ipa);
var list = new List<UdpReceiveResult>();
while (true)
{
try
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
if (cts.IsCancellationRequested) break;
var ata = await udp.ReceiveAsync().WithCancellation(cts.Token);
list.Add(ata);
}
catch (Exception ex)
{
break;
}
}
udp.Close();
udp.Dispose();
return list;
}
//获取本机的网段
public static string GetLocalIPGateway()
{
string[] arrary = GetLocalIp().Split('.');
return arrary[2];
}
//获取本机ip
public static string GetLocalIp()
{
///获取本地的IP地址
string AddressIP = string.Empty;
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
//Debug.Log(_IPAddress.AddressFamily.ToString());
//Debug.Log(_IPAddress.ToString());
if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
{
AddressIP = _IPAddress.ToString();
return AddressIP;
}
}
return AddressIP;
}
/// <summary>
/// 用于为返回任务的任何异步Task<T>方法提供取消可能性
/// </summary>
public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
var tcs = new TaskCompletionSource<bool>();
using (cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs))
{
if (task != await Task.WhenAny(task, tcs.Task))
{
throw new OperationCanceledException(cancellationToken);
}
}
return await task;
}
/// <summary>
/// 检查IP是否ping通
/// </summary>
/// <param name="_ip"></param>
/// <returns></returns>
public static bool CheckPingEnable(string _ip)
{
bool _isEnable = false;
try
{
Ping pingSender = new Ping();
PingReply reply = pingSender.Send(_ip, 120);//第一个参数为ip地址,第二个参数为ping的时间
if (reply.Status == IPStatus.Success)
{
_isEnable = true;
}
else
{
_isEnable = false;
}
}
catch (Exception)
{
_isEnable = false;
}
return _isEnable;
}
/// <summary>
/// 检查IP和端口是否通
/// </summary>
/// <param name="_ip"></param>
/// <param name="_port"></param>
/// <returns></returns>
public static bool CheckIpPortEnable(string _ip, int _port)
{
//将IP和端口替换成为你要检测的
string ipAddress = _ip;
int portNum = _port;
IPAddress ip = IPAddress.Parse(ipAddress);
IPEndPoint point = new IPEndPoint(ip, portNum);
bool _portEnable = false;
try
{
using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
sock.Connect(point);
sock.Close();
_portEnable = true;
}
}
catch (SocketException)
{
_portEnable = false;
}
return _portEnable;
}
}
}