Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Socket.cs
Go to the documentation of this file.
5using System.IO;
15
16namespace System.Net.Sockets;
17
18public class Socket : IDisposable
19{
44
45 internal sealed class AwaitableSocketAsyncEventArgs : SocketAsyncEventArgs, IValueTaskSource, IValueTaskSource<int>, IValueTaskSource<Socket>, IValueTaskSource<SocketReceiveFromResult>, IValueTaskSource<SocketReceiveMessageFromResult>
46 {
48 {
50 };
51
52 private readonly Socket _owner;
53
54 private bool _isReadForCaching;
55
57
59
60 private object _scheduler;
61
62 private short _token;
63
65
66 public bool WrapExceptionsForNetworkStream { get; set; }
67
74
85
86 protected override void OnCompleted(SocketAsyncEventArgs _)
87 {
90 {
91 return;
92 }
93 object userToken = base.UserToken;
94 base.UserToken = null;
97 if (executionContext == null)
98 {
100 return;
101 }
102 _executionContext = null;
104 {
106 tuple.Item1.InvokeContinuation(tuple.Item2, tuple.Item3, forceAsync: false, requiresExecutionContextFlow: false);
107 }, (this, action, userToken));
108 }
109
111 {
112 if (socket.AcceptAsync(this, cancellationToken))
113 {
115 return new ValueTask<Socket>(this, _token);
116 }
117 Socket acceptSocket = base.AcceptSocket;
118 SocketError socketError = base.SocketError;
119 Release();
120 if (socketError != 0)
121 {
123 }
125 }
126
128 {
129 if (socket.ReceiveAsync(this, cancellationToken))
130 {
132 return new ValueTask<int>(this, _token);
133 }
134 int bytesTransferred = base.BytesTransferred;
135 SocketError socketError = base.SocketError;
136 Release();
137 if (socketError != 0)
138 {
140 }
142 }
143
145 {
146 if (socket.ReceiveFromAsync(this, cancellationToken))
147 {
150 }
151 int bytesTransferred = base.BytesTransferred;
152 EndPoint remoteEndPoint = base.RemoteEndPoint;
153 SocketError socketError = base.SocketError;
154 Release();
155 if (socketError != 0)
156 {
158 }
160 result.ReceivedBytes = bytesTransferred;
161 result.RemoteEndPoint = remoteEndPoint;
162 return new ValueTask<SocketReceiveFromResult>(result);
163 }
164
166 {
167 if (socket.ReceiveMessageFromAsync(this, cancellationToken))
168 {
171 }
172 int bytesTransferred = base.BytesTransferred;
173 EndPoint remoteEndPoint = base.RemoteEndPoint;
174 SocketFlags socketFlags = base.SocketFlags;
175 IPPacketInformation receiveMessageFromPacketInfo = base.ReceiveMessageFromPacketInfo;
176 SocketError socketError = base.SocketError;
177 Release();
178 if (socketError != 0)
179 {
181 }
183 result.ReceivedBytes = bytesTransferred;
184 result.RemoteEndPoint = remoteEndPoint;
185 result.SocketFlags = socketFlags;
186 result.PacketInformation = receiveMessageFromPacketInfo;
188 }
189
191 {
192 if (socket.SendAsync(this, cancellationToken))
193 {
195 return new ValueTask<int>(this, _token);
196 }
197 int bytesTransferred = base.BytesTransferred;
198 SocketError socketError = base.SocketError;
199 Release();
200 if (socketError != 0)
201 {
203 }
205 }
206
208 {
209 if (socket.SendAsync(this, cancellationToken))
210 {
212 return new ValueTask(this, _token);
213 }
214 SocketError socketError = base.SocketError;
215 Release();
216 if (socketError != 0)
217 {
219 }
220 return default(ValueTask);
221 }
222
224 {
225 if (socket.SendPacketsAsync(this, cancellationToken))
226 {
228 return new ValueTask(this, _token);
229 }
230 SocketError socketError = base.SocketError;
231 Release();
232 if (socketError != 0)
233 {
235 }
236 return default(ValueTask);
237 }
238
240 {
241 if (socket.SendToAsync(this, cancellationToken))
242 {
244 return new ValueTask<int>(this, _token);
245 }
246 int bytesTransferred = base.BytesTransferred;
247 SocketError socketError = base.SocketError;
248 Release();
249 if (socketError != 0)
250 {
252 }
254 }
255
257 {
258 try
259 {
260 if (socket.ConnectAsync(this, userSocket: true, saeaCancelable: false))
261 {
262 return new ValueTask(this, _token);
263 }
264 }
265 catch
266 {
267 Release();
268 throw;
269 }
270 SocketError socketError = base.SocketError;
271 Release();
272 if (socketError != 0)
273 {
275 }
276 return default(ValueTask);
277 }
278
280 {
281 if (socket.DisconnectAsync(this, cancellationToken))
282 {
284 return new ValueTask(this, _token);
285 }
286 SocketError socketError = base.SocketError;
287 Release();
288 if (socketError != 0)
289 {
291 }
293 }
294
296 {
297 if (token != _token)
298 {
300 }
301 if ((object)_continuation == s_completedSentinel)
302 {
303 if (base.SocketError != 0)
304 {
305 return ValueTaskSourceStatus.Faulted;
306 }
307 return ValueTaskSourceStatus.Succeeded;
308 }
309 return ValueTaskSourceStatus.Pending;
310 }
311
313 {
314 if (token != _token)
315 {
317 }
318 if ((flags & ValueTaskSourceOnCompletedFlags.FlowExecutionContext) != 0)
319 {
321 }
322 if ((flags & ValueTaskSourceOnCompletedFlags.UseSchedulingContext) != 0)
323 {
325 if (current != null && current.GetType() != typeof(SynchronizationContext))
326 {
327 _scheduler = current;
328 }
329 else
330 {
333 {
335 }
336 }
337 }
338 base.UserToken = state;
340 if ((object)action == s_completedSentinel)
341 {
343 _executionContext = null;
344 base.UserToken = null;
346 }
347 else if (action != null)
348 {
350 }
351 }
352
354 {
355 object scheduler = _scheduler;
356 _scheduler = null;
357 if (scheduler != null)
358 {
360 {
362 {
363 (Action<object>, object) tuple = ((Action<object>, object))s;
364 tuple.Item1(tuple.Item2);
365 }, (continuation, state));
366 }
367 else
368 {
370 }
371 }
372 else if (forceAsync)
373 {
375 {
377 }
378 else
379 {
381 }
382 }
383 else
384 {
386 }
387 }
388
389 int IValueTaskSource<int>.GetResult(short token)
390 {
391 if (token != _token)
392 {
394 }
395 SocketError socketError = base.SocketError;
396 int bytesTransferred = base.BytesTransferred;
398 Release();
399 if (socketError != 0)
400 {
402 }
403 return bytesTransferred;
404 }
405
406 void IValueTaskSource.GetResult(short token)
407 {
408 if (token != _token)
409 {
411 }
412 SocketError socketError = base.SocketError;
414 Release();
415 if (socketError != 0)
416 {
418 }
419 }
420
421 Socket IValueTaskSource<Socket>.GetResult(short token)
422 {
423 if (token != _token)
424 {
426 }
427 SocketError socketError = base.SocketError;
428 Socket acceptSocket = base.AcceptSocket;
430 Release();
431 if (socketError != 0)
432 {
434 }
435 return acceptSocket;
436 }
437
439 {
440 if (token != _token)
441 {
443 }
444 SocketError socketError = base.SocketError;
445 int bytesTransferred = base.BytesTransferred;
446 EndPoint remoteEndPoint = base.RemoteEndPoint;
448 Release();
449 if (socketError != 0)
450 {
452 }
454 result.ReceivedBytes = bytesTransferred;
455 result.RemoteEndPoint = remoteEndPoint;
456 return result;
457 }
458
460 {
461 if (token != _token)
462 {
464 }
465 SocketError socketError = base.SocketError;
466 int bytesTransferred = base.BytesTransferred;
467 EndPoint remoteEndPoint = base.RemoteEndPoint;
468 SocketFlags socketFlags = base.SocketFlags;
469 IPPacketInformation receiveMessageFromPacketInfo = base.ReceiveMessageFromPacketInfo;
471 Release();
472 if (socketError != 0)
473 {
475 }
477 result.ReceivedBytes = bytesTransferred;
478 result.RemoteEndPoint = remoteEndPoint;
479 result.SocketFlags = socketFlags;
480 result.PacketInformation = receiveMessageFromPacketInfo;
481 return result;
482 }
483
488
493
495 {
496 if (error == SocketError.OperationAborted || error == SocketError.ConnectionAborted)
497 {
498 cancellationToken.ThrowIfCancellationRequested();
499 }
500 throw CreateException(error, forAsyncThrow: false);
501 }
502
516 }
517
518 private sealed class CachedSerializedEndPoint
519 {
520 public readonly IPEndPoint IPEndPoint;
521
523
529 }
530
531 private static readonly IPAddress s_IPAddressAnyMapToIPv6 = IPAddress.Any.MapToIPv6();
532
534
536
538
540
541 private bool _isConnected;
542
543 private bool _isDisconnected;
544
545 private bool _willBlock = true;
546
547 private bool _willBlockInternal = true;
548
549 private bool _isListening;
550
552
554
556
558
560
562
563 private int _closeTimeout = -1;
564
565 private int _disposed;
566
568
570
572
574
576
578
580
582
583 [Obsolete("SupportsIPv4 has been deprecated. Use OSSupportsIPv4 instead.")]
584 public static bool SupportsIPv4 => OSSupportsIPv4;
585
586 [Obsolete("SupportsIPv6 has been deprecated. Use OSSupportsIPv6 instead.")]
587 public static bool SupportsIPv6 => OSSupportsIPv6;
588
590
592
594
595 public int Available
596 {
597 get
598 {
600 int available;
602 if (System.Net.NetEventSource.Log.IsEnabled())
603 {
604 System.Net.NetEventSource.Info(this, $"GetAvailable returns errorCode:{available2}", "Available");
605 }
606 if (available2 != 0)
607 {
609 }
610 return available;
611 }
612 }
613
614 public unsafe EndPoint? LocalEndPoint
615 {
616 get
617 {
619 if (_nonBlockingConnectInProgress && Poll(0, SelectMode.SelectWrite))
620 {
623 }
624 if (_rightEndPoint == null)
625 {
626 return null;
627 }
628 if (_localEndPoint == null)
629 {
631 fixed (byte* buffer = socketAddress.Buffer)
632 {
633 fixed (int* nameLen = &socketAddress.InternalSize)
634 {
636 if (sockName != 0)
637 {
639 }
640 }
641 }
642 _localEndPoint = _rightEndPoint.Create(socketAddress);
643 }
644 return _localEndPoint;
645 }
646 }
647
649 {
650 get
651 {
653 if (_remoteEndPoint == null)
654 {
655 if (_nonBlockingConnectInProgress && Poll(0, SelectMode.SelectWrite))
656 {
659 }
660 if (_rightEndPoint == null || !_isConnected)
661 {
662 return null;
663 }
665 SocketError peerName = SocketPal.GetPeerName(_handle, socketAddress.Buffer, ref socketAddress.InternalSize);
666 if (peerName != 0)
667 {
669 }
670 try
671 {
672 _remoteEndPoint = _rightEndPoint.Create(socketAddress);
673 }
674 catch
675 {
676 }
677 }
678 return _remoteEndPoint;
679 }
680 }
681
683
685 {
686 get
687 {
689 return _handle;
690 }
691 }
692
694
695 public bool Blocking
696 {
697 get
698 {
699 return _willBlock;
700 }
701 set
702 {
704 if (System.Net.NetEventSource.Log.IsEnabled())
705 {
706 System.Net.NetEventSource.Info(this, $"value:{value} willBlock:{_willBlock} willBlockInternal:{_willBlockInternal}", "Blocking");
707 }
708 bool current;
710 if (socketError != 0)
711 {
713 }
714 _willBlock = current;
715 }
716 }
717
718 [Obsolete("UseOnlyOverlappedIO has been deprecated and is not supported.")]
721 {
722 get
723 {
724 return false;
725 }
726 set
727 {
728 }
729 }
730
731 public bool Connected
732 {
733 get
734 {
735 if (System.Net.NetEventSource.Log.IsEnabled())
736 {
737 System.Net.NetEventSource.Info(this, $"_isConnected:{_isConnected}", "Connected");
738 }
739 if (_nonBlockingConnectInProgress && Poll(0, SelectMode.SelectWrite))
740 {
743 }
744 return _isConnected;
745 }
746 }
747
749
751
753
754 public bool IsBound => _rightEndPoint != null;
755
757 {
758 get
759 {
760 if ((int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse) == 0)
761 {
762 return false;
763 }
764 return true;
765 }
766 set
767 {
768 if (IsBound)
769 {
771 }
772 SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, value ? 1 : 0);
773 }
774 }
775
777 {
778 get
779 {
780 return (int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer);
781 }
782 set
783 {
784 if (value < 0)
785 {
786 throw new ArgumentOutOfRangeException("value");
787 }
789 }
790 }
791
792 public int SendBufferSize
793 {
794 get
795 {
796 return (int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer);
797 }
798 set
799 {
800 if (value < 0)
801 {
802 throw new ArgumentOutOfRangeException("value");
803 }
805 }
806 }
807
808 public int ReceiveTimeout
809 {
810 get
811 {
812 return (int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout);
813 }
814 set
815 {
816 if (value < -1)
817 {
818 throw new ArgumentOutOfRangeException("value");
819 }
820 if (value == -1)
821 {
822 value = 0;
823 }
825 }
826 }
827
828 public int SendTimeout
829 {
830 get
831 {
832 return (int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout);
833 }
834 set
835 {
836 if (value < -1)
837 {
838 throw new ArgumentOutOfRangeException("value");
839 }
840 if (value == -1)
841 {
842 value = 0;
843 }
845 }
846 }
847
849 {
850 get
851 {
853 }
855 set
856 {
858 }
859 }
860
861 public bool NoDelay
862 {
863 get
864 {
865 if ((int)GetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Debug) == 0)
866 {
867 return false;
868 }
869 return true;
870 }
871 set
872 {
874 }
875 }
876
877 public short Ttl
878 {
879 get
880 {
881 if (_addressFamily == AddressFamily.InterNetwork)
882 {
883 return (short)(int)GetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress);
884 }
885 if (_addressFamily == AddressFamily.InterNetworkV6)
886 {
887 return (short)(int)GetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.ReuseAddress);
888 }
890 }
891 set
892 {
893 if (value < 0 || value > 255)
894 {
895 throw new ArgumentOutOfRangeException("value");
896 }
897 if (_addressFamily == AddressFamily.InterNetwork)
898 {
900 return;
901 }
902 if (_addressFamily == AddressFamily.InterNetworkV6)
903 {
905 return;
906 }
908 }
909 }
910
911 public bool DontFragment
912 {
913 get
914 {
915 if (_addressFamily == AddressFamily.InterNetwork)
916 {
917 if ((int)GetSocketOption(SocketOptionLevel.IP, SocketOptionName.DontFragment) == 0)
918 {
919 return false;
920 }
921 return true;
922 }
924 }
925 set
926 {
927 if (_addressFamily == AddressFamily.InterNetwork)
928 {
929 SetSocketOption(SocketOptionLevel.IP, SocketOptionName.DontFragment, value ? 1 : 0);
930 return;
931 }
933 }
934 }
935
937 {
938 get
939 {
940 if (_addressFamily == AddressFamily.InterNetwork)
941 {
942 if ((int)GetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback) == 0)
943 {
944 return false;
945 }
946 return true;
947 }
948 if (_addressFamily == AddressFamily.InterNetworkV6)
949 {
950 if ((int)GetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.MulticastLoopback) == 0)
951 {
952 return false;
953 }
954 return true;
955 }
957 }
958 set
959 {
960 if (_addressFamily == AddressFamily.InterNetwork)
961 {
962 SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, value ? 1 : 0);
963 return;
964 }
965 if (_addressFamily == AddressFamily.InterNetworkV6)
966 {
967 SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.MulticastLoopback, value ? 1 : 0);
968 return;
969 }
971 }
972 }
973
974 public bool EnableBroadcast
975 {
976 get
977 {
978 if ((int)GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast) == 0)
979 {
980 return false;
981 }
982 return true;
983 }
984 set
985 {
986 SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, value ? 1 : 0);
987 }
988 }
989
990 public bool DualMode
991 {
992 get
993 {
994 if (AddressFamily != AddressFamily.InterNetworkV6)
995 {
996 return false;
997 }
998 return (int)GetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only) == 0;
999 }
1000 set
1001 {
1002 if (AddressFamily != AddressFamily.InterNetworkV6)
1003 {
1005 }
1006 SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, (!value) ? 1 : 0);
1007 }
1008 }
1009
1010 private bool IsDualMode
1011 {
1012 get
1013 {
1014 if (AddressFamily == AddressFamily.InterNetworkV6)
1015 {
1016 return DualMode;
1017 }
1018 return false;
1019 }
1020 }
1021
1022 internal bool Disposed => _disposed != 0;
1023
1025
1034
1050
1055
1057 {
1058 _handle = handle;
1059 _addressFamily = AddressFamily.Unknown;
1060 _socketType = SocketType.Unknown;
1061 _protocolType = ProtocolType.Unknown;
1063 {
1064 return;
1065 }
1066 try
1067 {
1069 if (!isSocket)
1070 {
1071 return;
1072 }
1074 int nameLen = span.Length;
1075 fixed (byte* buffer = span)
1076 {
1077 if (SocketPal.GetSockName(handle, buffer, &nameLen) != 0)
1078 {
1079 return;
1080 }
1081 }
1082 System.Net.Internals.SocketAddress socketAddress = null;
1083 switch (_addressFamily)
1084 {
1085 case AddressFamily.InterNetwork:
1087 break;
1088 case AddressFamily.InterNetworkV6:
1089 {
1090 Span<byte> span2 = stackalloc byte[16];
1091 System.Net.SocketAddressPal.GetIPv6Address(span.Slice(0, nameLen), span2, out var scope);
1093 break;
1094 }
1095 case AddressFamily.Unix:
1096 socketAddress = new System.Net.Internals.SocketAddress(_addressFamily, span.Slice(0, nameLen));
1098 break;
1099 }
1100 if (_rightEndPoint == null)
1101 {
1102 return;
1103 }
1104 try
1105 {
1106 nameLen = span.Length;
1107 switch (SocketPal.GetPeerName(handle, span, ref nameLen))
1108 {
1109 case SocketError.Success:
1110 switch (_addressFamily)
1111 {
1112 case AddressFamily.InterNetwork:
1114 break;
1115 case AddressFamily.InterNetworkV6:
1116 {
1117 Span<byte> span3 = stackalloc byte[16];
1120 break;
1121 }
1122 case AddressFamily.Unix:
1123 socketAddress = new System.Net.Internals.SocketAddress(_addressFamily, span.Slice(0, nameLen));
1125 break;
1126 }
1127 _isConnected = true;
1128 break;
1129 case SocketError.InvalidArgument:
1130 _isConnected = true;
1131 break;
1132 }
1133 }
1134 catch
1135 {
1136 }
1137 }
1138 catch
1139 {
1140 _handle = null;
1141 GC.SuppressFinalize(this);
1142 throw;
1143 }
1144 }
1145
1147 {
1148 if (handle != null)
1149 {
1150 if (!handle.IsInvalid)
1151 {
1152 return handle;
1153 }
1154 throw new ArgumentException(System.SR.Arg_InvalidHandle, "handle");
1155 }
1156 throw new ArgumentNullException("handle");
1157 }
1158
1160 {
1161 if (family != _addressFamily)
1162 {
1163 if (family == AddressFamily.InterNetwork)
1164 {
1165 return IsDualMode;
1166 }
1167 return false;
1168 }
1169 return true;
1170 }
1171
1172 public void Bind(EndPoint localEP)
1173 {
1174 if (System.Net.NetEventSource.Log.IsEnabled())
1175 {
1176 System.Net.NetEventSource.Info(this, localEP, "Bind");
1177 }
1179 if (localEP == null)
1180 {
1181 throw new ArgumentNullException("localEP");
1182 }
1183 if (System.Net.NetEventSource.Log.IsEnabled())
1184 {
1185 System.Net.NetEventSource.Info(this, $"localEP:{localEP}", "Bind");
1186 }
1188 DoBind(localEP, socketAddress);
1189 }
1190
1192 {
1194 if (!OSSupportsIPv4 && iPEndPoint != null && iPEndPoint.Address.IsIPv4MappedToIPv6)
1195 {
1197 }
1198 SocketError socketError = SocketPal.Bind(_handle, _protocolType, socketAddress.Buffer, socketAddress.Size);
1199 if (socketError != 0)
1200 {
1202 }
1204 }
1205
1207 {
1209 if (remoteEP == null)
1210 {
1211 throw new ArgumentNullException("remoteEP");
1212 }
1213 if (_isDisconnected)
1214 {
1216 }
1217 if (_isListening)
1218 {
1220 }
1221 if (_isConnected)
1222 {
1223 throw new SocketException(10056);
1224 }
1226 if (System.Net.NetEventSource.Log.IsEnabled())
1227 {
1228 System.Net.NetEventSource.Info(this, $"DST:{remoteEP}", "Connect");
1229 }
1231 {
1232 if (dnsEndPoint.AddressFamily != 0 && !CanTryAddressFamily(dnsEndPoint.AddressFamily))
1233 {
1235 }
1236 Connect(dnsEndPoint.Host, dnsEndPoint.Port);
1237 }
1238 else
1239 {
1243 DoConnect(remoteEP, socketAddress);
1244 }
1245 }
1246
1247 public void Connect(IPAddress address, int port)
1248 {
1250 if (address == null)
1251 {
1252 throw new ArgumentNullException("address");
1253 }
1255 {
1256 throw new ArgumentOutOfRangeException("port");
1257 }
1258 if (_isConnected)
1259 {
1260 throw new SocketException(10056);
1261 }
1262 if (!CanTryAddressFamily(address.AddressFamily))
1263 {
1265 }
1266 IPEndPoint remoteEP = new IPEndPoint(address, port);
1268 }
1269
1270 public void Connect(string host, int port)
1271 {
1273 if (host == null)
1274 {
1275 throw new ArgumentNullException("host");
1276 }
1278 {
1279 throw new ArgumentOutOfRangeException("port");
1280 }
1281 if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6)
1282 {
1284 }
1285 if (IPAddress.TryParse(host, out IPAddress address))
1286 {
1287 Connect(address, port);
1288 return;
1289 }
1292 }
1293
1294 public void Connect(IPAddress[] addresses, int port)
1295 {
1297 if (addresses == null)
1298 {
1299 throw new ArgumentNullException("addresses");
1300 }
1301 if (addresses.Length == 0)
1302 {
1304 }
1306 {
1307 throw new ArgumentOutOfRangeException("port");
1308 }
1309 if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6)
1310 {
1312 }
1313 if (_isConnected)
1314 {
1315 throw new SocketException(10056);
1316 }
1318 foreach (IPAddress iPAddress in addresses)
1319 {
1320 if (CanTryAddressFamily(iPAddress.AddressFamily))
1321 {
1322 try
1323 {
1325 exceptionDispatchInfo = null;
1326 }
1328 {
1330 continue;
1331 }
1332 break;
1333 }
1334 }
1335 exceptionDispatchInfo?.Throw();
1336 if (!Connected)
1337 {
1338 throw new ArgumentException(System.SR.net_invalidAddressList, "addresses");
1339 }
1340 }
1341
1342 public void Close()
1343 {
1344 if (System.Net.NetEventSource.Log.IsEnabled())
1345 {
1346 System.Net.NetEventSource.Info(this, $"timeout = {_closeTimeout}", "Close");
1347 }
1348 Dispose();
1349 }
1350
1351 public void Close(int timeout)
1352 {
1353 if (timeout < -1)
1354 {
1355 throw new ArgumentOutOfRangeException("timeout");
1356 }
1358 if (System.Net.NetEventSource.Log.IsEnabled())
1359 {
1360 System.Net.NetEventSource.Info(this, $"timeout = {_closeTimeout}", "Close");
1361 }
1362 Dispose();
1363 }
1364
1365 public void Listen()
1366 {
1367 Listen(int.MaxValue);
1368 }
1369
1370 public void Listen(int backlog)
1371 {
1372 if (System.Net.NetEventSource.Log.IsEnabled())
1373 {
1374 System.Net.NetEventSource.Info(this, backlog, "Listen");
1375 }
1378 if (socketError != 0)
1379 {
1381 }
1382 _isListening = true;
1383 }
1384
1386 {
1388 if (_rightEndPoint == null)
1389 {
1391 }
1392 if (!_isListening)
1393 {
1395 }
1396 if (_isDisconnected)
1397 {
1399 }
1401 if (System.Net.NetEventSource.Log.IsEnabled())
1402 {
1403 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint}", "Accept");
1404 }
1406 if (SocketsTelemetry.Log.IsEnabled())
1407 {
1408 SocketsTelemetry.Log.AcceptStart(socketAddress);
1409 }
1412 try
1413 {
1414 socketError = SocketPal.Accept(_handle, socketAddress.Buffer, ref socketAddress.InternalSize, out socket);
1415 }
1416 catch (Exception ex)
1417 {
1418 if (SocketsTelemetry.Log.IsEnabled())
1419 {
1420 SocketsTelemetry.Log.AfterAccept(SocketError.Interrupted, ex.Message);
1421 }
1422 throw;
1423 }
1424 if (socketError != 0)
1425 {
1427 if (SocketsTelemetry.Log.IsEnabled())
1428 {
1429 SocketsTelemetry.Log.AfterAccept(socketError);
1430 }
1432 }
1433 if (SocketsTelemetry.Log.IsEnabled())
1434 {
1435 SocketsTelemetry.Log.AfterAccept(SocketError.Success);
1436 }
1438 if (System.Net.NetEventSource.Log.IsEnabled())
1439 {
1440 System.Net.NetEventSource.Accepted(socket2, socket2.RemoteEndPoint, socket2.LocalEndPoint);
1441 }
1442 return socket2;
1443 }
1444
1445 public int Send(byte[] buffer, int size, SocketFlags socketFlags)
1446 {
1447 return Send(buffer, 0, size, socketFlags);
1448 }
1449
1451 {
1452 return Send(buffer, 0, (buffer != null) ? buffer.Length : 0, socketFlags);
1453 }
1454
1455 public int Send(byte[] buffer)
1456 {
1457 return Send(buffer, 0, (buffer != null) ? buffer.Length : 0, SocketFlags.None);
1458 }
1459
1461 {
1462 return Send(buffers, SocketFlags.None);
1463 }
1464
1466 {
1468 int result = Send(buffers, socketFlags, out errorCode);
1469 if (errorCode != 0)
1470 {
1471 throw new SocketException((int)errorCode);
1472 }
1473 return result;
1474 }
1475
1477 {
1479 if (buffers == null)
1480 {
1481 throw new ArgumentNullException("buffers");
1482 }
1483 if (buffers.Count == 0)
1484 {
1485 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_zerolist, "buffers"), "buffers");
1486 }
1488 if (System.Net.NetEventSource.Log.IsEnabled())
1489 {
1490 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint} DST:{RemoteEndPoint}", "Send");
1491 }
1493 if (errorCode != 0)
1494 {
1497 if (System.Net.NetEventSource.Log.IsEnabled())
1498 {
1499 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Send");
1500 }
1501 return 0;
1502 }
1503 if (SocketsTelemetry.Log.IsEnabled())
1504 {
1506 if (SocketType == SocketType.Dgram)
1507 {
1508 SocketsTelemetry.Log.DatagramSent();
1509 }
1510 }
1511 return bytesTransferred;
1512 }
1513
1514 public int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags)
1515 {
1517 int result = Send(buffer, offset, size, socketFlags, out errorCode);
1518 if (errorCode != 0)
1519 {
1520 throw new SocketException((int)errorCode);
1521 }
1522 return result;
1523 }
1524
1525 public int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode)
1526 {
1529 errorCode = SocketError.Success;
1531 if (System.Net.NetEventSource.Log.IsEnabled())
1532 {
1533 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint} DST:{RemoteEndPoint} size:{size}", "Send");
1534 }
1536 if (errorCode != 0)
1537 {
1540 if (System.Net.NetEventSource.Log.IsEnabled())
1541 {
1542 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Send");
1543 }
1544 return 0;
1545 }
1546 if (SocketsTelemetry.Log.IsEnabled())
1547 {
1549 if (SocketType == SocketType.Dgram)
1550 {
1551 SocketsTelemetry.Log.DatagramSent();
1552 }
1553 }
1554 if (System.Net.NetEventSource.Log.IsEnabled())
1555 {
1556 System.Net.NetEventSource.Info(this, $"Send returns:{bytesTransferred}", "Send");
1558 }
1559 return bytesTransferred;
1560 }
1561
1563 {
1564 return Send(buffer, SocketFlags.None);
1565 }
1566
1568 {
1570 int result = Send(buffer, socketFlags, out errorCode);
1571 if (errorCode != 0)
1572 {
1573 throw new SocketException((int)errorCode);
1574 }
1575 return result;
1576 }
1577
1579 {
1583 if (errorCode != 0)
1584 {
1587 if (System.Net.NetEventSource.Log.IsEnabled())
1588 {
1589 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Send");
1590 }
1591 return 0;
1592 }
1593 if (SocketsTelemetry.Log.IsEnabled())
1594 {
1596 if (SocketType == SocketType.Dgram)
1597 {
1598 SocketsTelemetry.Log.DatagramSent();
1599 }
1600 }
1601 return bytesTransferred;
1602 }
1603
1604 public void SendFile(string? fileName)
1605 {
1607 }
1608
1609 public void SendFile(string? fileName, byte[]? preBuffer, byte[]? postBuffer, TransmitFileOptions flags)
1610 {
1611 SendFile(fileName, preBuffer.AsSpan(), postBuffer.AsSpan(), flags);
1612 }
1613
1615 {
1617 if (!Connected)
1618 {
1620 }
1622 if (System.Net.NetEventSource.Log.IsEnabled())
1623 {
1624 System.Net.NetEventSource.Info(this, $"::SendFile() SRC:{LocalEndPoint} DST:{RemoteEndPoint} fileName:{fileName}", "SendFile");
1625 }
1627 }
1628
1629 public int SendTo(byte[] buffer, int offset, int size, SocketFlags socketFlags, EndPoint remoteEP)
1630 {
1633 if (remoteEP == null)
1634 {
1635 throw new ArgumentNullException("remoteEP");
1636 }
1638 if (System.Net.NetEventSource.Log.IsEnabled())
1639 {
1640 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint} size:{size} remoteEP:{remoteEP}", "SendTo");
1641 }
1643 int bytesTransferred;
1645 if (socketError != 0)
1646 {
1649 }
1650 else if (SocketsTelemetry.Log.IsEnabled())
1651 {
1653 if (SocketType == SocketType.Dgram)
1654 {
1655 SocketsTelemetry.Log.DatagramSent();
1656 }
1657 }
1658 if (_rightEndPoint == null)
1659 {
1661 }
1662 if (System.Net.NetEventSource.Log.IsEnabled())
1663 {
1664 System.Net.NetEventSource.DumpBuffer(this, buffer, offset, size, "SendTo");
1665 }
1666 return bytesTransferred;
1667 }
1668
1669 public int SendTo(byte[] buffer, int size, SocketFlags socketFlags, EndPoint remoteEP)
1670 {
1671 return SendTo(buffer, 0, size, socketFlags, remoteEP);
1672 }
1673
1675 {
1676 return SendTo(buffer, 0, (buffer != null) ? buffer.Length : 0, socketFlags, remoteEP);
1677 }
1678
1679 public int SendTo(byte[] buffer, EndPoint remoteEP)
1680 {
1681 return SendTo(buffer, 0, (buffer != null) ? buffer.Length : 0, SocketFlags.None, remoteEP);
1682 }
1683
1685 {
1686 return SendTo(buffer, SocketFlags.None, remoteEP);
1687 }
1688
1690 {
1692 if (remoteEP == null)
1693 {
1694 throw new ArgumentNullException("remoteEP");
1695 }
1698 int bytesTransferred;
1700 if (socketError != 0)
1701 {
1704 }
1705 else if (SocketsTelemetry.Log.IsEnabled())
1706 {
1708 if (SocketType == SocketType.Dgram)
1709 {
1710 SocketsTelemetry.Log.DatagramSent();
1711 }
1712 }
1713 if (_rightEndPoint == null)
1714 {
1716 }
1717 return bytesTransferred;
1718 }
1719
1720 public int Receive(byte[] buffer, int size, SocketFlags socketFlags)
1721 {
1722 return Receive(buffer, 0, size, socketFlags);
1723 }
1724
1726 {
1727 return Receive(buffer, 0, (buffer != null) ? buffer.Length : 0, socketFlags);
1728 }
1729
1730 public int Receive(byte[] buffer)
1731 {
1732 return Receive(buffer, 0, (buffer != null) ? buffer.Length : 0, SocketFlags.None);
1733 }
1734
1735 public int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags)
1736 {
1738 int result = Receive(buffer, offset, size, socketFlags, out errorCode);
1739 if (errorCode != 0)
1740 {
1741 throw new SocketException((int)errorCode);
1742 }
1743 return result;
1744 }
1745
1747 {
1751 if (System.Net.NetEventSource.Log.IsEnabled())
1752 {
1753 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint} DST:{RemoteEndPoint} size:{size}", "Receive");
1754 }
1757 if (errorCode != 0)
1758 {
1760 if (System.Net.NetEventSource.Log.IsEnabled())
1761 {
1762 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Receive");
1763 }
1764 return 0;
1765 }
1766 if (SocketsTelemetry.Log.IsEnabled())
1767 {
1768 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
1769 if (SocketType == SocketType.Dgram)
1770 {
1771 SocketsTelemetry.Log.DatagramReceived();
1772 }
1773 }
1774 if (System.Net.NetEventSource.Log.IsEnabled())
1775 {
1777 }
1778 return bytesTransferred;
1779 }
1780
1782 {
1783 return Receive(buffer, SocketFlags.None);
1784 }
1785
1787 {
1789 int result = Receive(buffer, socketFlags, out errorCode);
1790 if (errorCode != 0)
1791 {
1792 throw new SocketException((int)errorCode);
1793 }
1794 return result;
1795 }
1796
1798 {
1803 if (errorCode != 0)
1804 {
1806 if (System.Net.NetEventSource.Log.IsEnabled())
1807 {
1808 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Receive");
1809 }
1810 return 0;
1811 }
1812 if (SocketsTelemetry.Log.IsEnabled())
1813 {
1814 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
1815 if (SocketType == SocketType.Dgram)
1816 {
1817 SocketsTelemetry.Log.DatagramReceived();
1818 }
1819 }
1820 return bytesTransferred;
1821 }
1822
1824 {
1825 return Receive(buffers, SocketFlags.None);
1826 }
1827
1829 {
1831 int result = Receive(buffers, socketFlags, out errorCode);
1832 if (errorCode != 0)
1833 {
1834 throw new SocketException((int)errorCode);
1835 }
1836 return result;
1837 }
1838
1840 {
1842 if (buffers == null)
1843 {
1844 throw new ArgumentNullException("buffers");
1845 }
1846 if (buffers.Count == 0)
1847 {
1848 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_zerolist, "buffers"), "buffers");
1849 }
1851 if (System.Net.NetEventSource.Log.IsEnabled())
1852 {
1853 System.Net.NetEventSource.Info(this, $"SRC:{LocalEndPoint} DST:{RemoteEndPoint}", "Receive");
1854 }
1857 if (errorCode != 0)
1858 {
1860 if (System.Net.NetEventSource.Log.IsEnabled())
1861 {
1862 System.Net.NetEventSource.Error(this, new SocketException((int)errorCode), "Receive");
1863 }
1864 return 0;
1865 }
1866 if (SocketsTelemetry.Log.IsEnabled())
1867 {
1868 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
1869 if (SocketType == SocketType.Dgram)
1870 {
1871 SocketsTelemetry.Log.DatagramReceived();
1872 }
1873 }
1874 return bytesTransferred;
1875 }
1876
1878 {
1889 int bytesTransferred;
1892 if (socketError != 0 && socketError != SocketError.MessageSize)
1893 {
1895 }
1896 else if (SocketsTelemetry.Log.IsEnabled())
1897 {
1898 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
1899 if (socketError == SocketError.Success && SocketType == SocketType.Dgram)
1900 {
1901 SocketsTelemetry.Log.DatagramReceived();
1902 }
1903 }
1904 if (!socketAddress2.Equals(receiveAddress))
1905 {
1906 try
1907 {
1909 }
1910 catch
1911 {
1912 }
1913 if (_rightEndPoint == null)
1914 {
1916 }
1917 }
1918 if (System.Net.NetEventSource.Log.IsEnabled())
1919 {
1920 System.Net.NetEventSource.Error(this, socketError, "ReceiveMessageFrom");
1921 }
1922 return bytesTransferred;
1923 }
1924
1926 {
1928 if (remoteEP == null)
1929 {
1930 throw new ArgumentNullException("remoteEP");
1931 }
1932 if (!CanTryAddressFamily(remoteEP.AddressFamily))
1933 {
1935 }
1936 if (_rightEndPoint == null)
1937 {
1939 }
1947 int bytesTransferred;
1950 if (socketError != 0 && socketError != SocketError.MessageSize)
1951 {
1953 }
1954 else if (SocketsTelemetry.Log.IsEnabled())
1955 {
1956 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
1957 if (socketError == SocketError.Success && SocketType == SocketType.Dgram)
1958 {
1959 SocketsTelemetry.Log.DatagramReceived();
1960 }
1961 }
1962 if (!socketAddress2.Equals(receiveAddress))
1963 {
1964 try
1965 {
1967 }
1968 catch
1969 {
1970 }
1971 if (_rightEndPoint == null)
1972 {
1974 }
1975 }
1976 if (System.Net.NetEventSource.Log.IsEnabled())
1977 {
1978 System.Net.NetEventSource.Error(this, socketError, "ReceiveMessageFrom");
1979 }
1980 return bytesTransferred;
1981 }
1982
1984 {
1990 if (System.Net.NetEventSource.Log.IsEnabled())
1991 {
1992 System.Net.NetEventSource.Info(this, $"SRC{LocalEndPoint} size:{size} remoteEP:{remoteEP}", "ReceiveFrom");
1993 }
1997 int bytesTransferred;
2000 SocketException ex = null;
2001 if (socketError != 0)
2002 {
2003 ex = new SocketException((int)socketError);
2005 if (System.Net.NetEventSource.Log.IsEnabled())
2006 {
2007 System.Net.NetEventSource.Error(this, ex, "ReceiveFrom");
2008 }
2009 if (ex.SocketErrorCode != SocketError.MessageSize)
2010 {
2011 throw ex;
2012 }
2013 }
2014 else if (SocketsTelemetry.Log.IsEnabled())
2015 {
2016 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
2017 if (SocketType == SocketType.Dgram)
2018 {
2019 SocketsTelemetry.Log.DatagramReceived();
2020 }
2021 }
2022 if (!socketAddress2.Equals(socketAddress))
2023 {
2024 try
2025 {
2026 remoteEP = remoteEP2.Create(socketAddress);
2027 }
2028 catch
2029 {
2030 }
2031 if (_rightEndPoint == null)
2032 {
2034 }
2035 }
2036 if (ex != null)
2037 {
2038 throw ex;
2039 }
2040 if (System.Net.NetEventSource.Log.IsEnabled())
2041 {
2042 System.Net.NetEventSource.DumpBuffer(this, buffer, offset, size, "ReceiveFrom");
2043 }
2044 return bytesTransferred;
2045 }
2046
2048 {
2049 return ReceiveFrom(buffer, 0, size, socketFlags, ref remoteEP);
2050 }
2051
2053 {
2054 return ReceiveFrom(buffer, 0, (buffer != null) ? buffer.Length : 0, socketFlags, ref remoteEP);
2055 }
2056
2058 {
2059 return ReceiveFrom(buffer, 0, (buffer != null) ? buffer.Length : 0, SocketFlags.None, ref remoteEP);
2060 }
2061
2063 {
2064 return ReceiveFrom(buffer, SocketFlags.None, ref remoteEP);
2065 }
2066
2068 {
2076 int bytesTransferred;
2079 SocketException ex = null;
2080 if (socketError != 0)
2081 {
2082 ex = new SocketException((int)socketError);
2084 if (System.Net.NetEventSource.Log.IsEnabled())
2085 {
2086 System.Net.NetEventSource.Error(this, ex, "ReceiveFrom");
2087 }
2088 if (ex.SocketErrorCode != SocketError.MessageSize)
2089 {
2090 throw ex;
2091 }
2092 }
2093 else if (SocketsTelemetry.Log.IsEnabled())
2094 {
2095 SocketsTelemetry.Log.BytesReceived(bytesTransferred);
2096 if (SocketType == SocketType.Dgram)
2097 {
2098 SocketsTelemetry.Log.DatagramReceived();
2099 }
2100 }
2101 if (!socketAddress2.Equals(socketAddress))
2102 {
2103 try
2104 {
2105 remoteEP = remoteEP2.Create(socketAddress);
2106 }
2107 catch
2108 {
2109 }
2110 if (_rightEndPoint == null)
2111 {
2113 }
2114 }
2115 if (ex != null)
2116 {
2117 throw ex;
2118 }
2119 return bytesTransferred;
2120 }
2121
2122 public int IOControl(int ioControlCode, byte[]? optionInValue, byte[]? optionOutValue)
2123 {
2125 int optionLength = 0;
2127 if (System.Net.NetEventSource.Log.IsEnabled())
2128 {
2129 System.Net.NetEventSource.Info(this, $"WindowsIoctl returns errorCode:{socketError}", "IOControl");
2130 }
2131 if (socketError != 0)
2132 {
2134 }
2135 return optionLength;
2136 }
2137
2142
2144 {
2146 if (System.Net.NetEventSource.Log.IsEnabled())
2147 {
2148 System.Net.NetEventSource.Info(this, $"optionLevel:{optionLevel} optionName:{optionName} optionValue:{optionValue}", "SetSocketOption");
2149 }
2151 }
2152
2154 {
2156 if (System.Net.NetEventSource.Log.IsEnabled())
2157 {
2158 System.Net.NetEventSource.Info(this, $"optionLevel:{optionLevel} optionName:{optionName} optionValue:{optionValue}", "SetSocketOption");
2159 }
2161 if (System.Net.NetEventSource.Log.IsEnabled())
2162 {
2163 System.Net.NetEventSource.Info(this, $"SetSockOpt returns errorCode:{socketError}", "SetSocketOption");
2164 }
2165 if (socketError != 0)
2166 {
2168 }
2169 }
2170
2175
2177 {
2179 if (optionValue == null)
2180 {
2181 throw new ArgumentNullException("optionValue");
2182 }
2183 if (System.Net.NetEventSource.Log.IsEnabled())
2184 {
2185 System.Net.NetEventSource.Info(this, $"optionLevel:{optionLevel} optionName:{optionName} optionValue:{optionValue}", "SetSocketOption");
2186 }
2187 if (optionLevel == SocketOptionLevel.Socket && optionName == SocketOptionName.Linger)
2188 {
2190 {
2191 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_invalid_optionValue, "LingerOption"), "optionValue");
2192 }
2193 if (lingerOption.LingerTime < 0 || lingerOption.LingerTime > 65535)
2194 {
2195 throw new ArgumentException(System.SR.Format(System.SR.ArgumentOutOfRange_Bounds_Lower_Upper_Named, 0, 65535, "optionValue.LingerTime"), "optionValue");
2196 }
2198 }
2199 else if (optionLevel == SocketOptionLevel.IP && (optionName == SocketOptionName.AddMembership || optionName == SocketOptionName.DropMembership))
2200 {
2202 {
2203 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_invalid_optionValue, "MulticastOption"), "optionValue");
2204 }
2206 }
2207 else
2208 {
2209 if (optionLevel != SocketOptionLevel.IPv6 || (optionName != SocketOptionName.AddMembership && optionName != SocketOptionName.DropMembership))
2210 {
2212 }
2214 {
2215 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_invalid_optionValue, "IPv6MulticastOption"), "optionValue");
2216 }
2218 }
2219 }
2220
2222 {
2225 if (System.Net.NetEventSource.Log.IsEnabled())
2226 {
2227 System.Net.NetEventSource.Info(this, $"SetSockOpt optionLevel:{optionLevel} optionName:{optionName} returns errorCode:{socketError}", "SetRawSocketOption");
2228 }
2229 if (socketError != 0)
2230 {
2232 }
2233 }
2234
2236 {
2238 if (optionLevel == SocketOptionLevel.Socket && optionName == SocketOptionName.Linger)
2239 {
2240 return GetLingerOpt();
2241 }
2242 if (optionLevel == SocketOptionLevel.IP && (optionName == SocketOptionName.AddMembership || optionName == SocketOptionName.DropMembership))
2243 {
2245 }
2246 if (optionLevel == SocketOptionLevel.IPv6 && (optionName == SocketOptionName.AddMembership || optionName == SocketOptionName.DropMembership))
2247 {
2249 }
2250 int optionValue = 0;
2252 if (System.Net.NetEventSource.Log.IsEnabled())
2253 {
2254 System.Net.NetEventSource.Info(this, $"GetSockOpt returns errorCode:{sockOpt}", "GetSocketOption");
2255 }
2256 if (sockOpt != 0)
2257 {
2259 }
2260 return optionValue;
2261 }
2262
2264 {
2266 int optionLength = ((optionValue != null) ? optionValue.Length : 0);
2268 if (System.Net.NetEventSource.Log.IsEnabled())
2269 {
2270 System.Net.NetEventSource.Info(this, $"GetSockOpt returns errorCode:{sockOpt}", "GetSocketOption");
2271 }
2272 if (sockOpt != 0)
2273 {
2275 }
2276 }
2277
2279 {
2281 byte[] array = new byte[optionLength];
2284 if (System.Net.NetEventSource.Log.IsEnabled())
2285 {
2286 System.Net.NetEventSource.Info(this, $"GetSockOpt returns errorCode:{sockOpt}", "GetSocketOption");
2287 }
2288 if (sockOpt != 0)
2289 {
2291 }
2293 {
2294 byte[] array2 = new byte[optionLength2];
2296 array = array2;
2297 }
2298 return array;
2299 }
2300
2302 {
2304 int optionLength = optionValue.Length;
2306 if (System.Net.NetEventSource.Log.IsEnabled())
2307 {
2308 System.Net.NetEventSource.Info(this, $"GetRawSockOpt optionLevel:{optionLevel} optionName:{optionName} returned errorCode:{rawSockOpt}", "GetRawSocketOption");
2309 }
2310 if (rawSockOpt != 0)
2311 {
2313 }
2314 return optionLength;
2315 }
2316
2317 [SupportedOSPlatform("windows")]
2319 {
2320 if (level == IPProtectionLevel.Unspecified)
2321 {
2323 }
2324 if (_addressFamily == AddressFamily.InterNetworkV6)
2325 {
2326 SocketPal.SetIPProtectionLevel(this, SocketOptionLevel.IPv6, (int)level);
2327 return;
2328 }
2329 if (_addressFamily == AddressFamily.InterNetwork)
2330 {
2331 SocketPal.SetIPProtectionLevel(this, SocketOptionLevel.IP, (int)level);
2332 return;
2333 }
2335 }
2336
2337 public bool Poll(int microSeconds, SelectMode mode)
2338 {
2340 bool status;
2342 if (System.Net.NetEventSource.Log.IsEnabled())
2343 {
2344 System.Net.NetEventSource.Info(this, $"Poll returns socketCount:{(int)socketError}", "Poll");
2345 }
2346 if (socketError != 0)
2347 {
2349 }
2350 return status;
2351 }
2352
2354 {
2355 if ((checkRead == null || checkRead.Count == 0) && (checkWrite == null || checkWrite.Count == 0) && (checkError == null || checkError.Count == 0))
2356 {
2358 }
2359 if (checkRead != null && checkRead.Count > 65536)
2360 {
2361 throw new ArgumentOutOfRangeException("checkRead", System.SR.Format(System.SR.net_sockets_toolarge_select, "checkRead", 65536.ToString()));
2362 }
2363 if (checkWrite != null && checkWrite.Count > 65536)
2364 {
2365 throw new ArgumentOutOfRangeException("checkWrite", System.SR.Format(System.SR.net_sockets_toolarge_select, "checkWrite", 65536.ToString()));
2366 }
2367 if (checkError != null && checkError.Count > 65536)
2368 {
2369 throw new ArgumentOutOfRangeException("checkError", System.SR.Format(System.SR.net_sockets_toolarge_select, "checkError", 65536.ToString()));
2370 }
2372 if (socketError != 0)
2373 {
2374 throw new SocketException((int)socketError);
2375 }
2376 }
2377
2378 public IAsyncResult BeginConnect(EndPoint remoteEP, AsyncCallback? callback, object? state)
2379 {
2381 }
2382
2383 public IAsyncResult BeginConnect(string host, int port, AsyncCallback? requestCallback, object? state)
2384 {
2386 }
2387
2388 public IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback? requestCallback, object? state)
2389 {
2391 }
2392
2397
2403
2404 public IAsyncResult BeginDisconnect(bool reuseSocket, AsyncCallback? callback, object? state)
2405 {
2407 }
2408
2409 public void Disconnect(bool reuseSocket)
2410 {
2414 if (System.Net.NetEventSource.Log.IsEnabled())
2415 {
2416 System.Net.NetEventSource.Info(this, $"UnsafeNclNativeMethods.OSSOCK.DisConnectEx returns:{socketError}", "Disconnect");
2417 }
2418 if (socketError != 0)
2419 {
2421 }
2423 _remoteEndPoint = null;
2424 _localEndPoint = null;
2425 }
2426
2432
2433 public IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback? callback, object? state)
2434 {
2438 }
2439
2440 public IAsyncResult? BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
2441 {
2445 if (task.IsFaulted || task.IsCanceled)
2446 {
2448 return null;
2449 }
2450 errorCode = SocketError.Success;
2451 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2452 }
2453
2455 {
2458 }
2459
2461 {
2464 if (task.IsFaulted || task.IsCanceled)
2465 {
2467 return null;
2468 }
2469 errorCode = SocketError.Success;
2470 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2471 }
2472
2474 {
2477 }
2478
2483
2484 public IAsyncResult BeginSendFile(string? fileName, AsyncCallback? callback, object? state)
2485 {
2486 return BeginSendFile(fileName, null, null, TransmitFileOptions.UseDefaultWorkerThread, callback, state);
2487 }
2488
2489 public IAsyncResult BeginSendFile(string? fileName, byte[]? preBuffer, byte[]? postBuffer, TransmitFileOptions flags, AsyncCallback? callback, object? state)
2490 {
2492 if (!Connected)
2493 {
2495 }
2496 if (System.Net.NetEventSource.Log.IsEnabled())
2497 {
2498 System.Net.NetEventSource.Info(this, $"::DoBeginSendFile() SRC:{LocalEndPoint} DST:{RemoteEndPoint} fileName:{fileName}", "BeginSendFile");
2499 }
2500 return System.Threading.Tasks.TaskToApm.Begin(SendFileAsync(fileName, preBuffer, postBuffer, flags).AsTask(), callback, state);
2501 }
2502
2504 {
2506 if (asyncResult == null)
2507 {
2508 throw new ArgumentNullException("asyncResult");
2509 }
2511 }
2512
2513 public IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, SocketFlags socketFlags, EndPoint remoteEP, AsyncCallback? callback, object? state)
2514 {
2517 if (remoteEP == null)
2518 {
2519 throw new ArgumentNullException("remoteEP");
2520 }
2521 Task<int> task = SendToAsync(buffer.AsMemory(offset, size), socketFlags, remoteEP).AsTask();
2522 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2523 }
2524
2526 {
2529 }
2530
2531 public IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback? callback, object? state)
2532 {
2536 }
2537
2538 public IAsyncResult? BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
2539 {
2543 if (task.IsFaulted || task.IsCanceled)
2544 {
2546 return null;
2547 }
2548 errorCode = SocketError.Success;
2549 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2550 }
2551
2557
2559 {
2562 if (task.IsFaulted || task.IsCanceled)
2563 {
2565 return null;
2566 }
2567 errorCode = SocketError.Success;
2568 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2569 }
2570
2572 {
2575 }
2576
2581
2583 {
2586 {
2587 throw new ArgumentException(null, "asyncResult");
2588 }
2589 if (!task.IsCompleted)
2590 {
2591 ((IAsyncResult)task).AsyncWaitHandle.WaitOne();
2592 }
2593 if (task.IsCompletedSuccessfully)
2594 {
2595 errorCode = SocketError.Success;
2596 return task.Result;
2597 }
2599 return 0;
2600 }
2601
2602 public IAsyncResult BeginReceiveMessageFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP, AsyncCallback? callback, object? state)
2603 {
2604 if (System.Net.NetEventSource.Log.IsEnabled())
2605 {
2606 System.Net.NetEventSource.Info(this, $"size:{size}", "BeginReceiveMessageFrom");
2607 }
2612 if (task.IsCompletedSuccessfully)
2613 {
2614 EndPoint remoteEndPoint = task.Result.RemoteEndPoint;
2615 if (!remoteEP.Equals(remoteEndPoint))
2616 {
2618 }
2619 }
2621 if (System.Net.NetEventSource.Log.IsEnabled())
2622 {
2623 System.Net.NetEventSource.Info(this, $"size:{size} returning AsyncResult:{asyncResult}", "BeginReceiveMessageFrom");
2624 }
2625 return asyncResult;
2626 }
2627
2648
2649 public IAsyncResult BeginReceiveFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP, AsyncCallback? callback, object? state)
2650 {
2655 if (task.IsCompletedSuccessfully)
2656 {
2657 EndPoint remoteEndPoint = task.Result.RemoteEndPoint;
2658 if (!remoteEP.Equals(remoteEndPoint))
2659 {
2661 }
2662 }
2663 return System.Threading.Tasks.TaskToApm.Begin(task, callback, state);
2664 }
2665
2667 {
2669 if (endPoint == null)
2670 {
2671 throw new ArgumentNullException("endPoint");
2672 }
2673 if (!CanTryAddressFamily(endPoint.AddressFamily))
2674 {
2676 }
2678 if (!endPoint.Equals(socketReceiveFromResult.RemoteEndPoint))
2679 {
2680 endPoint = socketReceiveFromResult.RemoteEndPoint;
2681 }
2682 return socketReceiveFromResult.ReceivedBytes;
2683 }
2684
2685 public IAsyncResult BeginAccept(AsyncCallback? callback, object? state)
2686 {
2687 return System.Threading.Tasks.TaskToApm.Begin(AcceptAsync(), callback, state);
2688 }
2689
2695
2697 {
2698 if (receiveSize < 0)
2699 {
2700 throw new ArgumentOutOfRangeException("receiveSize");
2701 }
2703 byte[] buffer;
2704 int item;
2705 if (receiveSize == 0)
2706 {
2707 buffer = Array.Empty<byte>();
2708 item = 0;
2709 }
2710 else
2711 {
2712 buffer = new byte[receiveSize];
2713 try
2714 {
2715 item = await s.ReceiveAsync(buffer, SocketFlags.None).ConfigureAwait(continueOnCapturedContext: false);
2716 }
2717 catch
2718 {
2719 s.Dispose();
2720 throw;
2721 }
2722 }
2723 return (s: s, buffer: buffer, bytesReceived: item);
2724 }
2725
2726 public IAsyncResult BeginAccept(int receiveSize, AsyncCallback? callback, object? state)
2727 {
2728 return BeginAccept(null, receiveSize, callback, state);
2729 }
2730
2731 public IAsyncResult BeginAccept(Socket? acceptSocket, int receiveSize, AsyncCallback? callback, object? state)
2732 {
2734 }
2735
2737 {
2738 byte[] buffer2;
2739 int bytesTransferred;
2741 buffer = new byte[bytesTransferred];
2743 return result;
2744 }
2745
2747 {
2749 Socket result;
2751 return result;
2752 }
2753
2755 {
2757 if (System.Net.NetEventSource.Log.IsEnabled())
2758 {
2759 System.Net.NetEventSource.Info(this, $"how:{how}", "Shutdown");
2760 }
2762 if (System.Net.NetEventSource.Log.IsEnabled())
2763 {
2764 System.Net.NetEventSource.Info(this, $"Shutdown returns errorCode:{socketError}", "Shutdown");
2765 }
2766 if (socketError != 0 && socketError != SocketError.NotSocket)
2767 {
2769 }
2772 }
2773
2775 {
2777 }
2778
2780 {
2782 if (e == null)
2783 {
2784 throw new ArgumentNullException("e");
2785 }
2786 if (e.HasMultipleBuffers)
2787 {
2789 }
2790 if (_rightEndPoint == null)
2791 {
2793 }
2794 if (!_isListening)
2795 {
2797 }
2798 e.AcceptSocket = GetOrCreateAcceptSocket(e.AcceptSocket, checkDisconnected: true, "AcceptSocket", out var handle);
2799 if (SocketsTelemetry.Log.IsEnabled())
2800 {
2801 SocketsTelemetry.Log.AcceptStart(_rightEndPoint);
2802 }
2806 try
2807 {
2809 }
2810 catch (Exception ex)
2811 {
2812 if (SocketsTelemetry.Log.IsEnabled())
2813 {
2814 SocketsTelemetry.Log.AfterAccept(SocketError.Interrupted, ex.Message);
2815 }
2816 e.Complete();
2817 throw;
2818 }
2819 return socketError == SocketError.IOPending;
2820 }
2821
2823 {
2824 return ConnectAsync(e, userSocket: true, saeaCancelable: true);
2825 }
2826
2828 {
2830 if (e == null)
2831 {
2832 throw new ArgumentNullException("e");
2833 }
2834 if (e.HasMultipleBuffers)
2835 {
2836 throw new ArgumentException(System.SR.net_multibuffernotsupported, "BufferList");
2837 }
2838 if (e.RemoteEndPoint == null)
2839 {
2840 throw new ArgumentNullException("remoteEP");
2841 }
2842 if (_isListening)
2843 {
2845 }
2846 if (_isConnected)
2847 {
2848 throw new SocketException(10056);
2849 }
2852 {
2853 if (System.Net.NetEventSource.Log.IsEnabled())
2854 {
2856 }
2857 if (dnsEndPoint.AddressFamily != 0 && !CanTryAddressFamily(dnsEndPoint.AddressFamily))
2858 {
2860 }
2863 try
2864 {
2866 }
2867 catch
2868 {
2869 e.Complete();
2870 throw;
2871 }
2872 }
2874 {
2876 }
2877 e._socketAddress = Serialize(ref remoteEP);
2881 if (SocketsTelemetry.Log.IsEnabled())
2882 {
2883 SocketsTelemetry.Log.ConnectStart(e._socketAddress);
2884 }
2887 try
2888 {
2889 SocketError socketError = ((_socketType == SocketType.Stream && remoteEP.AddressFamily != AddressFamily.Unix) ? e.DoOperationConnectEx(this, _handle) : e.DoOperationConnect(this, _handle));
2890 return socketError == SocketError.IOPending;
2891 }
2892 catch (Exception ex)
2893 {
2894 if (SocketsTelemetry.Log.IsEnabled())
2895 {
2896 SocketsTelemetry.Log.AfterConnect(SocketError.NotSocket, ex.Message);
2897 }
2898 _localEndPoint = null;
2899 e.Complete();
2900 throw;
2901 }
2902 }
2903
2905 {
2906 if (e == null)
2907 {
2908 throw new ArgumentNullException("e");
2909 }
2910 if (e.HasMultipleBuffers)
2911 {
2913 }
2914 if (e.RemoteEndPoint == null)
2915 {
2916 throw new ArgumentException(System.SR.Format(System.SR.InvalidNullArgument, "e.RemoteEndPoint"), "e");
2917 }
2920 {
2921 Socket socket = ((dnsEndPoint.AddressFamily != 0) ? new Socket(dnsEndPoint.AddressFamily, socketType, protocolType) : null);
2924 try
2925 {
2927 }
2928 catch
2929 {
2930 e.Complete();
2931 throw;
2932 }
2933 }
2935 return socket2.ConnectAsync(e, userSocket: false, saeaCancelable: true);
2936 }
2937
2939 {
2940 if (_rightEndPoint == null)
2941 {
2943 switch (addressFamily)
2944 {
2945 default:
2946 return;
2947 case AddressFamily.InterNetwork:
2949 break;
2950 case AddressFamily.InterNetworkV6:
2952 break;
2953 }
2954 if (System.Net.NetEventSource.Log.IsEnabled())
2955 {
2956 System.Net.NetEventSource.Info(this, cachedSerializedEndPoint.IPEndPoint, "WildcardBindForConnectIfNecessary");
2957 }
2958 if (_socketType == SocketType.Stream && _protocolType == ProtocolType.Tcp)
2959 {
2961 }
2962 DoBind(cachedSerializedEndPoint.IPEndPoint, cachedSerializedEndPoint.SocketAddress);
2963 }
2964 }
2965
2967 {
2968 if (e == null)
2969 {
2970 throw new ArgumentNullException("e");
2971 }
2973 }
2974
2976 {
2977 return DisconnectAsync(e, default(CancellationToken));
2978 }
2979
2981 {
2983 if (e == null)
2984 {
2985 throw new ArgumentNullException("e");
2986 }
2987 e.StartOperationCommon(this, SocketAsyncOperation.Disconnect);
2989 try
2990 {
2992 }
2993 catch
2994 {
2995 e.Complete();
2996 throw;
2997 }
2998 return socketError == SocketError.IOPending;
2999 }
3000
3002 {
3003 return ReceiveAsync(e, default(CancellationToken));
3004 }
3005
3007 {
3009 if (e == null)
3010 {
3011 throw new ArgumentNullException("e");
3012 }
3015 try
3016 {
3018 }
3019 catch
3020 {
3021 e.Complete();
3022 throw;
3023 }
3024 return socketError == SocketError.IOPending;
3025 }
3026
3028 {
3029 return ReceiveFromAsync(e, default(CancellationToken));
3030 }
3031
3033 {
3035 if (e == null)
3036 {
3037 throw new ArgumentNullException("e");
3038 }
3039 if (e.RemoteEndPoint == null)
3040 {
3041 throw new ArgumentException(System.SR.Format(System.SR.InvalidNullArgument, "e.RemoteEndPoint"), "e");
3042 }
3044 {
3046 }
3049 e._socketAddress = Serialize(ref remoteEP);
3050 e.RemoteEndPoint = remoteEP;
3051 e.StartOperationCommon(this, SocketAsyncOperation.ReceiveFrom);
3053 try
3054 {
3056 }
3057 catch
3058 {
3059 e.Complete();
3060 throw;
3061 }
3062 return socketError == SocketError.IOPending;
3063 }
3064
3066 {
3067 return ReceiveMessageFromAsync(e, default(CancellationToken));
3068 }
3069
3071 {
3073 if (e == null)
3074 {
3075 throw new ArgumentNullException("e");
3076 }
3077 if (e.RemoteEndPoint == null)
3078 {
3079 throw new ArgumentException(System.SR.Format(System.SR.InvalidNullArgument, "e.RemoteEndPoint"), "e");
3080 }
3082 {
3084 }
3087 e._socketAddress = Serialize(ref remoteEP);
3088 e.RemoteEndPoint = remoteEP;
3090 e.StartOperationCommon(this, SocketAsyncOperation.ReceiveMessageFrom);
3092 try
3093 {
3095 }
3096 catch
3097 {
3098 e.Complete();
3099 throw;
3100 }
3101 return socketError == SocketError.IOPending;
3102 }
3103
3105 {
3106 return SendAsync(e, default(CancellationToken));
3107 }
3108
3110 {
3112 if (e == null)
3113 {
3114 throw new ArgumentNullException("e");
3115 }
3118 try
3119 {
3121 }
3122 catch
3123 {
3124 e.Complete();
3125 throw;
3126 }
3127 return socketError == SocketError.IOPending;
3128 }
3129
3131 {
3132 return SendPacketsAsync(e, default(CancellationToken));
3133 }
3134
3136 {
3138 if (e == null)
3139 {
3140 throw new ArgumentNullException("e");
3141 }
3142 if (e.SendPacketsElements == null)
3143 {
3144 throw new ArgumentException(System.SR.Format(System.SR.InvalidNullArgument, "e.SendPacketsElements"), "e");
3145 }
3146 if (!Connected)
3147 {
3149 }
3150 e.StartOperationCommon(this, SocketAsyncOperation.SendPackets);
3152 try
3153 {
3155 }
3156 catch (Exception)
3157 {
3158 e.Complete();
3159 throw;
3160 }
3161 return socketError == SocketError.IOPending;
3162 }
3163
3165 {
3166 return SendToAsync(e, default(CancellationToken));
3167 }
3168
3170 {
3172 if (e == null)
3173 {
3174 throw new ArgumentNullException("e");
3175 }
3176 if (e.RemoteEndPoint == null)
3177 {
3178 throw new ArgumentException(System.SR.Format(System.SR.InvalidNullArgument, "e.RemoteEndPoint"), "e");
3179 }
3181 e._socketAddress = Serialize(ref remoteEP);
3184 if (_rightEndPoint == null)
3185 {
3187 }
3189 try
3190 {
3192 }
3193 catch
3194 {
3196 _localEndPoint = null;
3197 e.Complete();
3198 throw;
3199 }
3201 {
3203 _localEndPoint = null;
3204 }
3205 return socketError == SocketError.IOPending;
3206 }
3207
3209 {
3210 bool flag = socketAddress.Family == AddressFamily.InterNetworkV6 && socketAddress.GetIPAddress().IsIPv4MappedToIPv6;
3211 isIPv4 = addressFamily == AddressFamily.InterNetwork || flag;
3212 isIPv6 = addressFamily == AddressFamily.InterNetworkV6;
3213 }
3214
3215 internal static int GetAddressSize(EndPoint endPoint)
3216 {
3217 return endPoint.AddressFamily switch
3218 {
3219 AddressFamily.InterNetworkV6 => 28,
3220 AddressFamily.InterNetwork => 16,
3221 _ => endPoint.Serialize().Size,
3222 };
3223 }
3224
3226 {
3228 {
3229 IPAddress address = iPEndPoint.Address;
3230 if (address.AddressFamily == AddressFamily.InterNetwork && IsDualMode)
3231 {
3232 address = address.MapToIPv6();
3233 remoteEP = new IPEndPoint(address, iPEndPoint.Port);
3234 }
3235 }
3236 else if (remoteEP is DnsEndPoint)
3237 {
3238 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_invalid_dnsendpoint, "remoteEP"), "remoteEP");
3239 }
3241 }
3242
3244 {
3245 if (SocketsTelemetry.Log.IsEnabled())
3246 {
3247 SocketsTelemetry.Log.ConnectStart(socketAddress);
3248 }
3250 try
3251 {
3252 socketError = SocketPal.Connect(_handle, socketAddress.Buffer, socketAddress.Size);
3253 }
3254 catch (Exception ex)
3255 {
3256 if (SocketsTelemetry.Log.IsEnabled())
3257 {
3258 SocketsTelemetry.Log.AfterConnect(SocketError.NotSocket, ex.Message);
3259 }
3260 throw;
3261 }
3262 if (socketError != 0)
3263 {
3267 if (System.Net.NetEventSource.Log.IsEnabled())
3268 {
3269 System.Net.NetEventSource.Error(this, ex2, "DoConnect");
3270 }
3271 if (SocketsTelemetry.Log.IsEnabled())
3272 {
3273 SocketsTelemetry.Log.AfterConnect(socketError);
3274 }
3275 throw ex2;
3276 }
3277 if (SocketsTelemetry.Log.IsEnabled())
3278 {
3279 SocketsTelemetry.Log.AfterConnect(SocketError.Success);
3280 }
3281 if (System.Net.NetEventSource.Log.IsEnabled())
3282 {
3283 System.Net.NetEventSource.Info(this, $"connection to:{endPointSnapshot}", "DoConnect");
3284 }
3288 if (System.Net.NetEventSource.Log.IsEnabled())
3289 {
3291 }
3292 }
3293
3294 protected virtual void Dispose(bool disposing)
3295 {
3296 if (System.Net.NetEventSource.Log.IsEnabled())
3297 {
3298 try
3299 {
3300 System.Net.NetEventSource.Info(this, $"disposing:{disposing} Disposed:{Disposed}", "Dispose");
3301 }
3303 {
3304 }
3305 }
3306 if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 1)
3307 {
3308 return;
3309 }
3312 if (handle != null && handle.OwnsHandle)
3313 {
3314 if (!disposing)
3315 {
3316 if (System.Net.NetEventSource.Log.IsEnabled())
3317 {
3318 System.Net.NetEventSource.Info(this, "Calling _handle.Dispose()", "Dispose");
3319 }
3320 handle.Dispose();
3321 }
3322 else
3323 {
3324 try
3325 {
3327 if (closeTimeout == 0)
3328 {
3329 if (System.Net.NetEventSource.Log.IsEnabled())
3330 {
3331 System.Net.NetEventSource.Info(this, "Calling _handle.CloseAsIs()", "Dispose");
3332 }
3333 handle.CloseAsIs(abortive: true);
3334 }
3335 else
3336 {
3338 {
3339 bool willBlock;
3341 if (System.Net.NetEventSource.Log.IsEnabled())
3342 {
3343 System.Net.NetEventSource.Info(this, $"handle:{handle} ioctlsocket(FIONBIO):{socketError}", "Dispose");
3344 }
3345 }
3346 if (closeTimeout < 0)
3347 {
3348 if (System.Net.NetEventSource.Log.IsEnabled())
3349 {
3350 System.Net.NetEventSource.Info(this, "Calling _handle.CloseAsIs()", "Dispose");
3351 }
3352 handle.CloseAsIs(abortive: false);
3353 }
3354 else
3355 {
3357 if (System.Net.NetEventSource.Log.IsEnabled())
3358 {
3359 System.Net.NetEventSource.Info(this, $"handle:{handle} shutdown():{socketError}", "Dispose");
3360 }
3362 if (System.Net.NetEventSource.Log.IsEnabled())
3363 {
3364 System.Net.NetEventSource.Info(this, $"handle:{handle} setsockopt():{socketError}", "Dispose");
3365 }
3366 if (socketError != 0)
3367 {
3368 handle.CloseAsIs(abortive: true);
3369 }
3370 else
3371 {
3372 socketError = SocketPal.Receive(handle, Array.Empty<byte>(), 0, 0, SocketFlags.None, out var _);
3373 if (System.Net.NetEventSource.Log.IsEnabled())
3374 {
3375 System.Net.NetEventSource.Info(this, $"handle:{handle} recv():{socketError}", "Dispose");
3376 }
3377 if (socketError != 0)
3378 {
3379 handle.CloseAsIs(abortive: true);
3380 }
3381 else
3382 {
3383 int available = 0;
3385 if (System.Net.NetEventSource.Log.IsEnabled())
3386 {
3387 System.Net.NetEventSource.Info(this, $"handle:{handle} ioctlsocket(FIONREAD):{socketError}", "Dispose");
3388 }
3389 if (socketError != 0 || available != 0)
3390 {
3391 handle.CloseAsIs(abortive: true);
3392 }
3393 else
3394 {
3395 handle.CloseAsIs(abortive: false);
3396 }
3397 }
3398 }
3399 }
3400 }
3401 }
3403 {
3404 }
3405 }
3407 {
3408 try
3409 {
3410 File.Delete(unixDomainSocketEndPoint.BoundFileName);
3411 }
3412 catch
3413 {
3414 }
3415 }
3416 }
3418 }
3419
3420 public void Dispose()
3421 {
3422 if (System.Net.NetEventSource.Log.IsEnabled())
3423 {
3424 System.Net.NetEventSource.Info(this, $"timeout = {_closeTimeout}", "Dispose");
3425 }
3426 Dispose(disposing: true);
3427 GC.SuppressFinalize(this);
3428 }
3429
3431 {
3432 Dispose(disposing: false);
3433 }
3434
3436 {
3437 if (Disposed || _handle.IsInvalid)
3438 {
3439 return;
3440 }
3441 try
3442 {
3444 }
3446 {
3447 }
3448 }
3449
3451 {
3453 {
3455 if (_addressFamily == AddressFamily.InterNetwork)
3456 {
3457 SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, optionValue: true);
3458 }
3459 if (iPAddress != null && IsDualMode && (iPAddress.IsIPv4MappedToIPv6 || iPAddress.Equals(IPAddress.IPv6Any)))
3460 {
3462 }
3463 if (_addressFamily == AddressFamily.InterNetworkV6 && (iPAddress == null || !iPAddress.IsIPv4MappedToIPv6))
3464 {
3465 SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.PacketInformation, optionValue: true);
3466 }
3468 }
3469 }
3470
3472 {
3473 if (silent && (Disposed || _handle.IsInvalid))
3474 {
3475 if (System.Net.NetEventSource.Log.IsEnabled())
3476 {
3477 System.Net.NetEventSource.Info(this, "skipping the call", "SetSocketOption");
3478 }
3479 return;
3480 }
3482 try
3483 {
3485 if (System.Net.NetEventSource.Log.IsEnabled())
3486 {
3487 System.Net.NetEventSource.Info(this, $"SetSockOpt returns errorCode:{socketError}", "SetSocketOption");
3488 }
3489 }
3490 catch
3491 {
3492 if (silent && _handle.IsInvalid)
3493 {
3494 return;
3495 }
3496 throw;
3497 }
3498 if (optionName == SocketOptionName.PacketInformation && optionValue == 0 && socketError == SocketError.Success)
3499 {
3501 }
3502 if (!silent && socketError != 0)
3503 {
3505 }
3506 }
3507
3509 {
3511 if (System.Net.NetEventSource.Log.IsEnabled())
3512 {
3513 System.Net.NetEventSource.Info(this, $"SetMulticastOption returns errorCode:{socketError}", "SetMulticastOption");
3514 }
3515 if (socketError != 0)
3516 {
3518 }
3519 }
3520
3522 {
3524 if (System.Net.NetEventSource.Log.IsEnabled())
3525 {
3526 System.Net.NetEventSource.Info(this, $"SetIPv6MulticastOption returns errorCode:{socketError}", "SetIPv6MulticastOption");
3527 }
3528 if (socketError != 0)
3529 {
3531 }
3532 }
3533
3535 {
3537 if (System.Net.NetEventSource.Log.IsEnabled())
3538 {
3539 System.Net.NetEventSource.Info(this, $"SetLingerOption returns errorCode:{socketError}", "SetLingerOption");
3540 }
3541 if (socketError != 0)
3542 {
3544 }
3545 }
3546
3548 {
3551 if (System.Net.NetEventSource.Log.IsEnabled())
3552 {
3553 System.Net.NetEventSource.Info(this, $"GetLingerOption returns errorCode:{lingerOption}", "GetLingerOpt");
3554 }
3555 if (lingerOption != 0)
3556 {
3558 }
3559 return optionValue;
3560 }
3561
3563 {
3566 if (System.Net.NetEventSource.Log.IsEnabled())
3567 {
3568 System.Net.NetEventSource.Info(this, $"GetMulticastOption returns errorCode:{multicastOption}", "GetMulticastOpt");
3569 }
3570 if (multicastOption != 0)
3571 {
3573 }
3574 return optionValue;
3575 }
3576
3578 {
3581 if (System.Net.NetEventSource.Log.IsEnabled())
3582 {
3583 System.Net.NetEventSource.Info(this, $"GetIPv6MulticastOption returns errorCode:{iPv6MulticastOption}", "GetIPv6MulticastOpt");
3584 }
3585 if (iPv6MulticastOption != 0)
3586 {
3588 }
3589 return optionValue;
3590 }
3591
3592 private SocketError InternalSetBlocking(bool desired, out bool current)
3593 {
3594 if (Disposed)
3595 {
3596 current = _willBlock;
3597 return SocketError.Success;
3598 }
3599 bool willBlock = false;
3601 try
3602 {
3604 }
3606 {
3607 socketError = SocketError.NotSocket;
3608 }
3609 if (System.Net.NetEventSource.Log.IsEnabled())
3610 {
3611 System.Net.NetEventSource.Info(this, $"SetBlocking returns errorCode:{socketError}", "InternalSetBlocking");
3612 }
3613 if (socketError == SocketError.Success)
3614 {
3616 }
3617 if (System.Net.NetEventSource.Log.IsEnabled())
3618 {
3619 System.Net.NetEventSource.Info(this, $"errorCode:{socketError} willBlock:{_willBlock} willBlockInternal:{_willBlockInternal}", "InternalSetBlocking");
3620 }
3621 current = _willBlockInternal;
3622 return socketError;
3623 }
3624
3625 internal void InternalSetBlocking(bool desired)
3626 {
3628 }
3629
3635
3637 {
3638 socket._addressFamily = _addressFamily;
3639 socket._socketType = _socketType;
3640 socket._protocolType = _protocolType;
3641 socket._remoteEndPoint = remoteEP;
3643 {
3644 socket._rightEndPoint = unixDomainSocketEndPoint.CreateUnboundEndPoint();
3645 }
3646 else
3647 {
3648 socket._rightEndPoint = _rightEndPoint;
3649 }
3650 socket._localEndPoint = ((!IsWildcardEndPoint(_localEndPoint)) ? _localEndPoint : null);
3651 socket.SetToConnected();
3652 socket._willBlock = _willBlock;
3653 socket.InternalSetBlocking(_willBlock);
3654 return socket;
3655 }
3656
3657 internal void SetToConnected()
3658 {
3659 if (!_isConnected)
3660 {
3661 _isConnected = true;
3662 _isDisconnected = false;
3663 if (_rightEndPoint == null)
3664 {
3666 }
3669 if (System.Net.NetEventSource.Log.IsEnabled())
3670 {
3671 System.Net.NetEventSource.Info(this, "now connected", "SetToConnected");
3672 }
3673 }
3674 }
3675
3677 {
3679 {
3680 _localEndPoint = null;
3681 }
3682 }
3683
3685 {
3686 if (endPoint == null)
3687 {
3688 return false;
3689 }
3691 {
3692 IPAddress address = iPEndPoint.Address;
3693 if (!IPAddress.Any.Equals(address) && !IPAddress.IPv6Any.Equals(address))
3694 {
3695 return s_IPAddressAnyMapToIPv6.Equals(address);
3696 }
3697 return true;
3698 }
3699 return false;
3700 }
3701
3702 internal void SetToDisconnected()
3703 {
3704 if (_isConnected)
3705 {
3706 _isConnected = false;
3707 _isDisconnected = true;
3708 if (!Disposed && System.Net.NetEventSource.Log.IsEnabled())
3709 {
3710 System.Net.NetEventSource.Info(this, "!Disposed", "SetToDisconnected");
3711 }
3712 }
3713 }
3714
3716 {
3719 if (System.Net.NetEventSource.Log.IsEnabled())
3720 {
3722 }
3723 throw ex;
3724 }
3725
3730
3732 {
3733 if (System.Net.NetEventSource.Log.IsEnabled())
3734 {
3735 System.Net.NetEventSource.Error(this, $"errorCode:{errorCode}", "UpdateStatusAfterSocketError");
3736 }
3737 if (_isConnected && (_handle.IsInvalid || (errorCode != SocketError.WouldBlock && errorCode != SocketError.IOPending && errorCode != SocketError.NoBufferSpaceAvailable && errorCode != SocketError.TimedOut)))
3738 {
3739 if (System.Net.NetEventSource.Log.IsEnabled())
3740 {
3741 System.Net.NetEventSource.Info(this, "Invalidating socket.", "UpdateStatusAfterSocketError");
3742 }
3744 }
3745 }
3746
3748 {
3749 if (errorCode == SocketError.Success || errorCode == SocketError.IOPending)
3750 {
3751 return true;
3752 }
3754 return false;
3755 }
3756
3772
3774 {
3776 {
3778 }
3779 }
3780
3781 private static SafeFileHandle OpenFileHandle(string name)
3782 {
3783 if (!string.IsNullOrEmpty(name))
3784 {
3785 return File.OpenHandle(name, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.None, 0L);
3786 }
3787 return null;
3788 }
3789
3791 {
3792 if (bytesTransferred == 0 && Disposed)
3793 {
3794 socketError = (IsConnectionOriented ? SocketError.ConnectionAborted : SocketError.Interrupted);
3795 }
3796 }
3797
3799 {
3800 if (Disposed)
3801 {
3802 socketError = (IsConnectionOriented ? SocketError.ConnectionAborted : SocketError.Interrupted);
3803 }
3804 }
3805
3807 {
3808 if (Disposed)
3809 {
3810 socketError = SocketError.NotSocket;
3811 }
3812 }
3813
3815 {
3816 if (Disposed)
3817 {
3818 socketError = SocketError.Interrupted;
3819 }
3820 }
3821
3822 private void ThrowIfDisposed()
3823 {
3824 if (Disposed)
3825 {
3827 }
3828 }
3829
3832 {
3833 throw new ObjectDisposedException(GetType().FullName);
3834 }
3835
3837 {
3838 if (socketList == null)
3839 {
3840 return;
3841 }
3842 for (int i = 0; i < socketList.Count; i++)
3843 {
3844 if (refsAdded <= 0)
3845 {
3846 break;
3847 }
3849 socket.InternalSafeHandle.DangerousRelease();
3850 refsAdded--;
3851 }
3852 }
3853
3855 {
3856 if (t.IsCanceled)
3857 {
3858 return SocketError.OperationAborted;
3859 }
3861 if (!(innerException is SocketException { SocketErrorCode: var socketErrorCode }))
3862 {
3864 {
3866 {
3867 return SocketError.OperationAborted;
3868 }
3869 return SocketError.SocketError;
3870 }
3871 return SocketError.OperationAborted;
3872 }
3873 return socketErrorCode;
3874 }
3875
3877 {
3878 return AcceptAsync((Socket?)null, CancellationToken.None).AsTask();
3879 }
3880
3885
3890
3892 {
3893 if (cancellationToken.IsCancellationRequested)
3894 {
3896 }
3898 awaitableSocketAsyncEventArgs.SetBuffer(null, 0, 0);
3899 awaitableSocketAsyncEventArgs.AcceptSocket = acceptSocket;
3900 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
3901 return awaitableSocketAsyncEventArgs.AcceptAsync(this, cancellationToken);
3902 }
3903
3905 {
3906 return ConnectAsync(remoteEP, default(CancellationToken)).AsTask();
3907 }
3908
3910 {
3911 if (cancellationToken.IsCancellationRequested)
3912 {
3914 }
3916 awaitableSocketAsyncEventArgs.RemoteEndPoint = remoteEP;
3918 if (valueTask.IsCompleted || !cancellationToken.CanBeCanceled)
3919 {
3920 return valueTask;
3921 }
3924 {
3925 try
3926 {
3927 using (cancellationToken.UnsafeRegister(delegate(object o)
3928 {
3930 }, saea))
3931 {
3932 await connectTask.ConfigureAwait(continueOnCapturedContext: false);
3933 }
3934 }
3935 catch (SocketException ex) when (ex.SocketErrorCode == SocketError.OperationAborted)
3936 {
3937 cancellationToken.ThrowIfCancellationRequested();
3938 throw;
3939 }
3940 }
3941 }
3942
3943 public Task ConnectAsync(IPAddress address, int port)
3944 {
3945 return ConnectAsync(new IPEndPoint(address, port));
3946 }
3947
3952
3954 {
3956 }
3957
3959 {
3961 if (addresses == null)
3962 {
3963 throw new ArgumentNullException("addresses");
3964 }
3965 if (addresses.Length == 0)
3966 {
3967 throw new ArgumentException(System.SR.net_invalidAddressList, "addresses");
3968 }
3970 {
3971 throw new ArgumentOutOfRangeException("port");
3972 }
3973 if (_isListening)
3974 {
3976 }
3977 if (_isConnected)
3978 {
3979 throw new SocketException(10056);
3980 }
3983 {
3984 Exception source = null;
3985 IPEndPoint endPoint = null;
3986 foreach (IPAddress address in addresses)
3987 {
3988 try
3989 {
3990 if (endPoint == null)
3991 {
3992 endPoint = new IPEndPoint(address, port);
3993 }
3994 else
3995 {
3996 endPoint.Address = address;
3997 }
3999 return;
4000 }
4002 {
4003 source = ex;
4004 }
4005 }
4007 }
4008 }
4009
4010 public Task ConnectAsync(string host, int port)
4011 {
4012 return ConnectAsync(host, port, default(CancellationToken)).AsTask();
4013 }
4014
4016 {
4017 if (host == null)
4018 {
4019 throw new ArgumentNullException("host");
4020 }
4021 IPAddress address;
4022 EndPoint remoteEP = (IPAddress.TryParse(host, out address) ? ((EndPoint)new IPEndPoint(address, port)) : ((EndPoint)new DnsEndPoint(host, port)));
4024 }
4025
4027 {
4028 if (cancellationToken.IsCancellationRequested)
4029 {
4031 }
4033 awaitableSocketAsyncEventArgs.DisconnectReuseSocket = reuseSocket;
4034 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4035 return awaitableSocketAsyncEventArgs.DisconnectAsync(this, cancellationToken);
4036 }
4037
4042
4048
4053
4055 {
4056 if (cancellationToken.IsCancellationRequested)
4057 {
4059 }
4062 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4063 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = fromNetworkStream;
4064 return awaitableSocketAsyncEventArgs.ReceiveAsync(this, cancellationToken);
4065 }
4066
4068 {
4071 if (taskSocketAsyncEventArgs == null)
4072 {
4074 taskSocketAsyncEventArgs.Completed += delegate(object s, SocketAsyncEventArgs e)
4075 {
4077 };
4078 }
4079 taskSocketAsyncEventArgs.BufferList = buffers;
4080 taskSocketAsyncEventArgs.SocketFlags = socketFlags;
4082 }
4083
4089
4091 {
4093 if (cancellationToken.IsCancellationRequested)
4094 {
4096 }
4099 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4100 awaitableSocketAsyncEventArgs.RemoteEndPoint = remoteEndPoint;
4101 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4102 return awaitableSocketAsyncEventArgs.ReceiveFromAsync(this, cancellationToken);
4103 }
4104
4110
4112 {
4114 if (cancellationToken.IsCancellationRequested)
4115 {
4117 }
4120 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4121 awaitableSocketAsyncEventArgs.RemoteEndPoint = remoteEndPoint;
4122 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4123 return awaitableSocketAsyncEventArgs.ReceiveMessageFromAsync(this, cancellationToken);
4124 }
4125
4131
4133 {
4134 if (cancellationToken.IsCancellationRequested)
4135 {
4137 }
4140 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4141 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4142 return awaitableSocketAsyncEventArgs.SendAsync(this, cancellationToken);
4143 }
4144
4146 {
4147 if (cancellationToken.IsCancellationRequested)
4148 {
4150 }
4153 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4154 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = true;
4155 return awaitableSocketAsyncEventArgs.SendAsyncForNetworkStream(this, cancellationToken);
4156 }
4157
4159 {
4162 if (taskSocketAsyncEventArgs == null)
4163 {
4165 taskSocketAsyncEventArgs.Completed += delegate(object s, SocketAsyncEventArgs e)
4166 {
4168 };
4169 }
4170 taskSocketAsyncEventArgs.BufferList = buffers;
4171 taskSocketAsyncEventArgs.SocketFlags = socketFlags;
4173 }
4174
4180
4182 {
4183 if (remoteEP == null)
4184 {
4185 throw new ArgumentNullException("remoteEP");
4186 }
4187 if (cancellationToken.IsCancellationRequested)
4188 {
4190 }
4193 awaitableSocketAsyncEventArgs.SocketFlags = socketFlags;
4194 awaitableSocketAsyncEventArgs.RemoteEndPoint = remoteEP;
4195 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4196 return awaitableSocketAsyncEventArgs.SendToAsync(this, cancellationToken);
4197 }
4198
4203
4205 {
4206 if (cancellationToken.IsCancellationRequested)
4207 {
4209 }
4211 {
4213 return ValueTask.FromException((Exception)(object)exception);
4214 }
4215 int num = 0;
4216 if (fileName != null)
4217 {
4218 num++;
4219 }
4220 if (!preBuffer.IsEmpty)
4221 {
4222 num++;
4223 }
4224 if (!postBuffer.IsEmpty)
4225 {
4226 num++;
4227 }
4230 SendPacketsElement[] array = ((sendPacketsElements != null && sendPacketsElements.Length == num) ? awaitableSocketAsyncEventArgs.SendPacketsElements : new SendPacketsElement[num]);
4231 int num2 = 0;
4232 if (!preBuffer.IsEmpty)
4233 {
4234 array[num2++] = new SendPacketsElement(preBuffer, num2 == num);
4235 }
4236 if (fileName != null)
4237 {
4238 array[num2++] = new SendPacketsElement(fileName, 0, 0, num2 == num);
4239 }
4240 if (!postBuffer.IsEmpty)
4241 {
4242 array[num2++] = new SendPacketsElement(postBuffer, num2 == num);
4243 }
4244 awaitableSocketAsyncEventArgs.SendPacketsFlags = flags;
4245 awaitableSocketAsyncEventArgs.SendPacketsElements = array;
4246 awaitableSocketAsyncEventArgs.WrapExceptionsForNetworkStream = false;
4247 return awaitableSocketAsyncEventArgs.SendPacketsAsync(this, cancellationToken);
4248 }
4249
4250 private static void ValidateBufferArguments(byte[] buffer, int offset, int size)
4251 {
4252 if (buffer == null)
4253 {
4254 throw new ArgumentNullException("buffer");
4255 }
4256 if ((uint)offset > (uint)buffer.Length)
4257 {
4258 throw new ArgumentOutOfRangeException("offset");
4259 }
4260 if ((uint)size > (uint)(buffer.Length - offset))
4261 {
4262 throw new ArgumentOutOfRangeException("size");
4263 }
4264 }
4265
4267 {
4268 if (buffer.Array == null)
4269 {
4270 throw new ArgumentNullException("Array");
4271 }
4272 if ((uint)buffer.Offset > (uint)buffer.Array.Length)
4273 {
4274 throw new ArgumentOutOfRangeException("Offset");
4275 }
4276 if ((uint)buffer.Count > (uint)(buffer.Array.Length - buffer.Offset))
4277 {
4278 throw new ArgumentOutOfRangeException("Count");
4279 }
4280 }
4281
4283 {
4284 if (buffers == null)
4285 {
4286 throw new ArgumentNullException("buffers");
4287 }
4288 if (buffers.Count == 0)
4289 {
4290 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_zerolist, "buffers"), "buffers");
4291 }
4292 }
4293
4295 {
4296 Task<int> result;
4297 if (pending)
4298 {
4299 result = saea.GetCompletionResponsibility(out var responsibleForReturningToPool).Task;
4301 {
4303 }
4304 }
4305 else
4306 {
4307 result = ((saea.SocketError != 0) ? Task.FromException<int>(GetException(saea.SocketError, fromNetworkStream)) : Task.FromResult((!(fromNetworkStream && !isReceive)) ? saea.BytesTransferred : 0));
4309 }
4310 return result;
4311 }
4312
4314 {
4315 SocketError socketError = saea.SocketError;
4316 int bytesTransferred = saea.BytesTransferred;
4317 bool wrapExceptionsInIOExceptions = saea._wrapExceptionsInIOExceptions;
4321 {
4322 s.ReturnSocketAsyncEventArgs(saea, isReceive);
4323 }
4324 if (socketError == SocketError.Success)
4325 {
4327 }
4328 else
4329 {
4331 }
4332 }
4333
4335 {
4338 {
4339 return ex;
4340 }
4342 }
4343
4345 {
4346 saea._accessed = false;
4347 saea._builder = default(AsyncTaskMethodBuilder<int>);
4348 saea._wrapExceptionsInIOExceptions = false;
4350 {
4351 saea.Dispose();
4352 }
4353 }
4354
4362
4364 {
4365 }
4366
4367 [SupportedOSPlatform("windows")]
4369 {
4371 if (socketError != 0)
4372 {
4373 _handle = null;
4374 if (socketError == SocketError.InvalidArgument)
4375 {
4376 throw new ArgumentException(System.SR.net_sockets_invalid_socketinformation, "socketInformation");
4377 }
4378 throw new SocketException((int)socketError);
4379 }
4380 if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6)
4381 {
4382 _handle.Dispose();
4383 _handle = null;
4385 }
4387 _willBlock = !socketInformation.GetOption(SocketInformationOptions.NonBlocking);
4392 fixed (byte* buffer = socketAddress.Buffer)
4393 {
4394 fixed (int* nameLen = &socketAddress.InternalSize)
4395 {
4397 }
4398 }
4399 switch (socketError)
4400 {
4401 case SocketError.Success:
4402 _rightEndPoint = iPEndPoint.Create(socketAddress);
4403 break;
4404 default:
4405 _handle.Dispose();
4406 _handle = null;
4407 throw new SocketException((int)socketError);
4408 case SocketError.InvalidArgument:
4409 break;
4410 }
4411 }
4412
4414 {
4415 global::Interop.Winsock.EnsureInitialized();
4416 global::Interop.Winsock.WSAPROTOCOL_INFOW wSAPROTOCOL_INFOW = default(global::Interop.Winsock.WSAPROTOCOL_INFOW);
4417 int optionLength = sizeof(global::Interop.Winsock.WSAPROTOCOL_INFOW);
4418 if (global::Interop.Winsock.getsockopt(handle, SocketOptionLevel.Socket, (SocketOptionName)8197, (byte*)(&wSAPROTOCOL_INFOW), ref optionLength) == SocketError.SocketError)
4419 {
4421 }
4422 addressFamily = wSAPROTOCOL_INFOW.iAddressFamily;
4423 socketType = wSAPROTOCOL_INFOW.iSocketType;
4424 protocolType = wSAPROTOCOL_INFOW.iProtocol;
4425 isListening = SocketPal.GetSockOpt(_handle, SocketOptionLevel.Socket, SocketOptionName.AcceptConnection, out var optionValue) == SocketError.Success && optionValue != 0;
4426 blocking = true;
4427 isSocket = true;
4428 }
4429
4430 [SupportedOSPlatform("windows")]
4446
4451
4457
4463
4464 internal unsafe bool DisconnectEx(SafeSocketHandle socketHandle, NativeOverlapped* overlapped, int flags, int reserved)
4465 {
4467 return disconnectExDelegate(socketHandle, overlapped, flags, reserved);
4468 }
4469
4470 internal unsafe bool DisconnectExBlocking(SafeSocketHandle socketHandle, int flags, int reserved)
4471 {
4473 return disconnectExDelegate(socketHandle, null, flags, reserved);
4474 }
4475
4477 {
4478 int optionValue = 1;
4479 SocketError socketError = global::Interop.Winsock.setsockopt(_handle, SocketOptionLevel.Socket, SocketOptionName.ReuseUnicastPort, ref optionValue, 4);
4480 if (System.Net.NetEventSource.Log.IsEnabled() && socketError != 0)
4481 {
4483 System.Net.NetEventSource.Info($"Enabling SO_REUSE_UNICASTPORT failed with error code: {socketError}", null, "EnableReuseUnicastPort");
4484 }
4485 }
4486
4492
4498
4504
4510
4512 {
4513 int count;
4514 if (socketList == null || (count = socketList.Count) == 0)
4515 {
4516 return;
4517 }
4519 for (int i = 0; i < count; i++)
4520 {
4521 if (!(socketList[i] is Socket socket))
4522 {
4523 throw new ArgumentException(System.SR.Format(System.SR.net_sockets_select, socketList[i]?.GetType().FullName, typeof(Socket).FullName), "socketList");
4524 }
4525 bool success = false;
4526 socket.InternalSafeHandle.DangerousAddRef(ref success);
4527 fileDescriptorSet[i + 1] = socket.InternalSafeHandle.DangerousGetHandle();
4528 refsAdded++;
4529 }
4530 }
4531
4533 {
4534 int num;
4535 if (socketList == null || (num = socketList.Count) == 0)
4536 {
4537 return;
4538 }
4539 int num2 = (int)fileDescriptorSet[0];
4540 if (num2 == 0)
4541 {
4543 socketList.Clear();
4544 return;
4545 }
4547 {
4548 for (int i = 0; i < num; i++)
4549 {
4551 int j;
4552 for (j = 0; j < num2 && !(fileDescriptorSet[j + 1] == socket._handle.DangerousGetHandle()); j++)
4553 {
4554 }
4555 if (j == num2)
4556 {
4557 socket.InternalSafeHandle.DangerousRelease();
4558 refsAdded--;
4559 socketList.RemoveAt(i--);
4560 num--;
4561 }
4562 }
4563 }
4564 }
4565
4567 {
4568 if (acceptSocket == null)
4569 {
4571 }
4572 else if (acceptSocket._rightEndPoint != null && (!checkDisconnected || !acceptSocket._isDisconnected))
4573 {
4575 }
4576 handle = acceptSocket._handle;
4577 return acceptSocket;
4578 }
4579
4581 {
4583 using (SafeFileHandle fileHandle = OpenFileHandle(fileName))
4584 {
4585 socketError = SocketPal.SendFile(_handle, fileHandle, preBuffer, postBuffer, flags);
4586 }
4587 if (socketError != 0)
4588 {
4591 }
4592 if ((flags & (TransmitFileOptions.Disconnect | TransmitFileOptions.ReuseSocket)) != 0)
4593 {
4595 _remoteEndPoint = null;
4596 }
4597 }
4598
4603
4604 [MethodImpl(MethodImplOptions.NoInlining)]
4610}
static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count)
Definition Buffer.cs:102
Exception? InnerException
Definition Exception.cs:104
static void SuppressFinalize(object obj)
Definition GC.cs:202
Definition GC.cs:8
static SafeFileHandle OpenHandle(string path, FileMode mode=FileMode.Open, FileAccess access=FileAccess.Read, FileShare share=FileShare.Read, FileOptions options=FileOptions.None, long preallocationSize=0L)
Definition File.cs:1009
static void Delete(string path)
Definition File.cs:88
static IPAddress[] GetHostAddresses(string hostNameOrAddress)
Definition Dns.cs:170
virtual EndPoint Create(SocketAddress socketAddress)
Definition EndPoint.cs:20
virtual AddressFamily AddressFamily
Definition EndPoint.cs:8
static bool IsFatal(Exception exception)
IPAddress MapToIPv6()
Definition IPAddress.cs:513
static bool TryParse([NotNullWhen(true)] string? ipString, [NotNullWhen(true)] out IPAddress? address)
Definition IPAddress.cs:303
static readonly IPAddress Any
Definition IPAddress.cs:19
static readonly IPAddress IPv6Any
Definition IPAddress.cs:27
AddressFamily AddressFamily
Definition IPAddress.cs:88
static SocketException CreateSocketException(SocketError errorCode, int platformError)
static void ConnectedAsyncDns(Socket socket)
static readonly System.Net.NetEventSource Log
static void Info(object thisOrContextObject, FormattableString formattableString=null, [CallerMemberName] string memberName=null)
static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName=null)
static void Connected(Socket socket, object localEp, object remoteEp)
static void Accepted(Socket socket, object remoteEp, object localEp)
static void DumpBuffer(object thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string memberName=null)
static uint GetIPv4Address(ReadOnlySpan< byte > buffer)
static ushort GetPort(ReadOnlySpan< byte > buffer)
static void GetIPv6Address(ReadOnlySpan< byte > buffer, Span< byte > address, out uint scope)
DisconnectExDelegate GetDisconnectExDelegate(SafeSocketHandle socketHandle)
TransmitPacketsDelegate GetTransmitPacketsDelegate(SafeSocketHandle socketHandle)
AcceptExDelegate GetAcceptExDelegate(SafeSocketHandle socketHandle)
GetAcceptExSockaddrsDelegate GetGetAcceptExSockaddrsDelegate(SafeSocketHandle socketHandle)
ConnectExDelegate GetConnectExDelegate(SafeSocketHandle socketHandle)
WSARecvMsgDelegate GetWSARecvMsgDelegate(SafeSocketHandle socketHandle)
static DynamicWinsockMethods GetMethods(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
static SocketAddress GetNetSocketAddress(System.Net.Internals.SocketAddress address)
static System.Net.Internals.SocketAddress Serialize(EndPoint endpoint)
ThreadPoolBoundHandle GetThreadPoolBoundHandle()
ThreadPoolBoundHandle GetOrAllocateThreadPoolBoundHandle(bool trySkipCompletionPortOnSuccess)
unsafe SocketError DoOperationConnectEx(Socket socket, SafeSocketHandle handle)
bool DnsConnectAsync(DnsEndPoint endPoint, SocketType socketType, ProtocolType protocolType)
unsafe SocketError DoOperationReceiveMessageFrom(Socket socket, SafeSocketHandle handle, CancellationToken cancellationToken)
unsafe SocketError DoOperationSendPackets(Socket socket, SafeSocketHandle handle, CancellationToken cancellationToken)
unsafe SocketError DoOperationAccept(Socket socket, SafeSocketHandle handle, SafeSocketHandle acceptHandle, CancellationToken cancellationToken)
void StartOperationCommon(Socket socket, SocketAsyncOperation operation)
unsafe SocketError DoOperationDisconnect(Socket socket, SafeSocketHandle handle, CancellationToken cancellationToken)
SocketError DoOperationSend(SafeSocketHandle handle, CancellationToken cancellationToken)
SocketError DoOperationConnect(Socket socket, SafeSocketHandle handle)
System.Net.Internals.SocketAddress _socketAddress
SocketError DoOperationReceive(SafeSocketHandle handle, CancellationToken cancellationToken)
void StartOperationConnect(bool saeaMultiConnectCancelable, bool userSocket)
SocketError DoOperationReceiveFrom(SafeSocketHandle handle, CancellationToken cancellationToken)
SocketError DoOperationSendTo(SafeSocketHandle handle, CancellationToken cancellationToken)
static unsafe SocketError Receive(SafeSocketHandle handle, IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out int bytesTransferred)
Definition SocketPal.cs:295
static unsafe SocketError GetPeerName(SafeSocketHandle handle, Span< byte > buffer, ref int nameLen)
Definition SocketPal.cs:126
static SocketError CreateSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, out SafeSocketHandle socket)
Definition SocketPal.cs:27
static unsafe SocketError Select(IList checkRead, IList checkWrite, IList checkError, int microseconds)
Definition SocketPal.cs:711
static SocketError Connect(SafeSocketHandle handle, byte[] peerAddress, int peerAddressLen)
Definition SocketPal.cs:174
static SocketError GetLingerOption(SafeSocketHandle handle, out LingerOption optionValue)
Definition SocketPal.cs:657
static SocketError WindowsIoctl(SafeSocketHandle handle, int ioControlCode, byte[] optionInValue, byte[] optionOutValue, out int optionLength)
Definition SocketPal.cs:468
static readonly int MaximumAddressSize
Definition SocketPal.cs:14
static unsafe SocketError GetSockOpt(SafeSocketHandle handle, SocketOptionLevel optionLevel, SocketOptionName optionName, out int optionValue)
Definition SocketPal.cs:579
static SocketError SetSockOpt(SafeSocketHandle handle, SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue)
Definition SocketPal.cs:482
static SocketError Accept(SafeSocketHandle listenSocket, byte[] socketAddress, ref int socketAddressSize, out SafeSocketHandle socket)
Definition SocketPal.cs:159
static SocketError Disconnect(Socket socket, SafeSocketHandle handle, bool reuseSocket)
Definition SocketPal.cs:849
static unsafe SocketError SendFile(SafeSocketHandle handle, SafeFileHandle fileHandle, ReadOnlySpan< byte > preBuffer, ReadOnlySpan< byte > postBuffer, TransmitFileOptions flags)
Definition SocketPal.cs:259
static SocketError ReceiveFrom(SafeSocketHandle handle, byte[] buffer, int offset, int size, SocketFlags socketFlags, byte[] socketAddress, ref int addressLength, out int bytesTransferred)
Definition SocketPal.cs:447
static void SetReceivingDualModeIPv4PacketInformation(Socket socket)
Definition SocketPal.cs:522
static SocketError SetMulticastOption(SafeSocketHandle handle, SocketOptionName optionName, MulticastOption optionValue)
Definition SocketPal.cs:527
static SocketError SendTo(SafeSocketHandle handle, byte[] buffer, int offset, int size, SocketFlags socketFlags, byte[] peerAddress, int peerAddressSize, out int bytesTransferred)
Definition SocketPal.cs:274
static void CheckDualModeReceiveSupport(Socket socket)
Definition SocketPal.cs:845
static unsafe SocketError SetRawSockOpt(SafeSocketHandle handle, int optionLevel, int optionName, ReadOnlySpan< byte > optionValue)
Definition SocketPal.cs:509
static unsafe SocketError Poll(SafeSocketHandle handle, int microseconds, SelectMode mode, out bool status)
Definition SocketPal.cs:671
static SocketError SetIPv6MulticastOption(SafeSocketHandle handle, SocketOptionName optionName, IPv6MulticastOption optionValue)
Definition SocketPal.cs:548
static SocketError ReceiveMessageFrom(Socket socket, SafeSocketHandle handle, byte[] buffer, int offset, int size, ref SocketFlags socketFlags, System.Net.Internals.SocketAddress socketAddress, out System.Net.Internals.SocketAddress receiveAddress, out IPPacketInformation ipPacketInformation, out int bytesTransferred)
Definition SocketPal.cs:386
static SocketError Listen(SafeSocketHandle handle, int backlog)
Definition SocketPal.cs:149
static unsafe SocketError GetRawSockOpt(SafeSocketHandle handle, int optionLevel, int optionName, Span< byte > optionValue, ref int optionLength)
Definition SocketPal.cs:614
static unsafe SocketError GetSockName(SafeSocketHandle handle, byte *buffer, int *nameLen)
Definition SocketPal.cs:104
static SocketError GetMulticastOption(SafeSocketHandle handle, SocketOptionName optionName, out MulticastOption optionValue)
Definition SocketPal.cs:627
static SocketError Bind(SafeSocketHandle handle, ProtocolType socketProtocolType, byte[] buffer, int nameLen)
Definition SocketPal.cs:139
static SocketError SetLingerOption(SafeSocketHandle handle, LingerOption optionValue)
Definition SocketPal.cs:561
static void SetIPProtectionLevel(Socket socket, SocketOptionLevel optionLevel, int protectionLevel)
Definition SocketPal.cs:574
static SocketError SetBlocking(SafeSocketHandle handle, bool shouldBlock, out bool willBlock)
Definition SocketPal.cs:92
static SocketError GetLastSocketError()
Definition SocketPal.cs:22
static SocketError GetIPv6MulticastOption(SafeSocketHandle handle, SocketOptionName optionName, out IPv6MulticastOption optionValue)
Definition SocketPal.cs:643
static unsafe SocketError Send(SafeSocketHandle handle, IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out int bytesTransferred)
Definition SocketPal.cs:184
static unsafe SocketError DuplicateSocket(SafeSocketHandle handle, int targetProcessId, out SocketInformation socketInformation)
Definition SocketPal.cs:859
static SocketError Shutdown(SafeSocketHandle handle, bool isConnected, bool isDisconnected, SocketShutdown how)
Definition SocketPal.cs:798
static SocketError GetAvailable(SafeSocketHandle handle, out int available)
Definition SocketPal.cs:114
Exception CreateException(SocketError error, bool forAsyncThrow=true)
Definition Socket.cs:503
void ThrowException(SocketError error, CancellationToken cancellationToken)
Definition Socket.cs:494
override void OnCompleted(SocketAsyncEventArgs _)
Definition Socket.cs:86
ValueTask SendPacketsAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:223
ValueTask< int > ReceiveAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:127
static readonly Action< object > s_completedSentinel
Definition Socket.cs:47
ValueTask SendAsyncForNetworkStream(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:207
ValueTask DisconnectAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:279
ValueTask< SocketReceiveFromResult > ReceiveFromAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:144
ValueTask< int > SendAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:190
void OnCompleted(Action< object > continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
Definition Socket.cs:312
ValueTaskSourceStatus GetStatus(short token)
Definition Socket.cs:295
ValueTask< Socket > AcceptAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:110
AwaitableSocketAsyncEventArgs(Socket owner, bool isReceiveForCaching)
Definition Socket.cs:68
ValueTask< int > SendToAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:239
ValueTask< SocketReceiveMessageFromResult > ReceiveMessageFromAsync(Socket socket, CancellationToken cancellationToken)
Definition Socket.cs:165
void InvokeContinuation(Action< object > continuation, object state, bool forceAsync, bool requiresExecutionContextFlow)
Definition Socket.cs:353
readonly System.Net.Internals.SocketAddress SocketAddress
Definition Socket.cs:522
AsyncTaskMethodBuilder< TResult > _builder
Definition Socket.cs:22
AsyncTaskMethodBuilder< TResult > GetCompletionResponsibility(out bool responsibleForReturningToPool)
Definition Socket.cs:33
Task< Socket > AcceptAsync(Socket? acceptSocket)
Definition Socket.cs:3886
static void CompleteSendReceive(Socket s, TaskSocketAsyncEventArgs< int > saea, bool isReceive)
Definition Socket.cs:4313
IAsyncResult? BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
Definition Socket.cs:2440
System.Net.Internals.SocketAddress Serialize(ref EndPoint remoteEP)
Definition Socket.cs:3225
void UpdateAcceptSocketErrorForDisposed(ref SocketError socketError)
Definition Socket.cs:3814
void Connect(IPAddress address, int port)
Definition Socket.cs:1247
void SetLingerOption(LingerOption lref)
Definition Socket.cs:3534
int Receive(IList< ArraySegment< byte > > buffers)
Definition Socket.cs:1823
void ValidateReceiveFromEndpointAndState(EndPoint remoteEndPoint, string remoteEndPointArgumentName)
Definition Socket.cs:3757
int Send(byte[] buffer, int size, SocketFlags socketFlags)
Definition Socket.cs:1445
bool SendPacketsAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3130
static bool OSSupportsUnixDomainSockets
Definition Socket.cs:593
void SetMulticastOption(SocketOptionName optionName, MulticastOption MR)
Definition Socket.cs:3508
IAsyncResult BeginConnect(EndPoint remoteEP, AsyncCallback? callback, object? state)
Definition Socket.cs:2378
int Send(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags)
Definition Socket.cs:1465
static bool OSSupportsIPv6
Definition Socket.cs:591
void SetIPv6MulticastOption(SocketOptionName optionName, IPv6MulticastOption MR)
Definition Socket.cs:3521
int EndSendTo(IAsyncResult asyncResult)
Definition Socket.cs:2525
bool DisconnectAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:2980
void SendFileInternal(string fileName, ReadOnlySpan< byte > preBuffer, ReadOnlySpan< byte > postBuffer, TransmitFileOptions flags)
Definition Socket.cs:4580
unsafe void LoadSocketTypeFromHandle(SafeSocketHandle handle, out AddressFamily addressFamily, out SocketType socketType, out ProtocolType protocolType, out bool blocking, out bool isListening, out bool isSocket)
Definition Socket.cs:4413
bool ReceiveMessageFromAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3065
int EndReceive(IAsyncResult asyncResult)
Definition Socket.cs:2571
static void GetIPProtocolInformation(AddressFamily addressFamily, System.Net.Internals.SocketAddress socketAddress, out bool isIPv4, out bool isIPv6)
Definition Socket.cs:3208
IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback? callback, object? state)
Definition Socket.cs:2531
bool ReceiveFromAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3027
void DoBind(EndPoint endPointSnapshot, System.Net.Internals.SocketAddress socketAddress)
Definition Socket.cs:1191
Socket(SocketType socketType, ProtocolType protocolType)
Definition Socket.cs:1026
ValueTask< Socket > AcceptAsync(Socket? acceptSocket, CancellationToken cancellationToken)
Definition Socket.cs:3891
int Receive(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1839
Task< int > SendAsync(ArraySegment< byte > buffer, SocketFlags socketFlags)
Definition Socket.cs:4126
IAsyncResult BeginReceive(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, AsyncCallback? callback, object? state)
Definition Socket.cs:2552
TaskSocketAsyncEventArgs< int > _multiBufferSendEventArgs
Definition Socket.cs:573
int EndReceiveFrom(IAsyncResult asyncResult, ref EndPoint endPoint)
Definition Socket.cs:2666
void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue, bool silent)
Definition Socket.cs:3471
static void SelectFileDescriptor(IList socketList, Span< IntPtr > fileDescriptorSet, ref int refsAdded)
Definition Socket.cs:4532
static CachedSerializedEndPoint s_cachedMappedAnyV6EndPoint
Definition Socket.cs:579
unsafe bool TransmitPackets(SafeSocketHandle socketHandle, IntPtr packetArray, int elementCount, int sendSize, NativeOverlapped *overlapped, TransmitFileOptions flags)
Definition Socket.cs:4505
ValueTask ConnectAsync(string host, int port, CancellationToken cancellationToken)
Definition Socket.cs:4015
ValueTask ConnectAsync(IPAddress address, int port, CancellationToken cancellationToken)
Definition Socket.cs:3948
void Disconnect(bool reuseSocket)
Definition Socket.cs:2409
unsafe bool ConnectEx(SafeSocketHandle socketHandle, IntPtr socketAddress, int socketAddressSize, IntPtr buffer, int dataLength, out int bytesSent, NativeOverlapped *overlapped)
Definition Socket.cs:4487
unsafe bool DisconnectEx(SafeSocketHandle socketHandle, NativeOverlapped *overlapped, int flags, int reserved)
Definition Socket.cs:4464
ValueTask ConnectAsync(EndPoint remoteEP, CancellationToken cancellationToken)
Definition Socket.cs:3909
static SocketError GetSocketErrorFromFaultedTask(Task t)
Definition Socket.cs:3854
SocketError InternalSetBlocking(bool desired, out bool current)
Definition Socket.cs:3592
Task ConnectAsync(IPAddress[] addresses, int port)
Definition Socket.cs:3953
static void SocketListToFileDescriptorSet(IList socketList, Span< IntPtr > fileDescriptorSet, ref int refsAdded)
Definition Socket.cs:4511
static void SocketListDangerousReleaseRefs(IList socketList, ref int refsAdded)
Definition Socket.cs:3836
IAsyncResult BeginReceiveFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP, AsyncCallback? callback, object? state)
Definition Socket.cs:2649
int Receive(byte[] buffer)
Definition Socket.cs:1730
ValueTask SendFileAsync(string? fileName, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4199
int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1525
void UpdateSendSocketErrorForDisposed(ref SocketError socketError)
Definition Socket.cs:3798
unsafe bool AcceptEx(SafeSocketHandle listenSocketHandle, SafeSocketHandle acceptSocketHandle, IntPtr buffer, int len, int localAddressLength, int remoteAddressLength, out int bytesReceived, NativeOverlapped *overlapped)
Definition Socket.cs:4452
Task< int > ReceiveAsync(ArraySegment< byte > buffer, SocketFlags socketFlags)
Definition Socket.cs:4038
virtual void Dispose(bool disposing)
Definition Socket.cs:3294
int EndSendReceive(IAsyncResult asyncResult, out SocketError errorCode)
Definition Socket.cs:2582
void DisposeCachedTaskSocketAsyncEventArgs()
Definition Socket.cs:4355
int Send(ReadOnlySpan< byte > buffer, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1578
ValueTask< SocketReceiveFromResult > ReceiveFromAsync(Memory< byte > buffer, SocketFlags socketFlags, EndPoint remoteEndPoint, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4090
bool IsWildcardEndPoint(EndPoint endPoint)
Definition Socket.cs:3684
unsafe? EndPoint LocalEndPoint
Definition Socket.cs:615
static bool OSSupportsIPv4
Definition Socket.cs:589
void ReplaceHandleIfNecessaryAfterFailedConnect()
Definition Socket.cs:4363
TaskSocketAsyncEventArgs< int > _multiBufferReceiveEventArgs
Definition Socket.cs:571
Task ConnectAsync(EndPoint remoteEP)
Definition Socket.cs:3904
ValueTask< SocketReceiveMessageFromResult > ReceiveMessageFromAsync(Memory< byte > buffer, SocketFlags socketFlags, EndPoint remoteEndPoint, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4111
int Send(ReadOnlySpan< byte > buffer, SocketFlags socketFlags)
Definition Socket.cs:1567
void EndDisconnect(IAsyncResult asyncResult)
Definition Socket.cs:2427
int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1746
bool SendAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3104
int ReceiveMessageFrom(byte[] buffer, int offset, int size, ref SocketFlags socketFlags, ref EndPoint remoteEP, out IPPacketInformation ipPacketInformation)
Definition Socket.cs:1877
void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, byte[] optionValue)
Definition Socket.cs:2153
int ReceiveMessageFrom(Span< byte > buffer, ref SocketFlags socketFlags, ref EndPoint remoteEP, out IPPacketInformation ipPacketInformation)
Definition Socket.cs:1925
void GetAcceptExSockaddrs(IntPtr buffer, int receiveDataLength, int localAddressLength, int remoteAddressLength, out IntPtr localSocketAddress, out int localSocketAddressLength, out IntPtr remoteSocketAddress, out int remoteSocketAddressLength)
Definition Socket.cs:4458
int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags)
Definition Socket.cs:1735
void SendFile(string? fileName, ReadOnlySpan< byte > preBuffer, ReadOnlySpan< byte > postBuffer, TransmitFileOptions flags)
Definition Socket.cs:1614
static SafeSocketHandle ValidateHandle(SafeSocketHandle handle)
Definition Socket.cs:1146
Socket UpdateAcceptSocket(Socket socket, EndPoint remoteEP)
Definition Socket.cs:3636
byte[] GetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, int optionLength)
Definition Socket.cs:2278
int EndReceiveMessageFrom(IAsyncResult asyncResult, ref SocketFlags socketFlags, ref EndPoint endPoint, out IPPacketInformation ipPacketInformation)
Definition Socket.cs:2628
Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
Definition Socket.cs:1035
void UpdateReceiveSocketErrorForDisposed(ref SocketError socketError, int bytesTransferred)
Definition Socket.cs:3790
int ReceiveFrom(byte[] buffer, int size, SocketFlags socketFlags, ref EndPoint remoteEP)
Definition Socket.cs:2047
unsafe SocketError WSARecvMsgBlocking(SafeSocketHandle socketHandle, IntPtr msg, out int bytesTransferred)
Definition Socket.cs:4499
Socket(SafeSocketHandle handle)
Definition Socket.cs:1051
Task< SocketReceiveFromResult > ReceiveFromAsync(ArraySegment< byte > buffer, SocketFlags socketFlags, EndPoint remoteEndPoint)
Definition Socket.cs:4084
int EndSend(IAsyncResult asyncResult)
Definition Socket.cs:2473
ValueTask< int > ReceiveAsync(Memory< byte > buffer, SocketFlags socketFlags, bool fromNetworkStream, CancellationToken cancellationToken)
Definition Socket.cs:4054
IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback? requestCallback, object? state)
Definition Socket.cs:2388
int Receive(Span< byte > buffer)
Definition Socket.cs:1781
static void ValidateBufferArguments(byte[] buffer, int offset, int size)
Definition Socket.cs:4250
bool ReceiveMessageFromAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3070
LingerOption GetLingerOpt()
Definition Socket.cs:3547
AwaitableSocketAsyncEventArgs _singleBufferReceiveEventArgs
Definition Socket.cs:567
bool AcceptAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:2779
int ReceiveFrom(Span< byte > buffer, ref EndPoint remoteEP)
Definition Socket.cs:2062
bool ReceiveAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3006
int SendTo(byte[] buffer, int offset, int size, SocketFlags socketFlags, EndPoint remoteEP)
Definition Socket.cs:1629
void SendFile(string? fileName, byte[]? preBuffer, byte[]? postBuffer, TransmitFileOptions flags)
Definition Socket.cs:1609
int ReceiveFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP)
Definition Socket.cs:1983
ValueTask SendFileAsync(string? fileName, ReadOnlyMemory< byte > preBuffer, ReadOnlyMemory< byte > postBuffer, TransmitFileOptions flags, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4204
int IOControl(int ioControlCode, byte[]? optionInValue, byte[]? optionOutValue)
Definition Socket.cs:2122
bool ReceiveFromAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3032
void Bind(EndPoint localEP)
Definition Socket.cs:1172
ValueTask< int > SendAsync(ReadOnlyMemory< byte > buffer, SocketFlags socketFlags, CancellationToken cancellationToken)
Definition Socket.cs:4132
IAsyncResult BeginSendFile(string? fileName, byte[]? preBuffer, byte[]? postBuffer, TransmitFileOptions flags, AsyncCallback? callback, object? state)
Definition Socket.cs:2489
int Receive(Span< byte > buffer, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1797
IAsyncResult BeginAccept(int receiveSize, AsyncCallback? callback, object? state)
Definition Socket.cs:2726
Socket EndAccept(IAsyncResult asyncResult)
Definition Socket.cs:2690
Task< int > ReceiveAsync(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags)
Definition Socket.cs:4067
int SendTo(byte[] buffer, int size, SocketFlags socketFlags, EndPoint remoteEP)
Definition Socket.cs:1669
ValueTask< int > SendToAsync(ReadOnlyMemory< byte > buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4181
void SetReceivingPacketInformation()
Definition Socket.cs:3450
SafeSocketHandle _handle
Definition Socket.cs:533
void SendFile(string? fileName)
Definition Socket.cs:1604
AddressFamily _addressFamily
Definition Socket.cs:555
Task< Socket > AcceptAsync()
Definition Socket.cs:3876
void Connect(EndPoint remoteEP)
Definition Socket.cs:1206
void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, bool optionValue)
Definition Socket.cs:2171
int Receive(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags)
Definition Socket.cs:1828
void Listen(int backlog)
Definition Socket.cs:1370
Task ConnectAsync(string host, int port)
Definition Socket.cs:4010
static bool ConnectAsync(SocketType socketType, ProtocolType protocolType, SocketAsyncEventArgs e)
Definition Socket.cs:2904
void WildcardBindForConnectIfNecessary(AddressFamily addressFamily)
Definition Socket.cs:2938
int Receive(byte[] buffer, int size, SocketFlags socketFlags)
Definition Socket.cs:1720
int Send(byte[] buffer)
Definition Socket.cs:1455
void InternalSetBlocking(bool desired)
Definition Socket.cs:3625
unsafe SocketError WSARecvMsg(SafeSocketHandle socketHandle, IntPtr msg, out int bytesTransferred, NativeOverlapped *overlapped, IntPtr completionRoutine)
Definition Socket.cs:4493
void SetIPProtectionLevel(IPProtectionLevel level)
Definition Socket.cs:2318
EndPoint _pendingConnectRightEndPoint
Definition Socket.cs:553
ValueTask ConnectAsync(IPAddress[] addresses, int port, CancellationToken cancellationToken)
Definition Socket.cs:3958
int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags)
Definition Socket.cs:1514
Task< int > ReceiveAsync(ArraySegment< byte > buffer, SocketFlags socketFlags, bool fromNetworkStream)
Definition Socket.cs:4043
IAsyncResult BeginReceiveMessageFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP, AsyncCallback? callback, object? state)
Definition Socket.cs:2602
ValueTask< int > ReceiveAsync(Memory< byte > buffer, SocketFlags socketFlags, CancellationToken cancellationToken)
Definition Socket.cs:4049
AwaitableSocketAsyncEventArgs _singleBufferSendEventArgs
Definition Socket.cs:569
bool ReceiveAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3001
void SetRawSocketOption(int optionLevel, int optionName, ReadOnlySpan< byte > optionValue)
Definition Socket.cs:2221
unsafe Socket(SafeSocketHandle handle, bool loadPropertiesFromHandle)
Definition Socket.cs:1056
bool SendToAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3169
void DoConnect(EndPoint endPointSnapshot, System.Net.Internals.SocketAddress socketAddress)
Definition Socket.cs:3243
ProtocolType _protocolType
Definition Socket.cs:559
IAsyncResult BeginAccept(Socket? acceptSocket, int receiveSize, AsyncCallback? callback, object? state)
Definition Socket.cs:2731
SafeSocketHandle InternalSafeHandle
Definition Socket.cs:693
static readonly IPAddress s_IPAddressAnyMapToIPv6
Definition Socket.cs:531
IAsyncResult BeginDisconnect(bool reuseSocket, AsyncCallback? callback, object? state)
Definition Socket.cs:2404
bool ConnectAsync(SocketAsyncEventArgs e, bool userSocket, bool saeaCancelable)
Definition Socket.cs:2827
int IOControl(IOControlCode ioControlCode, byte[]? optionInValue, byte[]? optionOutValue)
Definition Socket.cs:2138
Socket CreateAcceptSocket(SafeSocketHandle fd, EndPoint remoteEP)
Definition Socket.cs:3630
IAsyncResult? BeginSend(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
Definition Socket.cs:2460
static CachedSerializedEndPoint s_cachedAnyEndPoint
Definition Socket.cs:575
object? GetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName)
Definition Socket.cs:2235
ThreadPoolBoundHandle GetOrAllocateThreadPoolBoundHandleSlow()
Definition Socket.cs:4605
static bool SupportsIPv6
Definition Socket.cs:587
int ReceiveFrom(byte[] buffer, SocketFlags socketFlags, ref EndPoint remoteEP)
Definition Socket.cs:2052
static void ValidateBuffersList(IList< ArraySegment< byte > > buffers)
Definition Socket.cs:4282
int Send(byte[] buffer, SocketFlags socketFlags)
Definition Socket.cs:1450
Socket EndAccept(out byte[] buffer, IAsyncResult asyncResult)
Definition Socket.cs:2736
void UpdateStatusAfterSocketErrorAndThrowException(SocketError error, [CallerMemberName] string callerName=null)
Definition Socket.cs:3715
Task< int > GetTaskForSendReceive(bool pending, TaskSocketAsyncEventArgs< int > saea, bool fromNetworkStream, bool isReceive)
Definition Socket.cs:4294
int EndSend(IAsyncResult asyncResult, out SocketError errorCode)
Definition Socket.cs:2479
static int GetAddressSize(EndPoint endPoint)
Definition Socket.cs:3215
bool Poll(int microSeconds, SelectMode mode)
Definition Socket.cs:2337
static bool SupportsIPv4
Definition Socket.cs:584
void Connect(IPAddress[] addresses, int port)
Definition Socket.cs:1294
IAsyncResult BeginConnect(string host, int port, AsyncCallback? requestCallback, object? state)
Definition Socket.cs:2383
bool SendPacketsAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3135
int EndReceive(IAsyncResult asyncResult, out SocketError errorCode)
Definition Socket.cs:2577
ValueTask SendAsyncForNetworkStream(ReadOnlyMemory< byte > buffer, SocketFlags socketFlags, CancellationToken cancellationToken)
Definition Socket.cs:4145
int Send(IList< ArraySegment< byte > > buffers)
Definition Socket.cs:1460
unsafe Socket(SocketInformation socketInformation)
Definition Socket.cs:4368
void InternalShutdown(SocketShutdown how)
Definition Socket.cs:3435
IAsyncResult BeginSend(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, AsyncCallback? callback, object? state)
Definition Socket.cs:2454
int GetRawSocketOption(int optionLevel, int optionName, Span< byte > optionValue)
Definition Socket.cs:2301
IPv6MulticastOption GetIPv6MulticastOpt(SocketOptionName optionName)
Definition Socket.cs:3577
int ReceiveFrom(Span< byte > buffer, SocketFlags socketFlags, ref EndPoint remoteEP)
Definition Socket.cs:2067
int SendTo(ReadOnlySpan< byte > buffer, SocketFlags socketFlags, EndPoint remoteEP)
Definition Socket.cs:1689
MulticastOption GetMulticastOpt(SocketOptionName optionName)
Definition Socket.cs:3562
void UpdateLocalEndPointOnConnect()
Definition Socket.cs:3676
DynamicWinsockMethods _dynamicWinsockMethods
Definition Socket.cs:581
int SendTo(ReadOnlySpan< byte > buffer, EndPoint remoteEP)
Definition Socket.cs:1684
int Receive(byte[] buffer, SocketFlags socketFlags)
Definition Socket.cs:1725
void EndSendFile(IAsyncResult asyncResult)
Definition Socket.cs:2503
int SendTo(byte[] buffer, SocketFlags socketFlags, EndPoint remoteEP)
Definition Socket.cs:1674
void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, object optionValue)
Definition Socket.cs:2176
void UpdateStatusAfterSocketError(SocketException socketException)
Definition Socket.cs:3726
int SendTo(byte[] buffer, EndPoint remoteEP)
Definition Socket.cs:1679
SocketInformation DuplicateAndClose(int targetProcessId)
Definition Socket.cs:4431
static SafeFileHandle OpenFileHandle(string name)
Definition Socket.cs:3781
Task< int > SendAsync(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags)
Definition Socket.cs:4158
IAsyncResult? BeginReceive(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
Definition Socket.cs:2558
IAsyncResult BeginConnect(IPAddress[] addresses, int port, AsyncCallback? requestCallback, object? state)
Definition Socket.cs:2393
void Shutdown(SocketShutdown how)
Definition Socket.cs:2754
bool AcceptAsync(SocketAsyncEventArgs e)
Definition Socket.cs:2774
async Task<(Socket s, byte[] buffer, int bytesReceived)> AcceptAndReceiveHelperAsync(Socket acceptSocket, int receiveSize)
Definition Socket.cs:2696
IAsyncResult BeginAccept(AsyncCallback? callback, object? state)
Definition Socket.cs:2685
Task< int > SendToAsync(ArraySegment< byte > buffer, SocketFlags socketFlags, EndPoint remoteEP)
Definition Socket.cs:4175
Socket GetOrCreateAcceptSocket(Socket acceptSocket, bool checkDisconnected, string propertyName, out SafeSocketHandle handle)
Definition Socket.cs:4566
unsafe bool DisconnectExBlocking(SafeSocketHandle socketHandle, int flags, int reserved)
Definition Socket.cs:4470
IAsyncResult? BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode, AsyncCallback? callback, object? state)
Definition Socket.cs:2538
int Send(ReadOnlySpan< byte > buffer)
Definition Socket.cs:1562
int ReceiveFrom(byte[] buffer, ref EndPoint remoteEP)
Definition Socket.cs:2057
static void Select(IList? checkRead, IList? checkWrite, IList? checkError, int microSeconds)
Definition Socket.cs:2353
bool SendToAsync(SocketAsyncEventArgs e)
Definition Socket.cs:3164
void GetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, byte[] optionValue)
Definition Socket.cs:2263
bool SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
Definition Socket.cs:3109
LingerOption? LingerState
Definition Socket.cs:849
ValueTask DisconnectAsync(bool reuseSocket, CancellationToken cancellationToken=default(CancellationToken))
Definition Socket.cs:4026
ValueTask< Socket > AcceptAsync(CancellationToken cancellationToken)
Definition Socket.cs:3881
void ReturnSocketAsyncEventArgs(TaskSocketAsyncEventArgs< int > saea, bool isReceive)
Definition Socket.cs:4344
static void ValidateBuffer(ArraySegment< byte > buffer)
Definition Socket.cs:4266
void Close(int timeout)
Definition Socket.cs:1351
void UpdateStatusAfterSocketError(SocketError errorCode)
Definition Socket.cs:3731
static void CancelConnectAsync(SocketAsyncEventArgs e)
Definition Socket.cs:2966
IAsyncResult BeginSendFile(string? fileName, AsyncCallback? callback, object? state)
Definition Socket.cs:2484
void ThrowObjectDisposedException()
Definition Socket.cs:3831
Socket EndAccept(out byte[] buffer, out int bytesTransferred, IAsyncResult asyncResult)
Definition Socket.cs:2746
bool DisconnectAsync(SocketAsyncEventArgs e)
Definition Socket.cs:2975
IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, SocketFlags socketFlags, EndPoint remoteEP, AsyncCallback? callback, object? state)
Definition Socket.cs:2513
Task< SocketReceiveMessageFromResult > ReceiveMessageFromAsync(ArraySegment< byte > buffer, SocketFlags socketFlags, EndPoint remoteEndPoint)
Definition Socket.cs:4105
static CachedSerializedEndPoint s_cachedAnyV6EndPoint
Definition Socket.cs:577
DynamicWinsockMethods GetDynamicWinsockMethods()
Definition Socket.cs:4447
void Connect(string host, int port)
Definition Socket.cs:1270
static Exception GetException(SocketError error, bool wrapExceptionsInIOExceptions=false)
Definition Socket.cs:4334
bool CheckErrorAndUpdateStatus(SocketError errorCode)
Definition Socket.cs:3747
bool CanTryAddressFamily(AddressFamily family)
Definition Socket.cs:1159
IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback? callback, object? state)
Definition Socket.cs:2433
void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue)
Definition Socket.cs:2143
int Send(IList< ArraySegment< byte > > buffers, SocketFlags socketFlags, out SocketError errorCode)
Definition Socket.cs:1476
int Receive(Span< byte > buffer, SocketFlags socketFlags)
Definition Socket.cs:1786
ThreadPoolBoundHandle GetOrAllocateThreadPoolBoundHandle()
Definition Socket.cs:4599
Task ConnectAsync(IPAddress address, int port)
Definition Socket.cs:3943
bool ConnectAsync(SocketAsyncEventArgs e)
Definition Socket.cs:2822
void EndConnect(IAsyncResult asyncResult)
Definition Socket.cs:2398
void UpdateConnectSocketErrorForDisposed(ref SocketError socketError)
Definition Socket.cs:3806
static readonly SocketsTelemetry Log
static bool ValidatePortNumber(int port)
static ExceptionDispatchInfo Capture(Exception source)
static string net_sockets_invalid_dnsendpoint
Definition SR.cs:76
static string net_sockets_mustlisten
Definition SR.cs:62
static string net_invalidversion
Definition SR.cs:16
static string net_invalidAddressList
Definition SR.cs:42
static string net_sockets_invalid_optionValue
Definition SR.cs:72
static string net_sockets_valuetaskmisuse
Definition SR.cs:112
static string InvalidNullArgument
Definition SR.cs:86
static string net_sockets_namedmustnotbebound
Definition SR.cs:68
static string net_io_readfailure
Definition SR.cs:158
static string net_sockets_invalid_optionValue_all
Definition SR.cs:24
static string Arg_InvalidHandle
Definition SR.cs:14
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string net_multibuffernotsupported
Definition SR.cs:88
static string net_sockets_invalid_ipaddress_length
Definition SR.cs:70
static string net_sockets_empty_select
Definition SR.cs:58
static string net_notconnected
Definition SR.cs:24
static string net_io_writefailure
Definition SR.cs:92
static string net_sockets_mustnotlisten
Definition SR.cs:64
static string InvalidOperation_IncorrectToken
Definition SR.cs:106
static string net_sockets_mustbind
Definition SR.cs:60
static string net_sockets_disconnectedAccept
Definition SR.cs:80
static string net_sockets_disconnectedConnect
Definition SR.cs:78
static string InvalidOperation_MultipleContinuations
Definition SR.cs:108
static string net_sockets_mustnotbebound
Definition SR.cs:66
static string net_sockets_invalid_socketinformation
Definition SR.cs:114
static string net_invasync
Definition SR.cs:20
static string ArgumentOutOfRange_Bounds_Lower_Upper_Named
Definition SR.cs:98
static string net_sockets_zerolist
Definition SR.cs:48
static string net_InvalidEndPointAddressFamily
Definition SR.cs:38
static string net_io_readwritefailure
Definition SR.cs:102
static string net_sockets_toolarge_select
Definition SR.cs:56
static string net_sockets_select
Definition SR.cs:54
Definition SR.cs:7
static ? ExecutionContext Capture()
static void Run(ExecutionContext executionContext, ContextCallback callback, object? state)
static int CompareExchange(ref int location1, int value, int comparand)
static int Exchange(ref int location1, int value)
static ? SynchronizationContext Current
static Task GetTask(IAsyncResult asyncResult)
Definition TaskToApm.cs:71
static IAsyncResult Begin(Task task, AsyncCallback callback, object state)
Definition TaskToApm.cs:43
static void End(IAsyncResult asyncResult)
Definition TaskToApm.cs:48
static new TaskFactory< TResult > Factory
Definition Task.cs:56
static Task FromException(Exception exception)
Definition Task.cs:3341
AggregateException? Exception
Definition Task.cs:1014
static bool QueueUserWorkItem(WaitCallback callBack)
static bool UnsafeQueueUserWorkItem(WaitCallback callBack, object? state)
static readonly IntPtr Zero
Definition IntPtr.cs:18
static ValueTask CompletedTask
Definition ValueTask.cs:71
static ValueTask FromCanceled(CancellationToken cancellationToken)
Definition ValueTask.cs:180
static ValueTask FromException(Exception exception)
Definition ValueTask.cs:190