1 // System.Net.Sockets.SocketTest.cs
4 // Brad Fitzpatrick (brad@danga.com)
5 // Gonzalo Paniagua Javier (gonzalo@novell.com)
7 // (C) Copyright 2003 Brad Fitzpatrick
8 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
12 using System.Diagnostics;
14 using System.Collections;
15 using System.Threading;
16 using System.Reflection;
17 using System.Text.RegularExpressions;
18 using System.Threading.Tasks;
20 using System.Net.Sockets;
21 using NUnit.Framework;
24 using System.Collections.Generic;
26 using MonoTests.Helpers;
28 namespace MonoTests.System.Net.Sockets
31 [Category ("RequiresBSDSockets")]
32 public class SocketTest
34 // note: also used in SocketCas tests
35 public const string BogusAddress = "192.168.244.244";
36 public const int BogusPort = 23483;
39 public void ConnectIPAddressAny ()
41 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
43 /* UDP sockets use Any to disconnect
45 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
50 } catch (SocketException ex) {
51 Assert.AreEqual (10049, ex.ErrorCode, "#2");
56 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
61 } catch (SocketException ex) {
62 Assert.AreEqual (10049, ex.ErrorCode, "#4");
67 [Ignore ("Bug #75158")] // Looks like MS fails after the .ctor, when you try to use the socket
68 public void IncompatibleAddress ()
70 IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any,
71 NetworkHelpers.FindFreePort ());
74 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) {
79 } catch (SocketException ex) {
80 // address incompatible with protocol
81 int expectedError = 10047;
82 Assert.AreEqual (expectedError, ex.ErrorCode,
88 [Category ("InetAccess")]
89 public void BogusEndConnect ()
91 IPAddress ipOne = IPAddress.Parse (BogusAddress);
92 IPEndPoint ipEP = new IPEndPoint (ipOne, BogusPort);
93 Socket sock = new Socket (ipEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
94 IAsyncResult ar = sock.BeginConnect (ipEP, null, null);
97 // should raise an exception because connect was bogus
100 } catch (SocketException ex) {
101 // Actual error code depends on network configuration.
102 var error = (SocketError) ex.ErrorCode;
103 Assert.That (error == SocketError.TimedOut ||
104 error == SocketError.ConnectionRefused ||
105 error == SocketError.NetworkUnreachable ||
106 error == SocketError.HostUnreachable, "#2");
111 [ExpectedException (typeof (ArgumentNullException))]
112 public void SelectEmpty ()
114 ArrayList list = new ArrayList ();
115 Socket.Select (list, list, list, 1000);
118 private bool BlockingConnect (bool block, int port)
120 IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, port);
121 Socket server = new Socket(AddressFamily.InterNetwork,
125 server.Blocking=block;
129 Socket conn = new Socket (AddressFamily.InterNetwork,
134 Socket client = null;
135 var sw = Stopwatch.StartNew ();
136 while (sw.ElapsedMilliseconds < 100)
139 client = server.Accept();
142 catch (SocketException ex) {
143 if (ex.SocketErrorCode == SocketError.WouldBlock)
148 Assert.IsNotNull (client, "Couldn't accept a client connection within 100ms.");
149 bool client_block = client.Blocking;
155 return(client_block);
159 public void AcceptBlockingStatus()
162 var port = NetworkHelpers.FindFreePort ();
164 block = BlockingConnect(true, port);
165 Assert.AreEqual (block, true, "BlockingStatus01");
167 block = BlockingConnect(false, port);
168 Assert.AreEqual (block, false, "BlockingStatus02");
171 static bool CFAConnected = false;
172 static ManualResetEvent CFACalledBack;
174 private static void CFACallback (IAsyncResult asyncResult)
176 Socket sock = (Socket)asyncResult.AsyncState;
177 CFAConnected = sock.Connected;
179 if (sock.Connected) {
180 sock.EndConnect (asyncResult);
183 CFACalledBack.Set ();
186 [Test] // Connect (IPEndPoint)
187 public void Connect1_RemoteEP_Null ()
189 Socket s = new Socket (AddressFamily.InterNetwork,
190 SocketType.Stream, ProtocolType.Tcp);
192 s.Connect ((IPEndPoint) null);
194 } catch (ArgumentNullException ex) {
195 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
196 Assert.IsNull (ex.InnerException, "#3");
197 Assert.IsNotNull (ex.Message, "#4");
198 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
203 public void ConnectFailAsync ()
205 Socket sock = new Socket (AddressFamily.InterNetwork,
208 sock.Blocking = false;
209 CFACalledBack = new ManualResetEvent (false);
210 CFACalledBack.Reset ();
212 /* Need a port that is not being used for
215 sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
216 NetworkHelpers.FindFreePort ()),
217 new AsyncCallback (CFACallback),
219 CFACalledBack.WaitOne ();
221 Assert.AreEqual (CFAConnected, false, "ConnectFail");
225 public void SetSocketOptionBoolean ()
227 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
228 Socket sock = new Socket (ep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
230 sock.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
236 public void TestSelect1 ()
238 Socket srv = CreateServer (NetworkHelpers.FindFreePort ());
239 ClientSocket clnt = new ClientSocket (srv.LocalEndPoint);
240 Thread th = new Thread (new ThreadStart (clnt.ConnectSleepClose));
246 ArrayList list = new ArrayList ();
247 ArrayList empty = new ArrayList ();
249 Socket.Select (list, empty, empty, 100);
250 Assert.AreEqual (0, empty.Count, "#01");
251 Assert.AreEqual (1, list.Count, "#02");
252 Socket.Select (empty, list, empty, 100);
253 Assert.AreEqual (0, empty.Count, "#03");
254 Assert.AreEqual (1, list.Count, "#04");
255 Socket.Select (list, empty, empty, -1);
256 Assert.AreEqual (0, empty.Count, "#05");
257 Assert.AreEqual (1, list.Count, "#06");
258 // Need to read the 10 bytes from the client to avoid a RST
259 byte [] bytes = new byte [10];
268 static Socket CreateServer (int port)
270 Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
271 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
280 public ClientSocket (EndPoint ep)
283 sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
286 public void ConnectSleepClose ()
295 byte [] b = new byte [10];
300 byte[] buf = new byte[100];
303 [ExpectedException (typeof (ObjectDisposedException))]
304 public void Disposed2 ()
306 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
313 [ExpectedException (typeof (ObjectDisposedException))]
314 public void Disposed6 ()
316 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
323 [ExpectedException (typeof (ObjectDisposedException))]
324 public void Disposed7 ()
326 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
333 [ExpectedException (typeof (ObjectDisposedException))]
334 public void Disposed15 ()
336 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
343 [ExpectedException (typeof (ObjectDisposedException))]
344 public void Disposed16 ()
346 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
353 [ExpectedException (typeof (ObjectDisposedException))]
354 public void Disposed17 ()
356 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
363 [ExpectedException (typeof (ObjectDisposedException))]
364 public void Disposed18 ()
366 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
369 s.Send (buf, 0, 10, 0);
373 [ExpectedException (typeof (ObjectDisposedException))]
374 public void Disposed19 ()
376 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
377 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
380 s.SendTo (buf, 0, ep);
384 [ExpectedException (typeof (ObjectDisposedException))]
385 public void Disposed20 ()
387 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
388 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
391 s.SendTo (buf, 10, 0, ep);
395 [ExpectedException (typeof (ObjectDisposedException))]
396 public void Disposed21 ()
398 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
399 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
402 s.SendTo (buf, 0, 10, 0, ep);
406 [ExpectedException (typeof (ObjectDisposedException))]
407 public void Disposed22 ()
409 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
410 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
417 [ExpectedException (typeof (ObjectDisposedException))]
418 public void Disposed23 ()
420 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
427 public void GetHashCodeTest ()
429 Socket server = new Socket (AddressFamily.InterNetwork,
430 SocketType.Stream, ProtocolType.Tcp);
431 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
432 NetworkHelpers.FindFreePort ());
436 Socket client = new Socket (AddressFamily.InterNetwork,
437 SocketType.Stream, ProtocolType.Tcp);
438 int hashcodeA = client.GetHashCode ();
440 int hashcodeB = client.GetHashCode ();
441 Assert.AreEqual (hashcodeA, hashcodeB, "#1");
443 int hashcodeC = client.GetHashCode ();
444 Assert.AreEqual (hashcodeB, hashcodeC, "#2");
448 static ManualResetEvent SocketError_event = new ManualResetEvent (false);
450 private static void SocketError_callback (IAsyncResult ar)
452 Socket sock = (Socket)ar.AsyncState;
455 sock.EndConnect (ar);
458 SocketError_event.Set ();
462 public void SocketErrorTest ()
464 Socket sock = new Socket (AddressFamily.InterNetwork,
467 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
470 SocketError_event.Reset ();
472 sock.Blocking = false;
473 sock.BeginConnect (ep, new AsyncCallback(SocketError_callback),
476 if (SocketError_event.WaitOne (2000, false) == false) {
477 Assert.Fail ("SocketError wait timed out");
480 Assert.AreEqual (false, sock.Connected, "SocketError #1");
484 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
485 Assert.AreEqual (10061, error, "SocketError #2");
487 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
488 Assert.AreEqual (10061, error, "SocketError #3");
495 public void SocketInformationCtor ()
500 public void DontFragmentDefaultTcp ()
502 Socket sock = new Socket (AddressFamily.InterNetwork,
506 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultTcp");
512 [Category ("NotWorking")] // DontFragment doesn't work
513 public void DontFragmentChangeTcp ()
515 Socket sock = new Socket (AddressFamily.InterNetwork,
519 sock.DontFragment = true;
521 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeTcp");
527 public void DontFragmentDefaultUdp ()
529 Socket sock = new Socket (AddressFamily.InterNetwork,
533 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultUdp");
539 [Category ("NotWorking")] // DontFragment doesn't work
540 public void DontFragmentChangeUdp ()
542 Socket sock = new Socket (AddressFamily.InterNetwork,
546 sock.DontFragment = true;
548 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeUdp");
554 [ExpectedException (typeof(ObjectDisposedException))]
555 public void DontFragmentClosed ()
557 Socket sock = new Socket (AddressFamily.InterNetwork,
563 bool val = sock.DontFragment;
567 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
568 public void DontFragment ()
570 Socket sock = new Socket (AddressFamily.NetBios,
571 SocketType.Seqpacket,
572 ProtocolType.Unspecified);
575 sock.DontFragment = true;
576 Assert.Fail ("DontFragment #1");
577 } catch (NotSupportedException) {
584 public void EnableBroadcastDefaultTcp ()
586 Socket sock = new Socket (AddressFamily.InterNetwork,
591 bool value = sock.EnableBroadcast;
592 Assert.Fail ("EnableBroadcastDefaultTcp #1");
593 } catch (SocketException ex) {
594 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
601 public void EnableBroadcastDefaultUdp ()
603 Socket sock = new Socket (AddressFamily.InterNetwork,
607 Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp");
613 public void EnableBroadcastChangeTcp ()
615 Socket sock = new Socket (AddressFamily.InterNetwork,
620 sock.EnableBroadcast = true;
621 Assert.Fail ("EnableBroadcastChangeTcp #1");
622 } catch (SocketException ex) {
623 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
630 public void EnableBroadcastChangeUdp ()
632 Socket sock = new Socket (AddressFamily.InterNetwork,
636 sock.EnableBroadcast = true;
638 Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp");
644 [ExpectedException (typeof(ObjectDisposedException))]
645 public void EnableBroadcastClosed ()
647 Socket sock = new Socket (AddressFamily.InterNetwork,
653 bool val = sock.EnableBroadcast;
656 /* Can't test the default for ExclusiveAddressUse as
657 * it's different on different versions and service
661 [Category ("NotWorking")] // Not supported on Linux
662 public void ExclusiveAddressUseUnbound ()
664 Socket sock = new Socket (AddressFamily.InterNetwork,
668 sock.ExclusiveAddressUse = true;
670 Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound");
676 [ExpectedException (typeof(InvalidOperationException))]
677 [Category ("NotWorking")] // Not supported on Linux
678 public void ExclusiveAddressUseBound ()
680 Socket sock = new Socket (AddressFamily.InterNetwork,
684 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
685 sock.ExclusiveAddressUse = true;
690 [ExpectedException (typeof(ObjectDisposedException))]
691 public void ExclusiveAddressUseClosed ()
693 Socket sock = new Socket (AddressFamily.InterNetwork,
699 bool val = sock.ExclusiveAddressUse;
703 public void IsBoundTcp ()
705 Socket sock = new Socket (AddressFamily.InterNetwork,
708 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
711 Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1");
714 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2");
718 Socket sock2 = new Socket (AddressFamily.InterNetwork,
722 Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3");
725 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4");
728 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5");
731 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6");
735 public void IsBoundUdp ()
737 Socket sock = new Socket (AddressFamily.InterNetwork,
740 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
743 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1");
746 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2");
749 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3");
752 sock = new Socket (AddressFamily.InterNetwork,
756 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4");
759 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5");
762 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6");
766 /* Should not throw an exception */
767 public void IsBoundClosed ()
769 Socket sock = new Socket (AddressFamily.InterNetwork,
775 bool val = sock.IsBound;
778 /* Nothing much to test for LingerState */
781 public void MulticastLoopbackDefaultTcp ()
783 Socket sock = new Socket (AddressFamily.InterNetwork,
788 bool value = sock.MulticastLoopback;
789 Assert.Fail ("MulticastLoopbackDefaultTcp #1");
790 } catch (SocketException ex) {
791 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
798 public void MulticastLoopbackChangeTcp ()
800 Socket sock = new Socket (AddressFamily.InterNetwork,
805 sock.MulticastLoopback = false;
806 Assert.Fail ("MulticastLoopbackChangeTcp #1");
807 } catch (SocketException ex) {
808 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
815 public void MulticastLoopbackDefaultUdp ()
817 Socket sock = new Socket (AddressFamily.InterNetwork,
821 Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp");
827 public void MulticastLoopbackChangeUdp ()
829 Socket sock = new Socket (AddressFamily.InterNetwork,
833 sock.MulticastLoopback = false;
835 Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp");
841 [ExpectedException (typeof(ObjectDisposedException))]
842 public void MulticastLoopbackClosed ()
844 Socket sock = new Socket (AddressFamily.InterNetwork,
850 bool val = sock.MulticastLoopback;
853 /* OSSupportsIPv6 depends on the environment */
856 [Category("NotWorking")] // We have different defaults for perf reasons
857 public void ReceiveBufferSizeDefault ()
859 Socket sock = new Socket (AddressFamily.InterNetwork,
863 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault");
869 [Category("NotWorking")] // We have different defaults for perf reasons
870 public void ReceiveBufferSizeDefaultUdp ()
872 Socket sock = new Socket (AddressFamily.InterNetwork,
876 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp");
882 public void ReceiveBufferSizeChange ()
884 Socket sock = new Socket (AddressFamily.InterNetwork,
888 sock.ReceiveBufferSize = 16384;
890 Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange");
896 [Category("NotWorking")] // We cannot totally remove buffers (minimum is set to 256
897 public void BuffersCheck_None ()
899 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
900 int original = s.ReceiveBufferSize;
901 s.ReceiveBufferSize = 0;
902 Assert.AreEqual (0, s.ReceiveBufferSize, "ReceiveBufferSize " + original.ToString ());
904 original = s.SendBufferSize;
905 s.SendBufferSize = 0;
906 Assert.AreEqual (0, s.SendBufferSize, "SendBufferSize " + original.ToString ());
911 [ExpectedException (typeof(ObjectDisposedException))]
912 public void ReceiveBufferSizeClosed ()
914 Socket sock = new Socket (AddressFamily.InterNetwork,
920 int val = sock.ReceiveBufferSize;
924 [Category("NotWorking")] // We have different defaults for perf reasons
925 public void SendBufferSizeDefault ()
927 Socket sock = new Socket (AddressFamily.InterNetwork,
931 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault");
937 [Category("NotWorking")] // We have different defaults for perf reasons
938 public void SendBufferSizeDefaultUdp ()
940 Socket sock = new Socket (AddressFamily.InterNetwork,
944 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp");
950 public void SendBufferSizeChange ()
952 Socket sock = new Socket (AddressFamily.InterNetwork,
956 sock.SendBufferSize = 16384;
958 Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange");
964 [ExpectedException (typeof(ObjectDisposedException))]
965 public void SendBufferSizeClosed ()
967 Socket sock = new Socket (AddressFamily.InterNetwork,
973 int val = sock.SendBufferSize;
976 /* No test for TTL default as it's platform dependent */
978 public void TtlChange ()
980 Socket sock = new Socket (AddressFamily.InterNetwork,
986 Assert.AreEqual (255, sock.Ttl, "TtlChange");
992 public void TtlChangeOverflow ()
994 Socket sock = new Socket (AddressFamily.InterNetwork,
1000 Assert.Fail ("TtlChangeOverflow #1");
1001 } catch (ArgumentOutOfRangeException ex) {
1002 Assert.AreEqual ("value", ex.ParamName,
1003 "TtlChangeOverflow #2");
1009 /* Apparently you can set TTL=0 on the ms runtime!!
1012 Assert.Fail ("TtlChangeOverflow #4");
1013 } catch (SocketException ex) {
1014 Assert.AreEqual (10022, ex.ErrorCode,
1015 "TtlChangeOverflow #5");
1022 [ExpectedException (typeof(ObjectDisposedException))]
1023 public void TtlClosed ()
1025 Socket sock = new Socket (AddressFamily.InterNetwork,
1035 public void UseOnlyOverlappedIODefault ()
1037 Socket sock = new Socket (AddressFamily.InterNetwork,
1041 Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault");
1047 // We need this because the Linux kernel in certain configurations
1048 // will end up rounding up the values passed on to the kernel
1049 // for socket send/receive timeouts.
1051 int Approximate (int target, int value)
1055 if (value > target-10 && value < target+10)
1061 public void UseOnlyOverlappedIOChange ()
1063 Socket sock = new Socket (AddressFamily.InterNetwork,
1067 sock.UseOnlyOverlappedIO = true;
1069 Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange");
1075 /* Should not throw an exception */
1076 public void UseOnlyOverlappedIOClosed ()
1078 Socket sock = new Socket (AddressFamily.InterNetwork,
1084 bool val = sock.UseOnlyOverlappedIO;
1088 public void SendTimeoutDefault ()
1090 Socket sock = new Socket (AddressFamily.InterNetwork,
1094 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault");
1100 public void SendTimeoutChange ()
1102 Socket sock = new Socket (AddressFamily.InterNetwork,
1106 /* Should be rounded up to 500, according to
1107 * the MSDN docs, but the MS runtime doesn't
1109 sock.SendTimeout = 50;
1110 Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1");
1112 sock.SendTimeout = 2000;
1113 Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2");
1115 sock.SendTimeout = 0;
1116 Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3");
1118 /* Should be the same as setting 0 */
1119 sock.SendTimeout = -1;
1120 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4");
1122 sock.SendTimeout = 65536;
1123 Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5");
1126 sock.SendTimeout = -2;
1127 Assert.Fail ("SendTimeoutChange #8");
1128 } catch (ArgumentOutOfRangeException) {
1135 [ExpectedException (typeof(ObjectDisposedException))]
1136 public void SendTimeoutClosed ()
1138 Socket sock = new Socket (AddressFamily.InterNetwork,
1144 int val = sock.SendTimeout;
1148 public void ReceiveTimeoutDefault ()
1150 Socket sock = new Socket (AddressFamily.InterNetwork,
1154 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault");
1160 public void ReceiveTimeoutChange ()
1162 Socket sock = new Socket (AddressFamily.InterNetwork,
1166 sock.ReceiveTimeout = 50;
1167 Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1");
1169 sock.ReceiveTimeout = 2000;
1170 Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2");
1172 sock.ReceiveTimeout = 0;
1173 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3");
1175 /* Should be the same as setting 0 */
1176 sock.ReceiveTimeout = -1;
1177 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4");
1179 sock.ReceiveTimeout = 65536;
1180 Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5");
1183 sock.ReceiveTimeout = -2;
1184 Assert.Fail ("ReceiveTimeoutChange #8");
1185 } catch (ArgumentOutOfRangeException) {
1192 [ExpectedException (typeof(ObjectDisposedException))]
1193 public void ReceiveTimeoutClosed ()
1195 Socket sock = new Socket (AddressFamily.InterNetwork,
1201 int val = sock.ReceiveTimeout;
1205 public void NoDelayDefaultTcp ()
1207 Socket sock = new Socket (AddressFamily.InterNetwork,
1211 Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
1217 public void NoDelayChangeTcp ()
1219 Socket sock = new Socket (AddressFamily.InterNetwork,
1223 sock.NoDelay = true;
1225 Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp");
1231 public void NoDelayDefaultUdp ()
1233 Socket sock = new Socket (AddressFamily.InterNetwork,
1238 bool val = sock.NoDelay;
1239 Assert.Fail ("NoDelayDefaultUdp #1");
1240 } catch (SocketException ex) {
1241 Assert.AreEqual (10042, ex.ErrorCode,
1242 "NoDelayDefaultUdp #2");
1249 public void NoDelayChangeUdp ()
1251 Socket sock = new Socket (AddressFamily.InterNetwork,
1256 sock.NoDelay = true;
1257 Assert.Fail ("NoDelayChangeUdp #1");
1258 } catch (SocketException ex) {
1259 Assert.AreEqual (10042, ex.ErrorCode,
1260 "NoDelayChangeUdp #2");
1267 [ExpectedException (typeof(ObjectDisposedException))]
1268 public void NoDelayClosed ()
1270 Socket sock = new Socket (AddressFamily.InterNetwork,
1276 bool val = sock.NoDelay;
1279 static bool BAAccepted = false;
1280 static Socket BASocket = null;
1281 static ManualResetEvent BACalledBack = new ManualResetEvent (false);
1283 private static void BACallback (IAsyncResult asyncResult)
1285 Socket sock = (Socket)asyncResult.AsyncState;
1287 BASocket = sock.EndAccept (asyncResult);
1290 BACalledBack.Set ();
1294 [ExpectedException (typeof(InvalidOperationException))]
1295 public void BeginAcceptNotBound ()
1297 Socket sock = new Socket (AddressFamily.InterNetwork,
1301 sock.BeginAccept (BACallback, sock);
1307 [ExpectedException (typeof(InvalidOperationException))]
1308 public void BeginAcceptNotListening ()
1310 Socket sock = new Socket (AddressFamily.InterNetwork,
1314 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
1316 sock.BeginAccept (BACallback, sock);
1322 public void BeginAccept ()
1324 Socket sock = new Socket (AddressFamily.InterNetwork,
1327 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1328 NetworkHelpers.FindFreePort ());
1333 BACalledBack.Reset ();
1335 sock.BeginAccept (BACallback, sock);
1337 Socket conn = new Socket (AddressFamily.InterNetwork,
1343 if (BACalledBack.WaitOne (2000, false) == false) {
1344 Assert.Fail ("BeginAccept wait timed out");
1347 Assert.AreEqual (true, BAAccepted, "BeginAccept #1");
1348 Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2");
1349 Assert.AreEqual (false, sock.Connected, "BeginAccept #3");
1350 Assert.AreEqual (true, conn.Connected, "BeginAccept #4");
1358 [ExpectedException (typeof(ObjectDisposedException))]
1359 public void BeginAcceptClosed ()
1361 Socket sock = new Socket (AddressFamily.InterNetwork,
1367 sock.BeginAccept (BACallback, sock);
1370 static bool BADAccepted = false;
1371 static Socket BADSocket = null;
1372 static byte[] BADBytes;
1373 static int BADByteCount;
1374 static ManualResetEvent BADCalledBack = new ManualResetEvent (false);
1376 private static void BADCallback (IAsyncResult asyncResult)
1378 Socket sock = (Socket)asyncResult.AsyncState;
1380 BADSocket = sock.EndAccept (out BADBytes,
1385 BADCalledBack.Set ();
1389 public void BeginAcceptData ()
1391 Socket sock = new Socket (AddressFamily.InterNetwork,
1394 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1395 NetworkHelpers.FindFreePort ());
1400 BADCalledBack.Reset ();
1402 sock.BeginAccept (256, BADCallback, sock);
1404 Socket conn = new Socket (AddressFamily.InterNetwork,
1407 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1410 conn.Send (send_bytes);
1412 if (BADCalledBack.WaitOne (2000, false) == false) {
1413 Assert.Fail ("BeginAcceptData wait timed out");
1416 Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1");
1417 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2");
1418 Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3");
1419 Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4");
1420 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5");
1422 /* The MS runtime gives the returned data in a
1423 * much bigger array. TODO: investigate
1424 * whether it the size correlates to the first
1425 * parameter in BeginAccept()
1427 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1428 "BeginAcceptData #6");
1430 for(int i = 0; i < send_bytes.Length; i++) {
1431 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ());
1440 [ExpectedException (typeof(ObjectDisposedException))]
1441 public void BeginAcceptDataClosed ()
1443 Socket sock = new Socket (AddressFamily.InterNetwork,
1449 sock.BeginAccept (256, BADCallback, sock);
1453 public void BeginAcceptSocketUdp ()
1455 Socket sock = new Socket (AddressFamily.InterNetwork,
1458 Socket acc = new Socket (AddressFamily.InterNetwork,
1462 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1463 NetworkHelpers.FindFreePort ());
1469 sock.BeginAccept (acc, 256, BADCallback, sock);
1470 Assert.Fail ("BeginAcceptSocketUdp #1");
1471 } catch (SocketException ex) {
1472 Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
1480 public void BeginAcceptSocketBound ()
1482 Socket sock = new Socket (AddressFamily.InterNetwork,
1485 Socket acc = new Socket (AddressFamily.InterNetwork,
1489 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
1490 NetworkHelpers.FindFreePort ());
1492 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
1493 NetworkHelpers.FindFreePort ());
1501 sock.BeginAccept (acc, 256, BADCallback, sock);
1502 Assert.Fail ("BeginAcceptSocketBound #1");
1503 } catch (InvalidOperationException) {
1511 public void BeginAcceptSocket ()
1513 Socket sock = new Socket (AddressFamily.InterNetwork,
1516 Socket acc = new Socket (AddressFamily.InterNetwork,
1520 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1521 NetworkHelpers.FindFreePort ());
1526 BADCalledBack.Reset ();
1528 sock.BeginAccept (acc, 256, BADCallback, sock);
1530 Socket conn = new Socket (AddressFamily.InterNetwork,
1533 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1536 conn.Send (send_bytes);
1538 if (BADCalledBack.WaitOne (2000, false) == false) {
1539 Assert.Fail ("BeginAcceptSocket wait timed out");
1542 Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1");
1543 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2");
1544 Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3");
1545 Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4");
1546 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5");
1547 Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6");
1548 Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7");
1549 Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8");
1550 Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9");
1552 /* The MS runtime gives the returned data in a
1553 * much bigger array. TODO: investigate
1554 * whether it the size correlates to the first
1555 * parameter in BeginAccept()
1557 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1558 "BeginAcceptSocket #10");
1560 for(int i = 0; i < send_bytes.Length; i++) {
1561 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ());
1571 public void BeginAcceptSocketClosed ()
1573 Socket sock = new Socket (AddressFamily.InterNetwork,
1576 Socket acc = new Socket (AddressFamily.InterNetwork,
1583 sock.BeginAccept (acc, 256, BADCallback, null);
1584 Assert.Fail ("BeginAcceptSocketClosed #1");
1585 } catch (ObjectDisposedException) {
1592 public void BeginAcceptSocketAccClosed ()
1594 Socket sock = new Socket (AddressFamily.InterNetwork,
1597 Socket acc = new Socket (AddressFamily.InterNetwork,
1600 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1601 NetworkHelpers.FindFreePort ());
1608 BADCalledBack.Reset ();
1611 sock.BeginAccept (acc, 256, BADCallback, null);
1612 Assert.Fail ("BeginAcceptSocketAccClosed #1");
1613 } catch (ObjectDisposedException) {
1619 static bool BCConnected = false;
1620 static ManualResetEvent BCCalledBack = new ManualResetEvent (false);
1622 private static void BCCallback (IAsyncResult asyncResult)
1624 Socket sock = (Socket)asyncResult.AsyncState;
1627 sock.EndConnect (asyncResult);
1628 } catch (Exception e) {
1629 Console.WriteLine ("BCCallback exception:");
1630 Console.WriteLine (e);
1637 BCCalledBack.Set ();
1641 public void BeginConnectAddressPort ()
1643 Socket sock = new Socket (AddressFamily.InterNetwork,
1646 Socket listen = new Socket (AddressFamily.InterNetwork,
1649 IPAddress ip = IPAddress.Loopback;
1650 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1655 BCCalledBack.Reset ();
1657 BCConnected = false;
1659 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1661 if (BCCalledBack.WaitOne (2000, false) == false) {
1662 Assert.Fail ("BeginConnectAddressPort wait timed out");
1665 Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1");
1672 public void BeginConnectAddressPortNull ()
1674 Socket sock = new Socket (AddressFamily.InterNetwork,
1677 IPAddress ip = null;
1680 sock.BeginConnect (ip, 1244, BCCallback,
1682 Assert.Fail ("BeginConnectAddressPortNull #1");
1683 } catch (ArgumentNullException) {
1690 public void BeginConnectAddressPortListen ()
1692 Socket sock = new Socket (AddressFamily.InterNetwork,
1695 IPAddress ip = IPAddress.Loopback;
1696 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1702 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1703 Assert.Fail ("BeginConnectAddressPortListen #1");
1704 } catch (InvalidOperationException) {
1711 [ExpectedException (typeof(ObjectDisposedException))]
1712 public void BeginConnectAddressPortClosed ()
1714 Socket sock = new Socket (AddressFamily.InterNetwork,
1717 IPAddress ip = IPAddress.Loopback;
1721 sock.BeginConnect (ip, 1244, BCCallback, sock);
1725 [Category ("NotOnMac")]
1727 * This is not a Mono bug.
1729 * By default, only 127.0.0.1 is enabled and you must explicitly
1730 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
1732 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
1733 * until I add that alias.
1736 public void BeginConnectMultiple ()
1738 Socket sock = new Socket (AddressFamily.InterNetwork,
1741 Socket listen = new Socket (AddressFamily.InterNetwork,
1744 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1745 NetworkHelpers.FindFreePort ());
1746 IPAddress[] ips = new IPAddress[4];
1748 ips[0] = IPAddress.Parse ("127.0.0.4");
1749 ips[1] = IPAddress.Parse ("127.0.0.3");
1750 ips[2] = IPAddress.Parse ("127.0.0.2");
1751 ips[3] = IPAddress.Parse ("127.0.0.1");
1756 BCCalledBack.Reset ();
1758 BCConnected = false;
1760 sock.BeginConnect (ips, ep.Port, BCCallback, sock);
1762 /* Longer wait here, because the ms runtime
1763 * takes a lot longer to not connect
1766 if (BCCalledBack.WaitOne (30000, false) == false) {
1767 Assert.Fail ("BeginConnectMultiple wait failed");
1771 Assert.IsTrue (BCCalledBack.WaitOne (30000), "#0");
1773 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
1774 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
1775 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1777 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2");
1784 public void BeginConnectMultiple2 ()
1786 Socket sock = new Socket (AddressFamily.InterNetwork,
1789 Socket listen = new Socket (AddressFamily.InterNetwork,
1793 // Need at least two addresses.
1794 var ips = Dns.GetHostAddresses (string.Empty);
1796 Assert.Ignore ("This test needs at least two IP addresses.");
1798 var allIps = new IPAddress [ips.Length + 1];
1799 allIps [0] = IPAddress.Loopback;
1800 ips.CopyTo (allIps, 1);
1803 * Only bind to the loopback interface, so all the non-loopback
1804 * IP addresses will fail. BeginConnect()/EndConnect() should
1805 * succeed it it can connect to at least one of the requested
1808 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
1813 BCCalledBack.Reset ();
1815 BCConnected = false;
1817 sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
1819 /* Longer wait here, because the ms runtime
1820 * takes a lot longer to not connect
1822 if (BCCalledBack.WaitOne (10000, false) == false) {
1823 Assert.Fail ("BeginConnectMultiple2 wait failed");
1826 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple2 #1");
1827 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple2 #2");
1828 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1830 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple2 #2");
1838 public void BeginConnectMultipleNull ()
1840 Socket sock = new Socket (AddressFamily.InterNetwork,
1843 IPAddress[] ips = null;
1846 sock.BeginConnect (ips, 1246, BCCallback,
1848 Assert.Fail ("BeginConnectMultipleNull #1");
1849 } catch (ArgumentNullException) {
1856 public void BeginConnectMultipleListen ()
1858 Socket sock = new Socket (AddressFamily.InterNetwork,
1861 IPAddress[] ips = new IPAddress[4];
1862 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1863 NetworkHelpers.FindFreePort ());
1865 ips[0] = IPAddress.Parse ("127.0.0.4");
1866 ips[1] = IPAddress.Parse ("127.0.0.3");
1867 ips[2] = IPAddress.Parse ("127.0.0.2");
1868 ips[3] = IPAddress.Parse ("127.0.0.1");
1874 sock.BeginConnect (ips, ep.Port, BCCallback,
1876 Assert.Fail ("BeginConnectMultipleListen #1");
1877 } catch (InvalidOperationException) {
1884 [ExpectedException (typeof(ObjectDisposedException))]
1885 public void BeginConnectMultipleClosed ()
1887 Socket sock = new Socket (AddressFamily.InterNetwork,
1890 IPAddress[] ips = new IPAddress[4];
1892 ips[0] = IPAddress.Parse ("127.0.0.4");
1893 ips[1] = IPAddress.Parse ("127.0.0.3");
1894 ips[2] = IPAddress.Parse ("127.0.0.2");
1895 ips[3] = IPAddress.Parse ("127.0.0.1");
1899 sock.BeginConnect (ips, 1247, BCCallback, sock);
1903 public void BeginConnectHostPortNull ()
1905 Socket sock = new Socket (AddressFamily.InterNetwork,
1910 sock.BeginConnect ((string)null, 0,
1912 Assert.Fail ("BeginConnectHostPort #1");
1913 } catch (ArgumentNullException) {
1920 public void BeginConnectHostPortListen ()
1922 Socket sock = new Socket (AddressFamily.InterNetwork,
1925 IPAddress ip = IPAddress.Loopback;
1926 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1932 sock.BeginConnect ("localhost", ep.Port,
1934 Assert.Fail ("BeginConnectHostPortListen #1");
1935 } catch (InvalidOperationException) {
1942 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
1943 public void BeginConnectHostPortNotIP ()
1945 Socket sock = new Socket (AddressFamily.NetBios,
1946 SocketType.Seqpacket,
1947 ProtocolType.Unspecified);
1950 sock.BeginConnect ("localhost", 0, BCCallback,
1952 Assert.Fail ("BeginConnectHostPortNotIP #1");
1953 } catch (NotSupportedException) {
1960 [ExpectedException (typeof(ObjectDisposedException))]
1961 public void BeginConnectHostPortClosed ()
1963 Socket sock = new Socket (AddressFamily.InterNetwork,
1969 sock.BeginConnect ("localhost", 0, BCCallback, sock);
1972 static bool BDDisconnected = false;
1973 static ManualResetEvent BDCalledBack = new ManualResetEvent (false);
1975 private static void BDCallback (IAsyncResult asyncResult)
1977 Socket sock = (Socket)asyncResult.AsyncState;
1979 sock.EndDisconnect (asyncResult);
1980 BDDisconnected = true;
1982 BDCalledBack.Set ();
1986 [Category ("NotDotNet")] // "Needs XP or later"
1987 public void BeginDisconnect ()
1989 Socket sock = new Socket (AddressFamily.InterNetwork,
1992 Socket listen = new Socket (AddressFamily.InterNetwork,
1995 IPAddress ip = IPAddress.Loopback;
1996 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2001 sock.Connect (ip, ep.Port);
2003 Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
2005 sock.Shutdown (SocketShutdown.Both);
2007 BDCalledBack.Reset ();
2008 BDDisconnected = false;
2010 sock.BeginDisconnect (false, BDCallback, sock);
2012 if (BDCalledBack.WaitOne (2000, false) == false) {
2013 Assert.Fail ("BeginDisconnect wait timed out");
2016 Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2");
2017 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2024 public void BeginReceiveSocketError ()
2029 public void BeginReceiveGeneric ()
2034 public void BeginReceiveGenericSocketError ()
2038 private static void BSCallback (IAsyncResult asyncResult)
2040 Socket sock = (Socket)asyncResult.AsyncState;
2042 sock.EndSend (asyncResult);
2046 public void BeginSendNotConnected ()
2048 Socket sock = new Socket (AddressFamily.InterNetwork,
2052 byte[] send_bytes = new byte[] {10, 11, 12, 13};
2055 sock.BeginSend (send_bytes, 0,
2057 SocketFlags.None, BSCallback,
2059 Assert.Fail ("BeginSendNotConnected #1");
2060 } catch (SocketException ex) {
2061 Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
2068 public void BeginSendSocketError ()
2073 public void BeginSendGeneric ()
2078 public void BeginSendGenericSocketError ()
2083 public void BindTwice ()
2085 Socket sock = new Socket (AddressFamily.InterNetwork,
2088 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
2089 NetworkHelpers.FindFreePort ());
2090 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
2091 NetworkHelpers.FindFreePort ());
2097 Assert.Fail ("BindTwice #1");
2098 } catch (SocketException ex) {
2099 Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
2106 public void Close ()
2108 Socket sock = new Socket (AddressFamily.InterNetwork,
2111 Socket listen = new Socket (AddressFamily.InterNetwork,
2114 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2115 NetworkHelpers.FindFreePort ());
2122 Assert.AreEqual (true, sock.Connected, "Close #1");
2126 Thread.Sleep (3000);
2128 Assert.AreEqual (false, sock.Connected, "Close #2");
2134 public void ConnectAddressPort ()
2136 Socket sock = new Socket (AddressFamily.InterNetwork,
2139 Socket listen = new Socket (AddressFamily.InterNetwork,
2142 IPAddress ip = IPAddress.Loopback;
2143 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2148 sock.Connect (ip, ep.Port);
2150 Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
2157 public void ConnectAddressPortNull ()
2159 Socket sock = new Socket (AddressFamily.InterNetwork,
2162 IPAddress ip = null;
2165 sock.Connect (ip, 1249);
2166 Assert.Fail ("ConnectAddressPortNull #1");
2167 } catch (ArgumentNullException) {
2174 public void ConnectAddressPortListen ()
2176 Socket sock = new Socket (AddressFamily.InterNetwork,
2179 IPAddress ip = IPAddress.Loopback;
2180 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2186 sock.Connect (ip, ep.Port);
2187 Assert.Fail ("ConnectAddressPortListen #1");
2188 } catch (InvalidOperationException) {
2195 [ExpectedException (typeof(ObjectDisposedException))]
2196 public void ConnectAddressPortClosed ()
2198 Socket sock = new Socket (AddressFamily.InterNetwork,
2201 IPAddress ip = IPAddress.Loopback;
2205 sock.Connect (ip, 1250);
2209 [Category ("NotOnMac")] // MacOSX trashes the fd after the failed connect attempt to 127.0.0.4
2211 * This is not a Mono bug.
2213 * By default, only 127.0.0.1 is enabled and you must explicitly
2214 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
2216 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
2217 * until I add that alias.
2219 * However, after doing so, Mac OS treats these as separate addresses, ie. attempting
2220 * to connect to 127.0.0.4 yields a connection refused.
2222 * When using Connect(), the .NET runtime also throws an exception if connecting to
2223 * any of the IP addresses fails. This is different with BeginConnect()/EndConnect()
2224 * which succeeds when it can connect to at least one of the addresses.
2227 public void ConnectMultiple ()
2229 Socket sock = new Socket (AddressFamily.InterNetwork,
2232 Socket listen = new Socket (AddressFamily.InterNetwork,
2235 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2236 NetworkHelpers.FindFreePort ());
2237 IPAddress[] ips = new IPAddress[4];
2239 ips[0] = IPAddress.Parse ("127.0.0.4");
2240 ips[1] = IPAddress.Parse ("127.0.0.3");
2241 ips[2] = IPAddress.Parse ("127.0.0.2");
2242 ips[3] = IPAddress.Parse ("127.0.0.1");
2247 sock.Connect (ips, ep.Port);
2249 Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
2250 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
2251 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2253 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2");
2260 public void ConnectMultiple2 ()
2262 Socket sock = new Socket (AddressFamily.InterNetwork,
2265 Socket listen = new Socket (AddressFamily.InterNetwork,
2269 // Need at least two addresses.
2270 var ips = Dns.GetHostAddresses (string.Empty);
2272 Assert.Ignore ("This test needs at least two IP addresses.");
2274 var allIps = new IPAddress [ips.Length + 1];
2275 allIps [0] = IPAddress.Loopback;
2276 ips.CopyTo (allIps, 1);
2279 * Bind to IPAddress.Any; Connect() will fail unless it can
2280 * connect to all the addresses in allIps.
2282 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
2287 sock.Connect (allIps, ep.Port);
2289 Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
2290 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
2291 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2293 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple2 #3");
2300 public void ConnectMultipleNull ()
2302 Socket sock = new Socket (AddressFamily.InterNetwork,
2305 IPAddress[] ips = null;
2308 sock.Connect (ips, 1251);
2309 Assert.Fail ("ConnectMultipleNull #1");
2310 } catch (ArgumentNullException) {
2317 public void ConnectMultipleListen ()
2319 Socket sock = new Socket (AddressFamily.InterNetwork,
2322 IPAddress[] ips = new IPAddress[4];
2323 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2324 NetworkHelpers.FindFreePort ());
2326 ips[0] = IPAddress.Parse ("127.0.0.4");
2327 ips[1] = IPAddress.Parse ("127.0.0.3");
2328 ips[2] = IPAddress.Parse ("127.0.0.2");
2329 ips[3] = IPAddress.Parse ("127.0.0.1");
2335 sock.Connect (ips, ep.Port);
2336 Assert.Fail ("ConnectMultipleListen #1");
2337 } catch (InvalidOperationException) {
2344 [ExpectedException (typeof(ObjectDisposedException))]
2345 public void ConnectMultipleClosed ()
2347 Socket sock = new Socket (AddressFamily.InterNetwork,
2350 IPAddress[] ips = new IPAddress[4];
2352 ips[0] = IPAddress.Parse ("127.0.0.4");
2353 ips[1] = IPAddress.Parse ("127.0.0.3");
2354 ips[2] = IPAddress.Parse ("127.0.0.2");
2355 ips[3] = IPAddress.Parse ("127.0.0.1");
2359 sock.Connect (ips, 1252);
2363 public void ConnectHostPortNull ()
2365 Socket sock = new Socket (AddressFamily.InterNetwork,
2370 sock.Connect ((string)null, 0);
2371 Assert.Fail ("ConnectHostPort #1");
2372 } catch (ArgumentNullException) {
2379 public void ConnectHostPortListen ()
2381 Socket sock = new Socket (AddressFamily.InterNetwork,
2384 IPAddress ip = IPAddress.Loopback;
2385 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2391 sock.Connect ("localhost", ep.Port);
2392 Assert.Fail ("ConnectHostPortListen #1");
2393 } catch (InvalidOperationException) {
2400 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
2401 public void ConnectHostPortNotIP ()
2403 Socket sock = new Socket (AddressFamily.NetBios,
2404 SocketType.Seqpacket,
2405 ProtocolType.Unspecified);
2408 sock.Connect ("localhost", 0);
2409 Assert.Fail ("ConnectHostPortNotIP #1");
2410 } catch (NotSupportedException) {
2417 [ExpectedException (typeof(ObjectDisposedException))]
2418 public void ConnectHostPortClosed ()
2420 Socket sock = new Socket (AddressFamily.InterNetwork,
2426 sock.Connect ("localhost", 0);
2430 [Category ("NotDotNet")] // "Needs XP or later"
2431 public void Disconnect ()
2433 Socket sock = new Socket (AddressFamily.InterNetwork,
2436 Socket listen = new Socket (AddressFamily.InterNetwork,
2439 IPAddress ip = IPAddress.Loopback;
2440 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2445 sock.Connect (ip, ep.Port);
2447 Assert.AreEqual (true, sock.Connected, "Disconnect #1");
2449 sock.Shutdown (SocketShutdown.Both);
2451 sock.Disconnect (false);
2453 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2460 public void DuplicateAndClose ()
2465 public void IOControl ()
2470 public void TestDefaultsDualMode ()
2472 using (var socket = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)){
2473 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2476 using (var socket = new Socket (SocketType.Stream, ProtocolType.Tcp)){
2477 Assert.AreEqual (AddressFamily.InterNetworkV6, socket.AddressFamily, "When creating sockets of type stream/tcp, the address family should be InterNetworkV6");
2478 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2480 socket.DualMode = false;
2482 Assert.IsFalse (socket.DualMode, "Setting of DualSocket should turn DualSockets off");
2488 public void ReceiveGeneric ()
2492 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2494 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2495 listensock.Bind (endpoint);
2496 listensock.Listen(1);
2498 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2499 sendsock.Connect(endpoint);
2501 Socket clientsock = listensock.Accept();
2503 byte[] sendbuf = new byte[256];
2505 for(i = 0; i < 256; i++) {
2506 sendbuf[i] = (byte)i;
2508 for (i = 4; i < 6; i++) {
2509 Assert.AreEqual (sendbuf[i], (byte)i,
2510 "#1/" + i.ToString());
2514 sendsock.Send (sendbuf, 0, 256, SocketFlags.None,
2518 byte[] recvbuf = new byte[256];
2519 List<ArraySegment<byte>> recvbuflist = new List<ArraySegment<byte>>(2);
2520 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 4, 2));
2521 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 20, 230));
2523 clientsock.Receive (recvbuflist);
2525 /* recvbuf should now hold the first 2 bytes
2526 * of sendbuf from pos 4, and the next 230
2527 * bytes of sendbuf from pos 20
2530 for (i = 0; i < 2; i++) {
2531 Assert.AreEqual (sendbuf[i], recvbuf[i + 4],
2532 "#2/" + i.ToString());
2534 for (i = 2; i < 232; i++) {
2535 Assert.AreEqual (sendbuf[i], recvbuf[i + 18],
2536 "#2/" + i.ToString());
2540 clientsock.Close ();
2541 listensock.Close ();
2545 public void SendGeneric ()
2549 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2551 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2552 listensock.Bind (endpoint);
2553 listensock.Listen(1);
2555 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2556 sendsock.Connect(endpoint);
2558 Socket clientsock = listensock.Accept();
2560 byte[] sendbuf = new byte[256];
2561 List<ArraySegment<byte>> sendbuflist = new List<ArraySegment<byte>>(2);
2563 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 4, 2));
2564 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 20, 230));
2566 for(i = 0; i < 256; i++) {
2567 sendbuf[i] = (byte)i;
2569 for (i = 4; i < 6; i++) {
2570 Assert.AreEqual (sendbuf[i], (byte)i,
2571 "#1/" + i.ToString());
2575 sendsock.Send (sendbuflist, SocketFlags.None, out err);
2578 byte[] recvbuf = new byte[256];
2580 clientsock.Receive (recvbuf);
2582 /* The first 2 bytes of recvbuf should now
2583 * hold 2 bytes of sendbuf from pos 4, and the
2584 * next 230 bytes of recvbuf should be sendbuf
2588 for (i = 0; i < 2; i++) {
2589 Assert.AreEqual (recvbuf[i], sendbuf[i + 4],
2590 "#2/" + i.ToString());
2592 for (i = 2; i < 232; i++) {
2593 Assert.AreEqual (recvbuf[i], sendbuf[i + 18],
2594 "#2/" + i.ToString());
2598 clientsock.Close ();
2599 listensock.Close ();
2603 public void ConcurrentExceedSocketLimit ()
2605 var tasks = new Task[4];
2606 for (int i = 0; i < 4; i++) {
2607 tasks[i] = Task.Factory.StartNew (() => SendGenericExceedBuffer ());
2609 Task.WaitAll (tasks);
2613 public void SendGenericExceedBuffer ()
2615 // Create a buffer larger than the default max.
2616 const int BUFFER_SIZE = 256 * 256 * 65;
2619 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2621 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2622 listensock.Bind (endpoint);
2623 listensock.Listen (1);
2625 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2626 sendsock.Connect (endpoint);
2628 Socket clientsock = listensock.Accept ();
2630 byte[] sendbuf = new byte[BUFFER_SIZE];
2632 for (i = 0; i < BUFFER_SIZE; i++) {
2633 sendbuf[i] = (byte)i;
2637 int sent = sendsock.Send (sendbuf);
2639 Assert.AreEqual (BUFFER_SIZE, sent, "#1");
2641 byte[] recvbuf = new byte[BUFFER_SIZE];
2643 int totalReceived = 0;
2644 byte[] buffer = new byte[256];
2645 while (totalReceived < sendbuf.Length) {
2646 int recvd = clientsock.Receive (buffer, 0, buffer.Length, SocketFlags.None);
2647 buffer.CopyTo (recvbuf, totalReceived);
2648 totalReceived += recvd;
2651 Assert.AreEqual (BUFFER_SIZE, totalReceived, "#2");
2653 for (i = 0; i < BUFFER_SIZE; i++) {
2654 Assert.AreEqual (recvbuf[i], sendbuf[i],
2655 "#3/" + i.ToString());
2659 clientsock.Close ();
2660 listensock.Close ();
2664 public void ListenNotBound ()
2666 Socket sock = new Socket (AddressFamily.InterNetwork,
2672 Assert.Fail ("ListenNotBound #1");
2673 } catch (SocketException ex) {
2674 Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
2680 static Socket CWRSocket;
2681 static bool CWRReceiving = true;
2682 static ManualResetEvent CWRReady = new ManualResetEvent (false);
2684 private static void CWRReceiveThread ()
2686 byte[] buf = new byte[256];
2689 CWRSocket.Receive (buf);
2690 } catch (SocketException) {
2691 CWRReceiving = false;
2698 public void CloseWhileReceiving ()
2700 CWRSocket = new Socket (AddressFamily.InterNetwork,
2703 CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
2704 NetworkHelpers.FindFreePort ()));
2706 Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
2708 recv_thread.Start ();
2709 Thread.Sleep (250); /* Wait for the thread to be already receiving */
2712 if (CWRReady.WaitOne (1000, false) == false) {
2713 Assert.Fail ("CloseWhileReceiving wait timed out");
2716 Assert.IsFalse (CWRReceiving);
2719 static bool RRCLastRead = false;
2720 static ManualResetEvent RRCReady = new ManualResetEvent (false);
2722 private static void RRCClientThread (int port)
2724 byte[] bytes = new byte[8];
2727 Socket sock = new Socket (AddressFamily.InterNetwork,
2730 sock.Connect (new IPEndPoint (IPAddress.Loopback,
2733 NetworkStream stream = new NetworkStream (sock);
2735 readbyte = stream.ReadByte ();
2736 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1");
2738 stream.Read (bytes, 0, 0);
2740 readbyte = stream.ReadByte ();
2741 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2");
2743 stream.Read (bytes, 0, 0);
2745 readbyte = stream.ReadByte ();
2746 Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3");
2754 [Test] // Receive (Byte [])
2755 public void Receive1_Buffer_Null ()
2757 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2761 s.Receive ((byte []) null);
2763 } catch (ArgumentNullException ex) {
2764 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2765 Assert.IsNull (ex.InnerException, "#3");
2766 Assert.IsNotNull (ex.Message, "#4");
2767 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2773 [Test] // Receive (Byte [])
2774 public void Receive1_Socket_Closed ()
2776 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2781 s.Receive ((byte []) null);
2783 } catch (ObjectDisposedException ex) {
2784 // Cannot access a disposed object
2785 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2786 Assert.IsNull (ex.InnerException, "#3");
2787 Assert.IsNotNull (ex.Message, "#4");
2788 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2792 [Test] // Receive (Byte [], SocketFlags)
2793 public void Receive2_Buffer_Null ()
2795 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2799 s.Receive ((byte []) null, (SocketFlags) 666);
2801 } catch (ArgumentNullException ex) {
2802 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2803 Assert.IsNull (ex.InnerException, "#3");
2804 Assert.IsNotNull (ex.Message, "#4");
2805 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2811 [Test] // Receive (Byte [], SocketFlags)
2812 public void Receive2_Socket_Closed ()
2814 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2819 s.Receive ((byte []) null, (SocketFlags) 666);
2821 } catch (ObjectDisposedException ex) {
2822 // Cannot access a disposed object
2823 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2824 Assert.IsNull (ex.InnerException, "#3");
2825 Assert.IsNotNull (ex.Message, "#4");
2826 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2830 [Test] // Receive (Byte [], Int32, SocketFlags)
2831 public void Receive3_Buffer_Null ()
2833 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2837 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2839 } catch (ArgumentNullException ex) {
2840 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2841 Assert.IsNull (ex.InnerException, "#3");
2842 Assert.IsNotNull (ex.Message, "#4");
2843 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2849 [Test] // Receive (Byte [], Int32, SocketFlags)
2850 public void Receive3_Socket_Closed ()
2852 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2857 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2859 } catch (ObjectDisposedException ex) {
2860 // Cannot access a disposed object
2861 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2862 Assert.IsNull (ex.InnerException, "#3");
2863 Assert.IsNotNull (ex.Message, "#4");
2864 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2868 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2869 public void Receive4_Buffer_Null ()
2871 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2875 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2877 } catch (ArgumentNullException ex) {
2878 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2879 Assert.IsNull (ex.InnerException, "#3");
2880 Assert.IsNotNull (ex.Message, "#4");
2881 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2887 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2888 public void Receive4_Socket_Closed ()
2890 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2895 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2897 } catch (ObjectDisposedException ex) {
2898 // Cannot access a disposed object
2899 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2900 Assert.IsNull (ex.InnerException, "#3");
2901 Assert.IsNotNull (ex.Message, "#4");
2902 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2906 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2907 public void Receive5_Buffer_Null ()
2909 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2914 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2916 } catch (ArgumentNullException ex) {
2917 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2918 Assert.IsNull (ex.InnerException, "#3");
2919 Assert.IsNotNull (ex.Message, "#4");
2920 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2926 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2927 public void Receive5_Socket_Closed ()
2929 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2935 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2937 } catch (ObjectDisposedException ex) {
2938 // Cannot access a disposed object
2939 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2940 Assert.IsNull (ex.InnerException, "#3");
2941 Assert.IsNotNull (ex.Message, "#4");
2942 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2946 [Test] // Receive (IList<ArraySegment<Byte>>)
2947 public void Receive6_Buffers_Null ()
2949 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2953 s.Receive ((IList<ArraySegment<byte>>) null);
2955 } catch (ArgumentNullException ex) {
2956 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2957 Assert.IsNull (ex.InnerException, "#3");
2958 Assert.IsNotNull (ex.Message, "#4");
2959 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2965 [Test] // Receive (IList<ArraySegment<Byte>>)
2966 public void Receive6_Socket_Closed ()
2968 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2973 s.Receive ((IList<ArraySegment<byte>>) null);
2975 } catch (ObjectDisposedException ex) {
2976 // Cannot access a disposed object
2977 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2978 Assert.IsNull (ex.InnerException, "#3");
2979 Assert.IsNotNull (ex.Message, "#4");
2980 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2984 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2985 public void Receive7_Buffers_Null ()
2987 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2991 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2993 } catch (ArgumentNullException ex) {
2994 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2995 Assert.IsNull (ex.InnerException, "#3");
2996 Assert.IsNotNull (ex.Message, "#4");
2997 Assert.AreEqual ("buffers", ex.ParamName, "#5");
3003 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
3004 public void Receive7_Socket_Closed ()
3006 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3011 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
3013 } catch (ObjectDisposedException ex) {
3014 // Cannot access a disposed object
3015 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3016 Assert.IsNull (ex.InnerException, "#3");
3017 Assert.IsNotNull (ex.Message, "#4");
3018 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3022 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
3023 public void Receive8_Buffers_Null ()
3025 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3030 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
3033 } catch (ArgumentNullException ex) {
3034 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3035 Assert.IsNull (ex.InnerException, "#3");
3036 Assert.IsNotNull (ex.Message, "#4");
3037 Assert.AreEqual ("buffers", ex.ParamName, "#5");
3043 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
3044 public void Receive8_Socket_Closed ()
3046 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3052 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
3055 } catch (ObjectDisposedException ex) {
3056 // Cannot access a disposed object
3057 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3058 Assert.IsNull (ex.InnerException, "#3");
3059 Assert.IsNotNull (ex.Message, "#4");
3060 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3066 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3067 public void ReceiveFrom1_Buffer_Null ()
3069 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3072 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3074 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3076 } catch (ArgumentNullException ex) {
3077 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3078 Assert.IsNull (ex.InnerException, "#3");
3079 Assert.IsNotNull (ex.Message, "#4");
3080 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3086 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3087 public void ReceiveFrom1_RemoteEP_Null ()
3089 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3092 byte [] buffer = new byte [0];
3093 EndPoint remoteEP = null;
3095 s.ReceiveFrom (buffer, ref remoteEP);
3097 } catch (ArgumentNullException ex) {
3098 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3099 Assert.IsNull (ex.InnerException, "#3");
3100 Assert.IsNotNull (ex.Message, "#4");
3101 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3107 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3108 public void ReceiveFrom1_Socket_Closed ()
3110 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3114 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3116 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3118 } catch (ObjectDisposedException ex) {
3119 // Cannot access a disposed object
3120 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3121 Assert.IsNull (ex.InnerException, "#3");
3122 Assert.IsNotNull (ex.Message, "#4");
3123 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3127 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3128 public void ReceiveFrom2_Buffer_Null ()
3130 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3133 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3135 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3137 } catch (ArgumentNullException ex) {
3138 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3139 Assert.IsNull (ex.InnerException, "#3");
3140 Assert.IsNotNull (ex.Message, "#4");
3141 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3147 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3148 public void ReceiveFrom2_RemoteEP_Null ()
3150 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3153 byte [] buffer = new byte [5];
3154 EndPoint remoteEP = null;
3156 s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP);
3158 } catch (ArgumentNullException ex) {
3159 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3160 Assert.IsNull (ex.InnerException, "#3");
3161 Assert.IsNotNull (ex.Message, "#4");
3162 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3168 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3169 public void ReceiveFrom2_Socket_Closed ()
3171 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3175 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3177 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3179 } catch (ObjectDisposedException ex) {
3180 // Cannot access a disposed object
3181 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3182 Assert.IsNull (ex.InnerException, "#3");
3183 Assert.IsNotNull (ex.Message, "#4");
3184 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3188 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3189 public void ReceiveFrom3_Buffer_Null ()
3191 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3194 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3196 s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
3199 } catch (ArgumentNullException ex) {
3200 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3201 Assert.IsNull (ex.InnerException, "#3");
3202 Assert.IsNotNull (ex.Message, "#4");
3203 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3209 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3210 public void ReceiveFrom3_RemoteEP_Null ()
3212 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3215 byte [] buffer = new byte [5];
3216 EndPoint remoteEP = null;
3218 s.ReceiveFrom (buffer, buffer.Length, (SocketFlags) 666, ref remoteEP);
3220 } catch (ArgumentNullException ex) {
3221 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3222 Assert.IsNull (ex.InnerException, "#3");
3223 Assert.IsNotNull (ex.Message, "#4");
3224 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3230 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3231 public void ReceiveFrom3_Size_OutOfRange ()
3234 byte [] buffer = new byte [5];
3235 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3238 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3241 s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP);
3242 Assert.Fail ("#A1");
3243 } catch (ArgumentOutOfRangeException ex) {
3244 // Specified argument was out of the range of valid values
3245 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3246 Assert.IsNull (ex.InnerException, "#A3");
3247 Assert.IsNotNull (ex.Message, "#A4");
3248 Assert.AreEqual ("size", ex.ParamName, "#A5");
3253 // size > buffer length
3254 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3257 s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666,
3259 Assert.Fail ("#B1");
3260 } catch (ArgumentOutOfRangeException ex) {
3261 // Specified argument was out of the range of valid values
3262 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3263 Assert.IsNull (ex.InnerException, "#B3");
3264 Assert.IsNotNull (ex.Message, "#B4");
3265 Assert.AreEqual ("size", ex.ParamName, "#B5");
3271 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3272 public void ReceiveFrom3_Socket_Closed ()
3274 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3278 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3280 s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
3283 } catch (ObjectDisposedException ex) {
3284 // Cannot access a disposed object
3285 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3286 Assert.IsNull (ex.InnerException, "#3");
3287 Assert.IsNotNull (ex.Message, "#4");
3288 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3292 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3293 public void ReceiveFrom4_Buffer_Null ()
3295 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3297 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3300 s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
3303 } catch (ArgumentNullException ex) {
3304 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3305 Assert.IsNull (ex.InnerException, "#3");
3306 Assert.IsNotNull (ex.Message, "#4");
3307 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3311 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3312 public void ReceiveFrom4_Offset_OutOfRange ()
3315 byte [] buffer = new byte [5];
3316 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3319 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3322 s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666,
3324 Assert.Fail ("#A1");
3325 } catch (ArgumentOutOfRangeException ex) {
3326 // Specified argument was out of the range of valid values
3327 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3328 Assert.IsNull (ex.InnerException, "#A3");
3329 Assert.IsNotNull (ex.Message, "#A4");
3330 Assert.AreEqual ("offset", ex.ParamName, "#A5");
3335 // offset > buffer length
3336 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3339 s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666,
3341 Assert.Fail ("#B1");
3342 } catch (ArgumentOutOfRangeException ex) {
3343 // Specified argument was out of the range of valid values
3344 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3345 Assert.IsNull (ex.InnerException, "#B3");
3346 Assert.IsNotNull (ex.Message, "#B4");
3347 Assert.AreEqual ("offset", ex.ParamName, "#B5");
3353 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint)
3354 public void ReceiveFrom4_RemoteEP_Null ()
3356 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3358 byte [] buffer = new byte [5];
3359 EndPoint remoteEP = null;
3362 s.ReceiveFrom (buffer, 0, buffer.Length, (SocketFlags) 666, ref remoteEP);
3364 } catch (ArgumentNullException ex) {
3365 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3366 Assert.IsNull (ex.InnerException, "#3");
3367 Assert.IsNotNull (ex.Message, "#4");
3368 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3374 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3375 public void ReceiveFrom4_Size_OutOfRange ()
3378 byte [] buffer = new byte [5];
3379 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3382 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3385 s.ReceiveFrom (buffer, 0, -1, (SocketFlags) 666,
3387 Assert.Fail ("#A1");
3388 } catch (ArgumentOutOfRangeException ex) {
3389 // Specified argument was out of the range of valid values
3390 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3391 Assert.IsNull (ex.InnerException, "#A3");
3392 Assert.IsNotNull (ex.Message, "#A4");
3393 Assert.AreEqual ("size", ex.ParamName, "#A5");
3398 // size > buffer length
3399 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3402 s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (SocketFlags) 666,
3404 Assert.Fail ("#B1");
3405 } catch (ArgumentOutOfRangeException ex) {
3406 // Specified argument was out of the range of valid values
3407 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3408 Assert.IsNull (ex.InnerException, "#B3");
3409 Assert.IsNotNull (ex.Message, "#B4");
3410 Assert.AreEqual ("size", ex.ParamName, "#B5");
3415 // offset + size > buffer length
3416 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3419 s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP);
3420 Assert.Fail ("#C1");
3421 } catch (ArgumentOutOfRangeException ex) {
3422 // Specified argument was out of the range of valid values
3423 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
3424 Assert.IsNull (ex.InnerException, "#C3");
3425 Assert.IsNotNull (ex.Message, "#C4");
3426 Assert.AreEqual ("size", ex.ParamName, "#C5");
3432 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
3433 public void ReceiveFrom4_Socket_Closed ()
3435 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3439 byte [] buffer = new byte [5];
3440 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3442 s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
3445 } catch (ObjectDisposedException ex) {
3446 // Cannot access a disposed object
3447 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3448 Assert.IsNull (ex.InnerException, "#3");
3449 Assert.IsNotNull (ex.Message, "#4");
3450 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3455 public void ReceiveRemoteClosed ()
3457 var port = NetworkHelpers.FindFreePort ();
3458 Socket sock = new Socket (AddressFamily.InterNetwork,
3461 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
3465 Thread client_thread = new Thread (() => RRCClientThread (port));
3466 client_thread.Start ();
3468 Socket client = sock.Accept ();
3469 NetworkStream stream = new NetworkStream (client);
3470 stream.WriteByte (0x00);
3471 stream.WriteByte (0x00);
3475 RRCReady.WaitOne (1000, false);
3476 Assert.IsTrue (RRCLastRead);
3480 // Test case for bug #471580
3482 public void UdpDoubleBind ()
3484 using (Socket s = new Socket (AddressFamily.InterNetwork,
3485 SocketType.Dgram, ProtocolType.Udp))
3486 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3487 SocketType.Dgram, ProtocolType.Udp)) {
3488 var supportsReuseAddress = true;
3490 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3491 } catch (SocketException e) {
3492 // Exception is thrown when ReuseAddress is not supported
3493 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3494 "Expected SocketError.OperationNotSupported");
3495 supportsReuseAddress = false;
3498 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3501 if (supportsReuseAddress)
3502 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3505 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3506 if (!supportsReuseAddress)
3507 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3508 } catch (SocketException e) {
3513 // Test case for bug #31557
3515 public void TcpDoubleBind ()
3517 using (Socket s = new Socket (AddressFamily.InterNetwork,
3518 SocketType.Stream, ProtocolType.Tcp))
3519 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3520 SocketType.Stream, ProtocolType.Tcp)) {
3521 var supportsReuseAddress = true;
3523 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3524 } catch (SocketException e) {
3525 // Exception is thrown when ReuseAddress is not supported
3526 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3527 "Expected SocketError.OperationNotSupported");
3528 supportsReuseAddress = false;
3531 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3535 if (supportsReuseAddress)
3536 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3539 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3541 if (!supportsReuseAddress)
3542 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3543 } catch (SocketException e) {
3549 [Category ("NotOnMac")]
3550 public void ConnectedProperty ()
3552 TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3555 Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3556 client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
3557 Socket server = listener.AcceptSocket ();
3560 server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null));
3563 server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null));
3566 Assert.IsTrue (!client.Connected);
3567 Assert.IsTrue (!server.Connected);
3575 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
3576 public void GetSocketOption1_Socket_Closed ()
3578 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3581 s.GetSocketOption (0, 0);
3583 } catch (ObjectDisposedException ex) {
3584 // Cannot access a disposed object
3585 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3586 Assert.IsNull (ex.InnerException, "#3");
3587 Assert.IsNotNull (ex.Message, "#4");
3588 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3592 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3593 public void GetSocketOption2_OptionValue_Null ()
3595 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3597 s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3600 } catch (SocketException ex) {
3601 // The system detected an invalid pointer address in attempting
3602 // to use a pointer argument in a call
3603 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3604 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3605 Assert.IsNull (ex.InnerException, "#4");
3606 Assert.IsNotNull (ex.Message, "#5");
3607 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3608 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3612 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3613 public void GetSocketOption2_Socket_Closed ()
3615 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3618 s.GetSocketOption (0, 0, (byte []) null);
3620 } catch (ObjectDisposedException ex) {
3621 // Cannot access a disposed object
3622 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3623 Assert.IsNull (ex.InnerException, "#3");
3624 Assert.IsNotNull (ex.Message, "#4");
3625 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3629 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3630 public void GetSocketOption3_Socket_Closed ()
3632 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3635 s.GetSocketOption (0, 0, 0);
3637 } catch (ObjectDisposedException ex) {
3638 // Cannot access a disposed object
3639 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3640 Assert.IsNull (ex.InnerException, "#3");
3641 Assert.IsNotNull (ex.Message, "#4");
3642 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3646 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3647 public void SetSocketOption1_DontLinger ()
3649 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3650 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3651 new byte [] { 0x00 });
3652 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3653 new byte [] { 0x01 });
3657 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3658 public void SetSocketOption1_DontLinger_Null ()
3660 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3662 s.SetSocketOption (SocketOptionLevel.Socket,
3663 SocketOptionName.DontLinger, (byte []) null);
3665 } catch (SocketException ex) {
3666 // The system detected an invalid pointer address in attempting
3667 // to use a pointer argument in a call
3668 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3669 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3670 Assert.IsNull (ex.InnerException, "#4");
3671 Assert.IsNotNull (ex.Message, "#5");
3672 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3673 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3678 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3679 public void SetSocketOption1_Linger_Null ()
3681 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3683 s.SetSocketOption (SocketOptionLevel.Socket,
3684 SocketOptionName.DontLinger, (byte []) null);
3686 } catch (SocketException ex) {
3687 // The system detected an invalid pointer address in attempting
3688 // to use a pointer argument in a call
3689 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3690 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3691 Assert.IsNull (ex.InnerException, "#4");
3692 Assert.IsNotNull (ex.Message, "#5");
3693 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3694 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3699 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3700 public void SetSocketOption1_Socket_Close ()
3702 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3705 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3706 new byte [] { 0x00 });
3708 } catch (ObjectDisposedException ex) {
3709 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3710 Assert.IsNull (ex.InnerException, "#3");
3711 Assert.IsNotNull (ex.Message, "#4");
3712 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3716 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3717 public void SetSocketOption2_DontLinger ()
3719 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3720 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3721 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
3725 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3726 [Category ("NotWorking")]
3727 public void SetSocketOption2_Linger ()
3729 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3730 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
3731 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
3735 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3736 public void SetSocketOption2_Socket_Closed ()
3738 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3741 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3743 } catch (ObjectDisposedException ex) {
3744 // Cannot access a disposed object
3745 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3746 Assert.IsNull (ex.InnerException, "#3");
3747 Assert.IsNotNull (ex.Message, "#4");
3748 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3752 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3753 public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
3755 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3757 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3758 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3760 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3761 new IPv6MulticastOption (mcast_addr));
3763 } catch (ArgumentException ex) {
3764 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3765 Assert.IsNull (ex.InnerException, "#3");
3766 Assert.IsNotNull (ex.Message, "#4");
3767 // The specified value is not a valid 'MulticastOption'
3768 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3769 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3774 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3775 public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
3777 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3779 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3780 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3781 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3782 new MulticastOption (mcast_addr));
3786 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3787 [Category ("NotWorking")]
3788 public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
3790 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3792 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3794 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3795 new MulticastOption (mcast_addr));
3797 } catch (SocketException ex) {
3798 // An invalid argument was supplied
3799 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3800 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3801 Assert.IsNull (ex.InnerException, "#4");
3802 Assert.IsNotNull (ex.Message, "#5");
3803 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3804 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3810 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3811 public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
3813 if (!Socket.OSSupportsIPv6)
3814 Assert.Ignore ("IPv6 not enabled.");
3816 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3818 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3819 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3820 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3821 new IPv6MulticastOption (mcast_addr));
3825 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3826 public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
3828 if (!Socket.OSSupportsIPv6)
3829 Assert.Ignore ("IPv6 not enabled.");
3831 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3833 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3834 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3836 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3837 new MulticastOption (mcast_addr));
3839 } catch (ArgumentException ex) {
3840 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3841 Assert.IsNull (ex.InnerException, "#3");
3842 Assert.IsNotNull (ex.Message, "#4");
3843 // The specified value is not a valid 'IPv6MulticastOption'
3844 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
3845 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3850 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3851 [Category ("NotWorking")]
3852 public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
3854 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3856 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
3858 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3859 new IPv6MulticastOption (mcast_addr));
3861 } catch (SocketException ex) {
3862 // An invalid argument was supplied
3863 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3864 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3865 Assert.IsNull (ex.InnerException, "#4");
3866 Assert.IsNotNull (ex.Message, "#5");
3867 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3868 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3874 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3875 public void SetSocketOption3_DontLinger_Boolean ()
3877 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3879 s.SetSocketOption (SocketOptionLevel.Socket,
3880 SocketOptionName.DontLinger, (object) false);
3882 } catch (ArgumentException ex) {
3883 // The specified value is not valid
3884 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3885 Assert.IsNull (ex.InnerException, "#3");
3886 Assert.IsNotNull (ex.Message, "#4");
3887 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3892 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3893 public void SetSocketOption3_DontLinger_Int32 ()
3895 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3897 s.SetSocketOption (SocketOptionLevel.Socket,
3898 SocketOptionName.DontLinger, (object) 0);
3900 } catch (ArgumentException ex) {
3901 // The specified value is not valid
3902 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3903 Assert.IsNull (ex.InnerException, "#3");
3904 Assert.IsNotNull (ex.Message, "#4");
3905 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3910 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3911 public void SetSocketOption3_DontLinger_LingerOption ()
3913 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3915 s.SetSocketOption (SocketOptionLevel.Socket,
3916 SocketOptionName.DontLinger, new LingerOption (true, 1000));
3918 } catch (ArgumentException ex) {
3919 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3920 Assert.IsNull (ex.InnerException, "#3");
3921 // The specified value is not valid
3922 Assert.IsNotNull (ex.Message, "#4");
3923 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3928 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3929 public void SetSocketOption3_Linger_Boolean ()
3931 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3933 s.SetSocketOption (SocketOptionLevel.Socket,
3934 SocketOptionName.Linger, (object) false);
3936 } catch (ArgumentException ex) {
3937 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3938 Assert.IsNull (ex.InnerException, "#3");
3939 // The specified value is not valid
3940 Assert.IsNotNull (ex.Message, "#4");
3941 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3946 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3947 public void SetSocketOption3_Linger_Int32 ()
3949 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3951 s.SetSocketOption (SocketOptionLevel.Socket,
3952 SocketOptionName.Linger, (object) 0);
3954 } catch (ArgumentException ex) {
3955 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3956 Assert.IsNull (ex.InnerException, "#3");
3957 // The specified value is not valid
3958 Assert.IsNotNull (ex.Message, "#4");
3959 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3964 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3965 public void SetSocketOption3_Linger_LingerOption ()
3967 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3968 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3969 new LingerOption (false, 0));
3970 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3971 new LingerOption (true, 0));
3972 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3973 new LingerOption (false, 1000));
3974 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3975 new LingerOption (true, 1000));
3979 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3980 public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
3982 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3984 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3985 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3986 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3987 new MulticastOption (mcast_addr));
3989 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3990 new IPv6MulticastOption (mcast_addr));
3992 } catch (ArgumentException ex) {
3993 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3994 Assert.IsNull (ex.InnerException, "#3");
3995 Assert.IsNotNull (ex.Message, "#4");
3996 // The specified value is not a valid 'MulticastOption'
3997 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3998 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4003 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4004 public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
4006 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
4008 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4009 MulticastOption option = new MulticastOption (mcast_addr);
4011 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
4012 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
4014 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
4019 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4020 [Category ("NotWorking")]
4021 public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
4023 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
4025 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
4027 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
4028 new MulticastOption (mcast_addr));
4030 } catch (SocketException ex) {
4031 // An invalid argument was supplied
4032 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4033 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4034 Assert.IsNull (ex.InnerException, "#4");
4035 Assert.IsNotNull (ex.Message, "#5");
4036 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4037 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4043 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4044 public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
4046 if (!Socket.OSSupportsIPv6)
4047 Assert.Ignore ("IPv6 not enabled.");
4049 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4050 IPv6MulticastOption option = new IPv6MulticastOption (
4051 IPAddress.Parse ("ff02::1"));
4053 s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
4054 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4056 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4061 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4062 public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
4064 if (!Socket.OSSupportsIPv6)
4065 Assert.Ignore ("IPv6 not enabled.");
4067 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4069 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4070 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
4071 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4072 new IPv6MulticastOption (mcast_addr));
4074 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4075 new MulticastOption (mcast_addr));
4077 } catch (ArgumentException ex) {
4078 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
4079 Assert.IsNull (ex.InnerException, "#3");
4080 Assert.IsNotNull (ex.Message, "#4");
4081 // The specified value is not a valid 'IPv6MulticastOption'
4082 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
4083 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4088 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4089 [Category ("NotWorking")]
4090 public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
4092 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4094 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
4096 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4097 new IPv6MulticastOption (mcast_addr));
4099 } catch (SocketException ex) {
4100 // An invalid argument was supplied
4101 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4102 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4103 Assert.IsNull (ex.InnerException, "#4");
4104 Assert.IsNotNull (ex.Message, "#5");
4105 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4106 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4112 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4113 public void SetSocketOption3_OptionValue_Null ()
4115 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4117 s.SetSocketOption (SocketOptionLevel.Socket,
4118 SocketOptionName.Linger, (object) null);
4120 } catch (ArgumentNullException ex) {
4121 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
4122 Assert.IsNull (ex.InnerException, "#3");
4123 Assert.IsNotNull (ex.Message, "#4");
4124 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
4129 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4130 public void SetSocketOption3_Socket_Closed ()
4132 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4135 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
4136 new LingerOption (false, 0));
4138 } catch (ObjectDisposedException ex) {
4139 // Cannot access a disposed object
4140 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
4141 Assert.IsNull (ex.InnerException, "#3");
4142 Assert.IsNotNull (ex.Message, "#4");
4143 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
4148 public void SetSocketOption_MulticastInterfaceIndex_Any ()
4150 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4152 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4154 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4155 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4160 public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
4162 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4164 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4166 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4167 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4172 public void SetSocketOption_MulticastInterfaceIndex_Invalid ()
4174 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4176 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4180 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4187 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4196 public void Shutdown_NoConnect ()
4198 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4199 s.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
4202 s.Shutdown (SocketShutdown.Both);
4204 } catch (SocketException exc) {
4205 Assert.AreEqual (10057, exc.ErrorCode, "#2");
4212 [ExpectedException (typeof (NullReferenceException))]
4213 public void ReceiveAsync_Null ()
4215 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4216 s.ReceiveAsync (null);
4221 [ExpectedException (typeof (NullReferenceException))]
4222 public void ReceiveAsync_Default ()
4224 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4225 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4226 s.ReceiveAsync (saea);
4232 [ExpectedException (typeof (NullReferenceException))]
4233 public void ReceiveAsync_NullBuffer ()
4235 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4236 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4237 saea.SetBuffer (null, 0, 0);
4238 s.ReceiveAsync (null);
4243 [ExpectedException (typeof (ObjectDisposedException))]
4244 public void ReceiveAsync_ClosedSocket ()
4246 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4248 s.ReceiveAsync (null);
4252 [ExpectedException (typeof (NullReferenceException))]
4253 public void SendAsync_Null ()
4255 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4261 [ExpectedException (typeof (NullReferenceException))]
4262 public void SendAsync_Default ()
4264 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4265 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4272 [ExpectedException (typeof (NullReferenceException))]
4273 public void SendAsync_NullBuffer ()
4275 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4276 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4277 saea.SetBuffer (null, 0, 0);
4283 [ExpectedException (typeof (ObjectDisposedException))]
4284 public void SendAsync_ClosedSocket ()
4286 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4292 public void SendAsyncFile ()
4294 Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4296 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
4297 serverSocket.Listen (1);
4299 var mReceived = new ManualResetEvent (false);
4301 serverSocket.BeginAccept (AsyncCall => {
4302 byte[] bytes = new byte [1024];
4304 Socket listener = (Socket)AsyncCall.AsyncState;
4305 Socket client = listener.EndAccept (AsyncCall);
4306 client.Receive (bytes, bytes.Length, 0);
4311 Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4312 clientSocket.Connect (serverSocket.LocalEndPoint);
4313 clientSocket.NoDelay = true;
4315 // Initialize buffer used to create testing file
4316 var buffer = new byte [1024];
4317 for (int i = 0; i < 1024; ++i)
4318 buffer [i] = (byte) (i % 256);
4320 string temp = Path.GetTempFileName ();
4322 // Testing file creation
4323 using (StreamWriter sw = new StreamWriter (temp)) {
4327 var mSent = new ManualResetEvent (false);
4329 // Async Send File to server
4330 clientSocket.BeginSendFile(temp, (ar) => {
4331 Socket client = (Socket) ar.AsyncState;
4332 client.EndSendFile (ar);
4336 if (!mSent.WaitOne (1500))
4337 throw new TimeoutException ();
4338 if (!mReceived.WaitOne (1500))
4339 throw new TimeoutException ();
4341 if (File.Exists (temp))
4344 clientSocket.Close ();
4345 serverSocket.Close ();
4350 public void ConnectToIPV4EndPointUsingDualModelSocket () {
4352 * IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
4353 * anyways in this test to make it more interoparable with .NET where
4354 * IPv6 and DualMode needs to be specified.
4356 using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)) {
4358 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4360 server.DualMode = true;
4363 * Nothing to Accept the connect - we need a backlog to make sure we don't get
4368 var ep = server.LocalEndPoint as IPEndPoint;
4369 var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4370 client.DualMode = true;
4371 client.Connect (ep);
4372 client.Disconnect (false);
4375 client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4376 client.DualMode = true;
4377 client.Connect (IPAddress.Loopback, ep.Port);
4378 client.Disconnect (false);
4381 client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4382 client.DualMode = true;
4383 client.Connect (new [] { IPAddress.Loopback }, ep.Port);
4384 client.Disconnect (false);
4390 public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
4392 * IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
4393 * anyways in this test to make it more interoparable with .NET where
4394 * IPv6 and DualMode needs to be specified.
4396 using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp))
4398 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4400 server.DualMode = true;
4404 var ep = server.LocalEndPoint as IPEndPoint;
4406 BCCalledBack.Reset ();
4407 var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4408 client.DualMode = true;
4409 var ar1 = client.BeginConnect (ep, BCCallback, client);
4410 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
4411 client.Disconnect (false);
4414 BCCalledBack.Reset ();
4415 client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4416 client.DualMode = true;
4417 var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
4418 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4419 client.Disconnect (false);
4422 BCCalledBack.Reset ();
4423 client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
4424 client.DualMode = true;
4425 var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
4426 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4427 client.Disconnect (false);
4433 public void UdpMulticasTimeToLive ()
4435 /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
4437 using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4438 IPEndPoint end_point = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
4439 socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
4440 socket.Bind (end_point);
4441 socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);
4445 [Test] // Covers 41616
4446 public void ConnectAsyncUnhandledEx ()
4448 var mre = new ManualResetEvent (false);
4450 var endPoint = new IPEndPoint(0,0);
4451 var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Unspecified);
4453 var socketArgs = new SocketAsyncEventArgs();
4454 socketArgs.RemoteEndPoint = endPoint;
4455 socketArgs.Completed += (sender, e) => mre.Set ();
4457 socket.ConnectAsync (socketArgs);
4459 Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");