Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
NetworkChange.cs
Go to the documentation of this file.
4
6
7public class NetworkChange
8{
9 internal static class AvailabilityChangeListener
10 {
12
13 private static volatile bool s_isAvailable;
14
51
68
70 {
71 if (caller == null)
72 {
73 return;
74 }
76 {
79 {
81 }
82 }
83 }
84 }
85
86 internal static class AddressChangeListener
87 {
88 private static bool s_isListening;
89
90 private static bool s_isPending;
91
92 private static Socket s_ipv4Socket;
93
94 private static Socket s_ipv6Socket;
95
97
99
100 private static void AddressChangedCallback(object stateObject, bool signaled)
101 {
104 {
105 s_isPending = false;
106 if (!s_isListening)
107 {
108 return;
109 }
110 s_isListening = false;
111 if (s_addressChangedSubscribers.Count > 0)
112 {
114 }
115 try
116 {
118 }
119 catch (NetworkInformationException message)
120 {
121 if (System.Net.NetEventSource.Log.IsEnabled())
122 {
123 System.Net.NetEventSource.Error(null, message, "AddressChangedCallback");
124 }
125 }
126 }
127 if (dictionary == null)
128 {
129 return;
130 }
132 {
135 if (value == null)
136 {
137 key(null, EventArgs.Empty);
138 }
139 else
140 {
142 }
143 }
144 }
145
150
155
157 {
159 {
160 if (s_ipv4Socket == null)
161 {
163 {
164 s_ipv4Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP)
165 {
166 Blocking = false
167 };
168 s_ipv4WaitHandle = new AutoResetEvent(initialState: false);
169 }
171 {
172 s_ipv6Socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.IP)
173 {
174 Blocking = false
175 };
176 s_ipv6WaitHandle = new AutoResetEvent(initialState: false);
177 }
178 }
179 if (caller != null)
180 {
182 }
184 {
185 return;
186 }
187 if (!s_isPending)
188 {
189 if (Socket.OSSupportsIPv4 && (startIPOptions & StartIPOptions.StartIPv4) != 0)
190 {
192 if (global::Interop.Winsock.WSAIoctl_Blocking(s_ipv4Socket.SafeHandle, 671088663, null, 0, null, 0, out var _, IntPtr.Zero, IntPtr.Zero) != 0)
193 {
195 if ((long)ex.ErrorCode != 10035)
196 {
197 throw ex;
198 }
199 }
200 if (global::Interop.Winsock.WSAEventSelect(s_ipv4Socket.SafeHandle, s_ipv4WaitHandle.GetSafeWaitHandle(), global::Interop.Winsock.AsyncEventBits.FdAddressListChange) != 0)
201 {
202 throw new NetworkInformationException();
203 }
204 }
205 if (Socket.OSSupportsIPv6 && (startIPOptions & StartIPOptions.StartIPv6) != 0)
206 {
208 if (global::Interop.Winsock.WSAIoctl_Blocking(s_ipv6Socket.SafeHandle, 671088663, null, 0, null, 0, out var _, IntPtr.Zero, IntPtr.Zero) != 0)
209 {
211 if ((long)ex2.ErrorCode != 10035)
212 {
213 throw ex2;
214 }
215 }
216 if (global::Interop.Winsock.WSAEventSelect(s_ipv6Socket.SafeHandle, s_ipv6WaitHandle.GetSafeWaitHandle(), global::Interop.Winsock.AsyncEventBits.FdAddressListChange) != 0)
217 {
218 throw new NetworkInformationException();
219 }
220 }
221 }
222 s_isListening = true;
223 s_isPending = true;
224 }
225 }
226
228 {
229 if (caller == null)
230 {
231 return;
232 }
234 {
237 {
238 s_isListening = false;
239 }
240 }
241 }
242 }
243
245
247
249
251
253
255
257
258 private static readonly object s_globalLock = new object();
259
271
273 {
274 add
275 {
277 }
278 remove
279 {
281 }
282 }
283
284 [Obsolete("This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.", true)]
286 {
287 }
288
289 private static void RunAddressChangedHandler(object state)
290 {
292 }
293
298
303}
static readonly EventArgs Empty
Definition EventArgs.cs:9
static readonly System.Net.NetEventSource Log
static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName=null)
static void Stop(NetworkAddressChangedEventHandler caller)
static void AddressChangedCallback(object stateObject, bool signaled)
static void UnsafeStart(NetworkAddressChangedEventHandler caller)
static void StartHelper(NetworkAddressChangedEventHandler caller, bool captureContext, StartIPOptions startIPOptions)
static void Start(NetworkAddressChangedEventHandler caller)
static void ChangedAddress(object sender, EventArgs eventArgs)
static void Stop(NetworkAvailabilityChangedEventHandler caller)
static void Start(NetworkAvailabilityChangedEventHandler caller)
static readonly NetworkAddressChangedEventHandler s_addressChange
static readonly NetworkAvailabilityEventArgs s_notAvailableEventArgs
static readonly ContextCallback s_runHandlerAvailable
static readonly NetworkAvailabilityEventArgs s_availableEventArgs
static readonly ContextCallback s_runHandlerNotAvailable
static void RunAvailabilityHandlerAvailable(object state)
static void RunAvailabilityHandlerNotAvailable(object state)
static void RunAddressChangedHandler(object state)
static readonly Dictionary< NetworkAddressChangedEventHandler, ExecutionContext > s_addressChangedSubscribers
static ? NetworkAddressChangedEventHandler NetworkAddressChanged
static void RegisterNetworkChange(NetworkChange nc)
static readonly Dictionary< NetworkAvailabilityChangedEventHandler, ExecutionContext > s_availabilityChangedSubscribers
static readonly ContextCallback s_runAddressChangedHandler
static ? NetworkAvailabilityChangedEventHandler NetworkAvailabilityChanged
static bool OSSupportsIPv6
Definition Socket.cs:591
static bool OSSupportsIPv4
Definition Socket.cs:589
static ? ExecutionContext Capture()
static void Run(ExecutionContext executionContext, ContextCallback callback, object? state)
static RegisteredWaitHandle RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, object state, uint millisecondsTimeOutInterval, bool executeOnlyOnce, bool flowExecutionContext)
delegate void NetworkAddressChangedEventHandler(object? sender, EventArgs e)
delegate void NetworkAvailabilityChangedEventHandler(object? sender, NetworkAvailabilityEventArgs e)
delegate void ContextCallback(object? state)
static readonly IntPtr Zero
Definition IntPtr.cs:18