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;
19 using System.Net.Sockets;
20 using NUnit.Framework;
23 using System.Collections.Generic;
25 using MonoTests.Helpers;
27 namespace MonoTests.System.Net.Sockets
30 public class SocketTest
32 // note: also used in SocketCas tests
33 public const string BogusAddress = "192.168.244.244";
34 public const int BogusPort = 23483;
37 public void ConnectIPAddressAny ()
39 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
41 /* UDP sockets use Any to disconnect
43 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
48 } catch (SocketException ex) {
49 Assert.AreEqual (10049, ex.ErrorCode, "#2");
54 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
59 } catch (SocketException ex) {
60 Assert.AreEqual (10049, ex.ErrorCode, "#4");
65 [Ignore ("Bug #75158")] // Looks like MS fails after the .ctor, when you try to use the socket
66 public void IncompatibleAddress ()
68 IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any,
69 NetworkHelpers.FindFreePort ());
72 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) {
77 } catch (SocketException ex) {
78 // address incompatible with protocol
79 int expectedError = 10047;
80 Assert.AreEqual (expectedError, ex.ErrorCode,
86 [Category ("InetAccess")]
87 public void BogusEndConnect ()
89 IPAddress ipOne = IPAddress.Parse (BogusAddress);
90 IPEndPoint ipEP = new IPEndPoint (ipOne, BogusPort);
91 Socket sock = new Socket (ipEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
92 IAsyncResult ar = sock.BeginConnect (ipEP, null, null);
95 // should raise an exception because connect was bogus
98 } catch (SocketException ex) {
99 // Actual error code depends on network configuration.
100 var error = (SocketError) ex.ErrorCode;
101 Assert.That (error == SocketError.TimedOut ||
102 error == SocketError.ConnectionRefused ||
103 error == SocketError.NetworkUnreachable ||
104 error == SocketError.HostUnreachable, "#2");
109 [ExpectedException (typeof (ArgumentNullException))]
110 public void SelectEmpty ()
112 ArrayList list = new ArrayList ();
113 Socket.Select (list, list, list, 1000);
116 private bool BlockingConnect (bool block, int port)
118 IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, port);
119 Socket server = new Socket(AddressFamily.InterNetwork,
123 server.Blocking=block;
127 Socket conn = new Socket (AddressFamily.InterNetwork,
132 Socket client = null;
133 var sw = Stopwatch.StartNew ();
134 while (sw.ElapsedMilliseconds < 100)
137 client = server.Accept();
140 catch (SocketException ex) {
141 if (ex.SocketErrorCode == SocketError.WouldBlock)
146 Assert.IsNotNull (client, "Couldn't accept a client connection within 100ms.");
147 bool client_block = client.Blocking;
153 return(client_block);
157 public void AcceptBlockingStatus()
160 var port = NetworkHelpers.FindFreePort ();
162 block = BlockingConnect(true, port);
163 Assert.AreEqual (block, true, "BlockingStatus01");
165 block = BlockingConnect(false, port);
166 Assert.AreEqual (block, false, "BlockingStatus02");
169 static bool CFAConnected = false;
170 static ManualResetEvent CFACalledBack;
172 private static void CFACallback (IAsyncResult asyncResult)
174 Socket sock = (Socket)asyncResult.AsyncState;
175 CFAConnected = sock.Connected;
177 if (sock.Connected) {
178 sock.EndConnect (asyncResult);
181 CFACalledBack.Set ();
184 [Test] // Connect (IPEndPoint)
185 public void Connect1_RemoteEP_Null ()
187 Socket s = new Socket (AddressFamily.InterNetwork,
188 SocketType.Stream, ProtocolType.Tcp);
190 s.Connect ((IPEndPoint) null);
192 } catch (ArgumentNullException ex) {
193 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
194 Assert.IsNull (ex.InnerException, "#3");
195 Assert.IsNotNull (ex.Message, "#4");
196 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
201 public void ConnectFailAsync ()
203 Socket sock = new Socket (AddressFamily.InterNetwork,
206 sock.Blocking = false;
207 CFACalledBack = new ManualResetEvent (false);
208 CFACalledBack.Reset ();
210 /* Need a port that is not being used for
213 sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
214 NetworkHelpers.FindFreePort ()),
215 new AsyncCallback (CFACallback),
217 CFACalledBack.WaitOne ();
219 Assert.AreEqual (CFAConnected, false, "ConnectFail");
223 public void SetSocketOptionBoolean ()
225 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
226 Socket sock = new Socket (ep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
228 sock.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
234 public void TestSelect1 ()
236 Socket srv = CreateServer (NetworkHelpers.FindFreePort ());
237 ClientSocket clnt = new ClientSocket (srv.LocalEndPoint);
238 Thread th = new Thread (new ThreadStart (clnt.ConnectSleepClose));
244 ArrayList list = new ArrayList ();
245 ArrayList empty = new ArrayList ();
247 Socket.Select (list, empty, empty, 100);
248 Assert.AreEqual (0, empty.Count, "#01");
249 Assert.AreEqual (1, list.Count, "#02");
250 Socket.Select (empty, list, empty, 100);
251 Assert.AreEqual (0, empty.Count, "#03");
252 Assert.AreEqual (1, list.Count, "#04");
253 Socket.Select (list, empty, empty, -1);
254 Assert.AreEqual (0, empty.Count, "#05");
255 Assert.AreEqual (1, list.Count, "#06");
256 // Need to read the 10 bytes from the client to avoid a RST
257 byte [] bytes = new byte [10];
266 static Socket CreateServer (int port)
268 Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
269 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
278 public ClientSocket (EndPoint ep)
281 sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
284 public void ConnectSleepClose ()
293 byte [] b = new byte [10];
298 byte[] buf = new byte[100];
301 [ExpectedException (typeof (ObjectDisposedException))]
302 public void Disposed2 ()
304 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
311 [ExpectedException (typeof (ObjectDisposedException))]
312 public void Disposed6 ()
314 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
321 [ExpectedException (typeof (ObjectDisposedException))]
322 public void Disposed7 ()
324 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
331 [ExpectedException (typeof (ObjectDisposedException))]
332 public void Disposed15 ()
334 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
341 [ExpectedException (typeof (ObjectDisposedException))]
342 public void Disposed16 ()
344 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
351 [ExpectedException (typeof (ObjectDisposedException))]
352 public void Disposed17 ()
354 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
361 [ExpectedException (typeof (ObjectDisposedException))]
362 public void Disposed18 ()
364 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
367 s.Send (buf, 0, 10, 0);
371 [ExpectedException (typeof (ObjectDisposedException))]
372 public void Disposed19 ()
374 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
375 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
378 s.SendTo (buf, 0, ep);
382 [ExpectedException (typeof (ObjectDisposedException))]
383 public void Disposed20 ()
385 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
386 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
389 s.SendTo (buf, 10, 0, ep);
393 [ExpectedException (typeof (ObjectDisposedException))]
394 public void Disposed21 ()
396 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
397 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
400 s.SendTo (buf, 0, 10, 0, ep);
404 [ExpectedException (typeof (ObjectDisposedException))]
405 public void Disposed22 ()
407 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
408 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
415 [ExpectedException (typeof (ObjectDisposedException))]
416 public void Disposed23 ()
418 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
425 public void GetHashCodeTest ()
427 Socket server = new Socket (AddressFamily.InterNetwork,
428 SocketType.Stream, ProtocolType.Tcp);
429 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
430 NetworkHelpers.FindFreePort ());
434 Socket client = new Socket (AddressFamily.InterNetwork,
435 SocketType.Stream, ProtocolType.Tcp);
436 int hashcodeA = client.GetHashCode ();
438 int hashcodeB = client.GetHashCode ();
439 Assert.AreEqual (hashcodeA, hashcodeB, "#1");
441 int hashcodeC = client.GetHashCode ();
442 Assert.AreEqual (hashcodeB, hashcodeC, "#2");
446 static ManualResetEvent SocketError_event = new ManualResetEvent (false);
448 private static void SocketError_callback (IAsyncResult ar)
450 Socket sock = (Socket)ar.AsyncState;
453 sock.EndConnect (ar);
456 SocketError_event.Set ();
460 public void SocketErrorTest ()
462 Socket sock = new Socket (AddressFamily.InterNetwork,
465 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
468 SocketError_event.Reset ();
470 sock.Blocking = false;
471 sock.BeginConnect (ep, new AsyncCallback(SocketError_callback),
474 if (SocketError_event.WaitOne (2000, false) == false) {
475 Assert.Fail ("SocketError wait timed out");
478 Assert.AreEqual (false, sock.Connected, "SocketError #1");
482 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
483 Assert.AreEqual (10061, error, "SocketError #2");
485 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
486 Assert.AreEqual (10061, error, "SocketError #3");
493 public void SocketInformationCtor ()
498 public void DontFragmentDefaultTcp ()
500 Socket sock = new Socket (AddressFamily.InterNetwork,
504 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultTcp");
510 [Category ("NotWorking")] // DontFragment doesn't work
511 public void DontFragmentChangeTcp ()
513 Socket sock = new Socket (AddressFamily.InterNetwork,
517 sock.DontFragment = true;
519 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeTcp");
525 public void DontFragmentDefaultUdp ()
527 Socket sock = new Socket (AddressFamily.InterNetwork,
531 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultUdp");
537 [Category ("NotWorking")] // DontFragment doesn't work
538 public void DontFragmentChangeUdp ()
540 Socket sock = new Socket (AddressFamily.InterNetwork,
544 sock.DontFragment = true;
546 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeUdp");
552 [ExpectedException (typeof(ObjectDisposedException))]
553 public void DontFragmentClosed ()
555 Socket sock = new Socket (AddressFamily.InterNetwork,
561 bool val = sock.DontFragment;
565 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
566 public void DontFragment ()
568 Socket sock = new Socket (AddressFamily.NetBios,
569 SocketType.Seqpacket,
570 ProtocolType.Unspecified);
573 sock.DontFragment = true;
574 Assert.Fail ("DontFragment #1");
575 } catch (NotSupportedException) {
582 public void EnableBroadcastDefaultTcp ()
584 Socket sock = new Socket (AddressFamily.InterNetwork,
589 bool value = sock.EnableBroadcast;
590 Assert.Fail ("EnableBroadcastDefaultTcp #1");
591 } catch (SocketException ex) {
592 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
599 public void EnableBroadcastDefaultUdp ()
601 Socket sock = new Socket (AddressFamily.InterNetwork,
605 Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp");
611 public void EnableBroadcastChangeTcp ()
613 Socket sock = new Socket (AddressFamily.InterNetwork,
618 sock.EnableBroadcast = true;
619 Assert.Fail ("EnableBroadcastChangeTcp #1");
620 } catch (SocketException ex) {
621 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
628 public void EnableBroadcastChangeUdp ()
630 Socket sock = new Socket (AddressFamily.InterNetwork,
634 sock.EnableBroadcast = true;
636 Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp");
642 [ExpectedException (typeof(ObjectDisposedException))]
643 public void EnableBroadcastClosed ()
645 Socket sock = new Socket (AddressFamily.InterNetwork,
651 bool val = sock.EnableBroadcast;
654 /* Can't test the default for ExclusiveAddressUse as
655 * it's different on different versions and service
659 [Category ("NotWorking")] // Not supported on Linux
660 public void ExclusiveAddressUseUnbound ()
662 Socket sock = new Socket (AddressFamily.InterNetwork,
666 sock.ExclusiveAddressUse = true;
668 Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound");
674 [ExpectedException (typeof(InvalidOperationException))]
675 [Category ("NotWorking")] // Not supported on Linux
676 public void ExclusiveAddressUseBound ()
678 Socket sock = new Socket (AddressFamily.InterNetwork,
682 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
683 sock.ExclusiveAddressUse = true;
688 [ExpectedException (typeof(ObjectDisposedException))]
689 public void ExclusiveAddressUseClosed ()
691 Socket sock = new Socket (AddressFamily.InterNetwork,
697 bool val = sock.ExclusiveAddressUse;
701 public void IsBoundTcp ()
703 Socket sock = new Socket (AddressFamily.InterNetwork,
706 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
709 Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1");
712 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2");
716 Socket sock2 = new Socket (AddressFamily.InterNetwork,
720 Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3");
723 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4");
726 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5");
729 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6");
733 public void IsBoundUdp ()
735 Socket sock = new Socket (AddressFamily.InterNetwork,
738 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
741 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1");
744 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2");
747 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3");
750 sock = new Socket (AddressFamily.InterNetwork,
754 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4");
757 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5");
760 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6");
764 /* Should not throw an exception */
765 public void IsBoundClosed ()
767 Socket sock = new Socket (AddressFamily.InterNetwork,
773 bool val = sock.IsBound;
776 /* Nothing much to test for LingerState */
779 public void MulticastLoopbackDefaultTcp ()
781 Socket sock = new Socket (AddressFamily.InterNetwork,
786 bool value = sock.MulticastLoopback;
787 Assert.Fail ("MulticastLoopbackDefaultTcp #1");
788 } catch (SocketException ex) {
789 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
796 public void MulticastLoopbackChangeTcp ()
798 Socket sock = new Socket (AddressFamily.InterNetwork,
803 sock.MulticastLoopback = false;
804 Assert.Fail ("MulticastLoopbackChangeTcp #1");
805 } catch (SocketException ex) {
806 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
813 public void MulticastLoopbackDefaultUdp ()
815 Socket sock = new Socket (AddressFamily.InterNetwork,
819 Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp");
825 public void MulticastLoopbackChangeUdp ()
827 Socket sock = new Socket (AddressFamily.InterNetwork,
831 sock.MulticastLoopback = false;
833 Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp");
839 [ExpectedException (typeof(ObjectDisposedException))]
840 public void MulticastLoopbackClosed ()
842 Socket sock = new Socket (AddressFamily.InterNetwork,
848 bool val = sock.MulticastLoopback;
851 /* OSSupportsIPv6 depends on the environment */
854 [Category("NotWorking")] // We have different defaults for perf reasons
855 public void ReceiveBufferSizeDefault ()
857 Socket sock = new Socket (AddressFamily.InterNetwork,
861 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault");
867 [Category("NotWorking")] // We have different defaults for perf reasons
868 public void ReceiveBufferSizeDefaultUdp ()
870 Socket sock = new Socket (AddressFamily.InterNetwork,
874 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp");
880 public void ReceiveBufferSizeChange ()
882 Socket sock = new Socket (AddressFamily.InterNetwork,
886 sock.ReceiveBufferSize = 16384;
888 Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange");
894 [Category("NotWorking")] // We cannot totally remove buffers (minimum is set to 256
895 public void BuffersCheck_None ()
897 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
898 int original = s.ReceiveBufferSize;
899 s.ReceiveBufferSize = 0;
900 Assert.AreEqual (0, s.ReceiveBufferSize, "ReceiveBufferSize " + original.ToString ());
902 original = s.SendBufferSize;
903 s.SendBufferSize = 0;
904 Assert.AreEqual (0, s.SendBufferSize, "SendBufferSize " + original.ToString ());
909 [ExpectedException (typeof(ObjectDisposedException))]
910 public void ReceiveBufferSizeClosed ()
912 Socket sock = new Socket (AddressFamily.InterNetwork,
918 int val = sock.ReceiveBufferSize;
922 [Category("NotWorking")] // We have different defaults for perf reasons
923 public void SendBufferSizeDefault ()
925 Socket sock = new Socket (AddressFamily.InterNetwork,
929 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault");
935 [Category("NotWorking")] // We have different defaults for perf reasons
936 public void SendBufferSizeDefaultUdp ()
938 Socket sock = new Socket (AddressFamily.InterNetwork,
942 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp");
948 public void SendBufferSizeChange ()
950 Socket sock = new Socket (AddressFamily.InterNetwork,
954 sock.SendBufferSize = 16384;
956 Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange");
962 [ExpectedException (typeof(ObjectDisposedException))]
963 public void SendBufferSizeClosed ()
965 Socket sock = new Socket (AddressFamily.InterNetwork,
971 int val = sock.SendBufferSize;
974 /* No test for TTL default as it's platform dependent */
976 public void TtlChange ()
978 Socket sock = new Socket (AddressFamily.InterNetwork,
984 Assert.AreEqual (255, sock.Ttl, "TtlChange");
990 public void TtlChangeOverflow ()
992 Socket sock = new Socket (AddressFamily.InterNetwork,
998 Assert.Fail ("TtlChangeOverflow #1");
999 } catch (ArgumentOutOfRangeException ex) {
1000 Assert.AreEqual ("value", ex.ParamName,
1001 "TtlChangeOverflow #2");
1007 /* Apparently you can set TTL=0 on the ms runtime!!
1010 Assert.Fail ("TtlChangeOverflow #4");
1011 } catch (SocketException ex) {
1012 Assert.AreEqual (10022, ex.ErrorCode,
1013 "TtlChangeOverflow #5");
1020 [ExpectedException (typeof(ObjectDisposedException))]
1021 public void TtlClosed ()
1023 Socket sock = new Socket (AddressFamily.InterNetwork,
1033 public void UseOnlyOverlappedIODefault ()
1035 Socket sock = new Socket (AddressFamily.InterNetwork,
1039 Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault");
1045 // We need this because the Linux kernel in certain configurations
1046 // will end up rounding up the values passed on to the kernel
1047 // for socket send/receive timeouts.
1049 int Approximate (int target, int value)
1053 if (value > target-10 && value < target+10)
1059 public void UseOnlyOverlappedIOChange ()
1061 Socket sock = new Socket (AddressFamily.InterNetwork,
1065 sock.UseOnlyOverlappedIO = true;
1067 Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange");
1073 /* Should not throw an exception */
1074 public void UseOnlyOverlappedIOClosed ()
1076 Socket sock = new Socket (AddressFamily.InterNetwork,
1082 bool val = sock.UseOnlyOverlappedIO;
1086 public void SendTimeoutDefault ()
1088 Socket sock = new Socket (AddressFamily.InterNetwork,
1092 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault");
1098 public void SendTimeoutChange ()
1100 Socket sock = new Socket (AddressFamily.InterNetwork,
1104 /* Should be rounded up to 500, according to
1105 * the MSDN docs, but the MS runtime doesn't
1107 sock.SendTimeout = 50;
1108 Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1");
1110 sock.SendTimeout = 2000;
1111 Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2");
1113 sock.SendTimeout = 0;
1114 Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3");
1116 /* Should be the same as setting 0 */
1117 sock.SendTimeout = -1;
1118 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4");
1120 sock.SendTimeout = 65536;
1121 Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5");
1124 sock.SendTimeout = -2;
1125 Assert.Fail ("SendTimeoutChange #8");
1126 } catch (ArgumentOutOfRangeException) {
1133 [ExpectedException (typeof(ObjectDisposedException))]
1134 public void SendTimeoutClosed ()
1136 Socket sock = new Socket (AddressFamily.InterNetwork,
1142 int val = sock.SendTimeout;
1146 public void ReceiveTimeoutDefault ()
1148 Socket sock = new Socket (AddressFamily.InterNetwork,
1152 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault");
1158 public void ReceiveTimeoutChange ()
1160 Socket sock = new Socket (AddressFamily.InterNetwork,
1164 sock.ReceiveTimeout = 50;
1165 Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1");
1167 sock.ReceiveTimeout = 2000;
1168 Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2");
1170 sock.ReceiveTimeout = 0;
1171 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3");
1173 /* Should be the same as setting 0 */
1174 sock.ReceiveTimeout = -1;
1175 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4");
1177 sock.ReceiveTimeout = 65536;
1178 Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5");
1181 sock.ReceiveTimeout = -2;
1182 Assert.Fail ("ReceiveTimeoutChange #8");
1183 } catch (ArgumentOutOfRangeException) {
1190 [ExpectedException (typeof(ObjectDisposedException))]
1191 public void ReceiveTimeoutClosed ()
1193 Socket sock = new Socket (AddressFamily.InterNetwork,
1199 int val = sock.ReceiveTimeout;
1203 public void NoDelayDefaultTcp ()
1205 Socket sock = new Socket (AddressFamily.InterNetwork,
1209 Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
1215 public void NoDelayChangeTcp ()
1217 Socket sock = new Socket (AddressFamily.InterNetwork,
1221 sock.NoDelay = true;
1223 Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp");
1229 public void NoDelayDefaultUdp ()
1231 Socket sock = new Socket (AddressFamily.InterNetwork,
1236 bool val = sock.NoDelay;
1237 Assert.Fail ("NoDelayDefaultUdp #1");
1238 } catch (SocketException ex) {
1239 Assert.AreEqual (10042, ex.ErrorCode,
1240 "NoDelayDefaultUdp #2");
1247 public void NoDelayChangeUdp ()
1249 Socket sock = new Socket (AddressFamily.InterNetwork,
1254 sock.NoDelay = true;
1255 Assert.Fail ("NoDelayChangeUdp #1");
1256 } catch (SocketException ex) {
1257 Assert.AreEqual (10042, ex.ErrorCode,
1258 "NoDelayChangeUdp #2");
1265 [ExpectedException (typeof(ObjectDisposedException))]
1266 public void NoDelayClosed ()
1268 Socket sock = new Socket (AddressFamily.InterNetwork,
1274 bool val = sock.NoDelay;
1277 static bool BAAccepted = false;
1278 static Socket BASocket = null;
1279 static ManualResetEvent BACalledBack = new ManualResetEvent (false);
1281 private static void BACallback (IAsyncResult asyncResult)
1283 Socket sock = (Socket)asyncResult.AsyncState;
1285 BASocket = sock.EndAccept (asyncResult);
1288 BACalledBack.Set ();
1292 [ExpectedException (typeof(InvalidOperationException))]
1293 public void BeginAcceptNotBound ()
1295 Socket sock = new Socket (AddressFamily.InterNetwork,
1299 sock.BeginAccept (BACallback, sock);
1305 [ExpectedException (typeof(InvalidOperationException))]
1306 public void BeginAcceptNotListening ()
1308 Socket sock = new Socket (AddressFamily.InterNetwork,
1312 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
1314 sock.BeginAccept (BACallback, sock);
1320 public void BeginAccept ()
1322 Socket sock = new Socket (AddressFamily.InterNetwork,
1325 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1326 NetworkHelpers.FindFreePort ());
1331 BACalledBack.Reset ();
1333 sock.BeginAccept (BACallback, sock);
1335 Socket conn = new Socket (AddressFamily.InterNetwork,
1341 if (BACalledBack.WaitOne (2000, false) == false) {
1342 Assert.Fail ("BeginAccept wait timed out");
1345 Assert.AreEqual (true, BAAccepted, "BeginAccept #1");
1346 Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2");
1347 Assert.AreEqual (false, sock.Connected, "BeginAccept #3");
1348 Assert.AreEqual (true, conn.Connected, "BeginAccept #4");
1356 [ExpectedException (typeof(ObjectDisposedException))]
1357 public void BeginAcceptClosed ()
1359 Socket sock = new Socket (AddressFamily.InterNetwork,
1365 sock.BeginAccept (BACallback, sock);
1368 static bool BADAccepted = false;
1369 static Socket BADSocket = null;
1370 static byte[] BADBytes;
1371 static int BADByteCount;
1372 static ManualResetEvent BADCalledBack = new ManualResetEvent (false);
1374 private static void BADCallback (IAsyncResult asyncResult)
1376 Socket sock = (Socket)asyncResult.AsyncState;
1378 BADSocket = sock.EndAccept (out BADBytes,
1383 BADCalledBack.Set ();
1387 public void BeginAcceptData ()
1389 Socket sock = new Socket (AddressFamily.InterNetwork,
1392 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1393 NetworkHelpers.FindFreePort ());
1398 BADCalledBack.Reset ();
1400 sock.BeginAccept (256, BADCallback, sock);
1402 Socket conn = new Socket (AddressFamily.InterNetwork,
1405 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1408 conn.Send (send_bytes);
1410 if (BADCalledBack.WaitOne (2000, false) == false) {
1411 Assert.Fail ("BeginAcceptData wait timed out");
1414 Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1");
1415 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2");
1416 Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3");
1417 Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4");
1418 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5");
1420 /* The MS runtime gives the returned data in a
1421 * much bigger array. TODO: investigate
1422 * whether it the size correlates to the first
1423 * parameter in BeginAccept()
1425 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1426 "BeginAcceptData #6");
1428 for(int i = 0; i < send_bytes.Length; i++) {
1429 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ());
1438 [ExpectedException (typeof(ObjectDisposedException))]
1439 public void BeginAcceptDataClosed ()
1441 Socket sock = new Socket (AddressFamily.InterNetwork,
1447 sock.BeginAccept (256, BADCallback, sock);
1451 public void BeginAcceptSocketUdp ()
1453 Socket sock = new Socket (AddressFamily.InterNetwork,
1456 Socket acc = new Socket (AddressFamily.InterNetwork,
1460 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1461 NetworkHelpers.FindFreePort ());
1467 sock.BeginAccept (acc, 256, BADCallback, sock);
1468 Assert.Fail ("BeginAcceptSocketUdp #1");
1469 } catch (SocketException ex) {
1470 Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
1478 public void BeginAcceptSocketBound ()
1480 Socket sock = new Socket (AddressFamily.InterNetwork,
1483 Socket acc = new Socket (AddressFamily.InterNetwork,
1487 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
1488 NetworkHelpers.FindFreePort ());
1490 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
1491 NetworkHelpers.FindFreePort ());
1499 sock.BeginAccept (acc, 256, BADCallback, sock);
1500 Assert.Fail ("BeginAcceptSocketBound #1");
1501 } catch (InvalidOperationException) {
1509 public void BeginAcceptSocket ()
1511 Socket sock = new Socket (AddressFamily.InterNetwork,
1514 Socket acc = new Socket (AddressFamily.InterNetwork,
1518 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1519 NetworkHelpers.FindFreePort ());
1524 BADCalledBack.Reset ();
1526 sock.BeginAccept (acc, 256, BADCallback, sock);
1528 Socket conn = new Socket (AddressFamily.InterNetwork,
1531 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1534 conn.Send (send_bytes);
1536 if (BADCalledBack.WaitOne (2000, false) == false) {
1537 Assert.Fail ("BeginAcceptSocket wait timed out");
1540 Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1");
1541 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2");
1542 Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3");
1543 Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4");
1544 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5");
1545 Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6");
1546 Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7");
1547 Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8");
1548 Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9");
1550 /* The MS runtime gives the returned data in a
1551 * much bigger array. TODO: investigate
1552 * whether it the size correlates to the first
1553 * parameter in BeginAccept()
1555 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1556 "BeginAcceptSocket #10");
1558 for(int i = 0; i < send_bytes.Length; i++) {
1559 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ());
1569 public void BeginAcceptSocketClosed ()
1571 Socket sock = new Socket (AddressFamily.InterNetwork,
1574 Socket acc = new Socket (AddressFamily.InterNetwork,
1581 sock.BeginAccept (acc, 256, BADCallback, null);
1582 Assert.Fail ("BeginAcceptSocketClosed #1");
1583 } catch (ObjectDisposedException) {
1590 public void BeginAcceptSocketAccClosed ()
1592 Socket sock = new Socket (AddressFamily.InterNetwork,
1595 Socket acc = new Socket (AddressFamily.InterNetwork,
1598 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1599 NetworkHelpers.FindFreePort ());
1606 BADCalledBack.Reset ();
1609 sock.BeginAccept (acc, 256, BADCallback, null);
1610 Assert.Fail ("BeginAcceptSocketAccClosed #1");
1611 } catch (ObjectDisposedException) {
1617 static bool BCConnected = false;
1618 static ManualResetEvent BCCalledBack = new ManualResetEvent (false);
1620 private static void BCCallback (IAsyncResult asyncResult)
1622 Socket sock = (Socket)asyncResult.AsyncState;
1625 sock.EndConnect (asyncResult);
1626 } catch (Exception e) {
1627 Console.WriteLine ("BCCallback exception:");
1628 Console.WriteLine (e);
1635 BCCalledBack.Set ();
1639 public void BeginConnectAddressPort ()
1641 Socket sock = new Socket (AddressFamily.InterNetwork,
1644 Socket listen = new Socket (AddressFamily.InterNetwork,
1647 IPAddress ip = IPAddress.Loopback;
1648 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1653 BCCalledBack.Reset ();
1655 BCConnected = false;
1657 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1659 if (BCCalledBack.WaitOne (2000, false) == false) {
1660 Assert.Fail ("BeginConnectAddressPort wait timed out");
1663 Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1");
1670 public void BeginConnectAddressPortNull ()
1672 Socket sock = new Socket (AddressFamily.InterNetwork,
1675 IPAddress ip = null;
1678 sock.BeginConnect (ip, 1244, BCCallback,
1680 Assert.Fail ("BeginConnectAddressPortNull #1");
1681 } catch (ArgumentNullException) {
1688 public void BeginConnectAddressPortListen ()
1690 Socket sock = new Socket (AddressFamily.InterNetwork,
1693 IPAddress ip = IPAddress.Loopback;
1694 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1700 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1701 Assert.Fail ("BeginConnectAddressPortListen #1");
1702 } catch (InvalidOperationException) {
1709 [ExpectedException (typeof(ObjectDisposedException))]
1710 public void BeginConnectAddressPortClosed ()
1712 Socket sock = new Socket (AddressFamily.InterNetwork,
1715 IPAddress ip = IPAddress.Loopback;
1719 sock.BeginConnect (ip, 1244, BCCallback, sock);
1723 [Category ("NotOnMac")]
1725 * This is not a Mono bug.
1727 * By default, only 127.0.0.1 is enabled and you must explicitly
1728 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
1730 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
1731 * until I add that alias.
1734 public void BeginConnectMultiple ()
1736 Socket sock = new Socket (AddressFamily.InterNetwork,
1739 Socket listen = new Socket (AddressFamily.InterNetwork,
1742 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1743 NetworkHelpers.FindFreePort ());
1744 IPAddress[] ips = new IPAddress[4];
1746 ips[0] = IPAddress.Parse ("127.0.0.4");
1747 ips[1] = IPAddress.Parse ("127.0.0.3");
1748 ips[2] = IPAddress.Parse ("127.0.0.2");
1749 ips[3] = IPAddress.Parse ("127.0.0.1");
1754 BCCalledBack.Reset ();
1756 BCConnected = false;
1758 sock.BeginConnect (ips, ep.Port, BCCallback, sock);
1760 /* Longer wait here, because the ms runtime
1761 * takes a lot longer to not connect
1764 if (BCCalledBack.WaitOne (30000, false) == false) {
1765 Assert.Fail ("BeginConnectMultiple wait failed");
1769 Assert.IsTrue (BCCalledBack.WaitOne (30000), "#0");
1771 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
1772 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
1773 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1775 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2");
1782 public void BeginConnectMultiple2 ()
1784 Socket sock = new Socket (AddressFamily.InterNetwork,
1787 Socket listen = new Socket (AddressFamily.InterNetwork,
1791 // Need at least two addresses.
1792 var ips = Dns.GetHostAddresses (string.Empty);
1794 Assert.Ignore ("This test needs at least two IP addresses.");
1796 var allIps = new IPAddress [ips.Length + 1];
1797 allIps [0] = IPAddress.Loopback;
1798 ips.CopyTo (allIps, 1);
1801 * Only bind to the loopback interface, so all the non-loopback
1802 * IP addresses will fail. BeginConnect()/EndConnect() should
1803 * succeed it it can connect to at least one of the requested
1806 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
1811 BCCalledBack.Reset ();
1813 BCConnected = false;
1815 sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
1817 /* Longer wait here, because the ms runtime
1818 * takes a lot longer to not connect
1820 if (BCCalledBack.WaitOne (10000, false) == false) {
1821 Assert.Fail ("BeginConnectMultiple2 wait failed");
1824 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple2 #1");
1825 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple2 #2");
1826 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1828 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple2 #2");
1836 public void BeginConnectMultipleNull ()
1838 Socket sock = new Socket (AddressFamily.InterNetwork,
1841 IPAddress[] ips = null;
1844 sock.BeginConnect (ips, 1246, BCCallback,
1846 Assert.Fail ("BeginConnectMultipleNull #1");
1847 } catch (ArgumentNullException) {
1854 public void BeginConnectMultipleListen ()
1856 Socket sock = new Socket (AddressFamily.InterNetwork,
1859 IPAddress[] ips = new IPAddress[4];
1860 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1861 NetworkHelpers.FindFreePort ());
1863 ips[0] = IPAddress.Parse ("127.0.0.4");
1864 ips[1] = IPAddress.Parse ("127.0.0.3");
1865 ips[2] = IPAddress.Parse ("127.0.0.2");
1866 ips[3] = IPAddress.Parse ("127.0.0.1");
1872 sock.BeginConnect (ips, ep.Port, BCCallback,
1874 Assert.Fail ("BeginConnectMultipleListen #1");
1875 } catch (InvalidOperationException) {
1882 [ExpectedException (typeof(ObjectDisposedException))]
1883 public void BeginConnectMultipleClosed ()
1885 Socket sock = new Socket (AddressFamily.InterNetwork,
1888 IPAddress[] ips = new IPAddress[4];
1890 ips[0] = IPAddress.Parse ("127.0.0.4");
1891 ips[1] = IPAddress.Parse ("127.0.0.3");
1892 ips[2] = IPAddress.Parse ("127.0.0.2");
1893 ips[3] = IPAddress.Parse ("127.0.0.1");
1897 sock.BeginConnect (ips, 1247, BCCallback, sock);
1901 public void BeginConnectHostPortNull ()
1903 Socket sock = new Socket (AddressFamily.InterNetwork,
1908 sock.BeginConnect ((string)null, 0,
1910 Assert.Fail ("BeginConnectHostPort #1");
1911 } catch (ArgumentNullException) {
1918 public void BeginConnectHostPortListen ()
1920 Socket sock = new Socket (AddressFamily.InterNetwork,
1923 IPAddress ip = IPAddress.Loopback;
1924 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1930 sock.BeginConnect ("localhost", ep.Port,
1932 Assert.Fail ("BeginConnectHostPortListen #1");
1933 } catch (InvalidOperationException) {
1940 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
1941 public void BeginConnectHostPortNotIP ()
1943 Socket sock = new Socket (AddressFamily.NetBios,
1944 SocketType.Seqpacket,
1945 ProtocolType.Unspecified);
1948 sock.BeginConnect ("localhost", 0, BCCallback,
1950 Assert.Fail ("BeginConnectHostPortNotIP #1");
1951 } catch (NotSupportedException) {
1958 [ExpectedException (typeof(ObjectDisposedException))]
1959 public void BeginConnectHostPortClosed ()
1961 Socket sock = new Socket (AddressFamily.InterNetwork,
1967 sock.BeginConnect ("localhost", 0, BCCallback, sock);
1970 static bool BDDisconnected = false;
1971 static ManualResetEvent BDCalledBack = new ManualResetEvent (false);
1973 private static void BDCallback (IAsyncResult asyncResult)
1975 Socket sock = (Socket)asyncResult.AsyncState;
1977 sock.EndDisconnect (asyncResult);
1978 BDDisconnected = true;
1980 BDCalledBack.Set ();
1984 [Category ("NotDotNet")] // "Needs XP or later"
1985 public void BeginDisconnect ()
1987 Socket sock = new Socket (AddressFamily.InterNetwork,
1990 Socket listen = new Socket (AddressFamily.InterNetwork,
1993 IPAddress ip = IPAddress.Loopback;
1994 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1999 sock.Connect (ip, ep.Port);
2001 Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
2003 sock.Shutdown (SocketShutdown.Both);
2005 BDCalledBack.Reset ();
2006 BDDisconnected = false;
2008 sock.BeginDisconnect (false, BDCallback, sock);
2010 if (BDCalledBack.WaitOne (2000, false) == false) {
2011 Assert.Fail ("BeginDisconnect wait timed out");
2014 Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2");
2015 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2022 public void BeginReceiveSocketError ()
2027 public void BeginReceiveGeneric ()
2032 public void BeginReceiveGenericSocketError ()
2036 private static void BSCallback (IAsyncResult asyncResult)
2038 Socket sock = (Socket)asyncResult.AsyncState;
2040 sock.EndSend (asyncResult);
2044 public void BeginSendNotConnected ()
2046 Socket sock = new Socket (AddressFamily.InterNetwork,
2050 byte[] send_bytes = new byte[] {10, 11, 12, 13};
2053 sock.BeginSend (send_bytes, 0,
2055 SocketFlags.None, BSCallback,
2057 Assert.Fail ("BeginSendNotConnected #1");
2058 } catch (SocketException ex) {
2059 Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
2066 public void BeginSendSocketError ()
2071 public void BeginSendGeneric ()
2076 public void BeginSendGenericSocketError ()
2081 public void BindTwice ()
2083 Socket sock = new Socket (AddressFamily.InterNetwork,
2086 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
2087 NetworkHelpers.FindFreePort ());
2088 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
2089 NetworkHelpers.FindFreePort ());
2095 Assert.Fail ("BindTwice #1");
2096 } catch (SocketException ex) {
2097 Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
2104 public void Close ()
2106 Socket sock = new Socket (AddressFamily.InterNetwork,
2109 Socket listen = new Socket (AddressFamily.InterNetwork,
2112 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2113 NetworkHelpers.FindFreePort ());
2120 Assert.AreEqual (true, sock.Connected, "Close #1");
2124 Thread.Sleep (3000);
2126 Assert.AreEqual (false, sock.Connected, "Close #2");
2132 public void ConnectAddressPort ()
2134 Socket sock = new Socket (AddressFamily.InterNetwork,
2137 Socket listen = new Socket (AddressFamily.InterNetwork,
2140 IPAddress ip = IPAddress.Loopback;
2141 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2146 sock.Connect (ip, ep.Port);
2148 Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
2155 public void ConnectAddressPortNull ()
2157 Socket sock = new Socket (AddressFamily.InterNetwork,
2160 IPAddress ip = null;
2163 sock.Connect (ip, 1249);
2164 Assert.Fail ("ConnectAddressPortNull #1");
2165 } catch (ArgumentNullException) {
2172 public void ConnectAddressPortListen ()
2174 Socket sock = new Socket (AddressFamily.InterNetwork,
2177 IPAddress ip = IPAddress.Loopback;
2178 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2184 sock.Connect (ip, ep.Port);
2185 Assert.Fail ("ConnectAddressPortListen #1");
2186 } catch (InvalidOperationException) {
2193 [ExpectedException (typeof(ObjectDisposedException))]
2194 public void ConnectAddressPortClosed ()
2196 Socket sock = new Socket (AddressFamily.InterNetwork,
2199 IPAddress ip = IPAddress.Loopback;
2203 sock.Connect (ip, 1250);
2207 [Category ("NotOnMac")] // MacOSX trashes the fd after the failed connect attempt to 127.0.0.4
2209 * This is not a Mono bug.
2211 * By default, only 127.0.0.1 is enabled and you must explicitly
2212 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
2214 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
2215 * until I add that alias.
2217 * However, after doing so, Mac OS treats these as separate addresses, ie. attempting
2218 * to connect to 127.0.0.4 yields a connection refused.
2220 * When using Connect(), the .NET runtime also throws an exception if connecting to
2221 * any of the IP addresses fails. This is different with BeginConnect()/EndConnect()
2222 * which succeeds when it can connect to at least one of the addresses.
2225 public void ConnectMultiple ()
2227 Socket sock = new Socket (AddressFamily.InterNetwork,
2230 Socket listen = new Socket (AddressFamily.InterNetwork,
2233 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2234 NetworkHelpers.FindFreePort ());
2235 IPAddress[] ips = new IPAddress[4];
2237 ips[0] = IPAddress.Parse ("127.0.0.4");
2238 ips[1] = IPAddress.Parse ("127.0.0.3");
2239 ips[2] = IPAddress.Parse ("127.0.0.2");
2240 ips[3] = IPAddress.Parse ("127.0.0.1");
2245 sock.Connect (ips, ep.Port);
2247 Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
2248 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
2249 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2251 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2");
2258 public void ConnectMultiple2 ()
2260 Socket sock = new Socket (AddressFamily.InterNetwork,
2263 Socket listen = new Socket (AddressFamily.InterNetwork,
2267 // Need at least two addresses.
2268 var ips = Dns.GetHostAddresses (string.Empty);
2270 Assert.Ignore ("This test needs at least two IP addresses.");
2272 var allIps = new IPAddress [ips.Length + 1];
2273 allIps [0] = IPAddress.Loopback;
2274 ips.CopyTo (allIps, 1);
2277 * Bind to IPAddress.Any; Connect() will fail unless it can
2278 * connect to all the addresses in allIps.
2280 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
2285 sock.Connect (allIps, ep.Port);
2287 Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
2288 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
2289 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2291 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple2 #3");
2298 public void ConnectMultipleNull ()
2300 Socket sock = new Socket (AddressFamily.InterNetwork,
2303 IPAddress[] ips = null;
2306 sock.Connect (ips, 1251);
2307 Assert.Fail ("ConnectMultipleNull #1");
2308 } catch (ArgumentNullException) {
2315 public void ConnectMultipleListen ()
2317 Socket sock = new Socket (AddressFamily.InterNetwork,
2320 IPAddress[] ips = new IPAddress[4];
2321 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2322 NetworkHelpers.FindFreePort ());
2324 ips[0] = IPAddress.Parse ("127.0.0.4");
2325 ips[1] = IPAddress.Parse ("127.0.0.3");
2326 ips[2] = IPAddress.Parse ("127.0.0.2");
2327 ips[3] = IPAddress.Parse ("127.0.0.1");
2333 sock.Connect (ips, ep.Port);
2334 Assert.Fail ("ConnectMultipleListen #1");
2335 } catch (InvalidOperationException) {
2342 [ExpectedException (typeof(ObjectDisposedException))]
2343 public void ConnectMultipleClosed ()
2345 Socket sock = new Socket (AddressFamily.InterNetwork,
2348 IPAddress[] ips = new IPAddress[4];
2350 ips[0] = IPAddress.Parse ("127.0.0.4");
2351 ips[1] = IPAddress.Parse ("127.0.0.3");
2352 ips[2] = IPAddress.Parse ("127.0.0.2");
2353 ips[3] = IPAddress.Parse ("127.0.0.1");
2357 sock.Connect (ips, 1252);
2361 public void ConnectHostPortNull ()
2363 Socket sock = new Socket (AddressFamily.InterNetwork,
2368 sock.Connect ((string)null, 0);
2369 Assert.Fail ("ConnectHostPort #1");
2370 } catch (ArgumentNullException) {
2377 public void ConnectHostPortListen ()
2379 Socket sock = new Socket (AddressFamily.InterNetwork,
2382 IPAddress ip = IPAddress.Loopback;
2383 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2389 sock.Connect ("localhost", ep.Port);
2390 Assert.Fail ("ConnectHostPortListen #1");
2391 } catch (InvalidOperationException) {
2398 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
2399 public void ConnectHostPortNotIP ()
2401 Socket sock = new Socket (AddressFamily.NetBios,
2402 SocketType.Seqpacket,
2403 ProtocolType.Unspecified);
2406 sock.Connect ("localhost", 0);
2407 Assert.Fail ("ConnectHostPortNotIP #1");
2408 } catch (NotSupportedException) {
2415 [ExpectedException (typeof(ObjectDisposedException))]
2416 public void ConnectHostPortClosed ()
2418 Socket sock = new Socket (AddressFamily.InterNetwork,
2424 sock.Connect ("localhost", 0);
2428 [Category ("NotDotNet")] // "Needs XP or later"
2429 public void Disconnect ()
2431 Socket sock = new Socket (AddressFamily.InterNetwork,
2434 Socket listen = new Socket (AddressFamily.InterNetwork,
2437 IPAddress ip = IPAddress.Loopback;
2438 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2443 sock.Connect (ip, ep.Port);
2445 Assert.AreEqual (true, sock.Connected, "Disconnect #1");
2447 sock.Shutdown (SocketShutdown.Both);
2449 sock.Disconnect (false);
2451 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2458 public void DuplicateAndClose ()
2463 public void IOControl ()
2468 public void TestDefaultsDualMode ()
2470 using (var socket = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)){
2471 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2474 using (var socket = new Socket (SocketType.Stream, ProtocolType.Tcp)){
2475 Assert.AreEqual (AddressFamily.InterNetworkV6, socket.AddressFamily, "When creating sockets of type stream/tcp, the address family should be InterNetworkV6");
2476 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2478 socket.DualMode = false;
2480 Assert.IsFalse (socket.DualMode, "Setting of DualSocket should turn DualSockets off");
2486 public void ReceiveGeneric ()
2490 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2492 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2493 listensock.Bind (endpoint);
2494 listensock.Listen(1);
2496 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2497 sendsock.Connect(endpoint);
2499 Socket clientsock = listensock.Accept();
2501 byte[] sendbuf = new byte[256];
2503 for(i = 0; i < 256; i++) {
2504 sendbuf[i] = (byte)i;
2506 for (i = 4; i < 6; i++) {
2507 Assert.AreEqual (sendbuf[i], (byte)i,
2508 "#1/" + i.ToString());
2512 sendsock.Send (sendbuf, 0, 256, SocketFlags.None,
2516 byte[] recvbuf = new byte[256];
2517 List<ArraySegment<byte>> recvbuflist = new List<ArraySegment<byte>>(2);
2518 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 4, 2));
2519 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 20, 230));
2521 clientsock.Receive (recvbuflist);
2523 /* recvbuf should now hold the first 2 bytes
2524 * of sendbuf from pos 4, and the next 230
2525 * bytes of sendbuf from pos 20
2528 for (i = 0; i < 2; i++) {
2529 Assert.AreEqual (sendbuf[i], recvbuf[i + 4],
2530 "#2/" + i.ToString());
2532 for (i = 2; i < 232; i++) {
2533 Assert.AreEqual (sendbuf[i], recvbuf[i + 18],
2534 "#2/" + i.ToString());
2538 clientsock.Close ();
2539 listensock.Close ();
2543 public void SendGeneric ()
2547 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2549 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2550 listensock.Bind (endpoint);
2551 listensock.Listen(1);
2553 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2554 sendsock.Connect(endpoint);
2556 Socket clientsock = listensock.Accept();
2558 byte[] sendbuf = new byte[256];
2559 List<ArraySegment<byte>> sendbuflist = new List<ArraySegment<byte>>(2);
2561 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 4, 2));
2562 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 20, 230));
2564 for(i = 0; i < 256; i++) {
2565 sendbuf[i] = (byte)i;
2567 for (i = 4; i < 6; i++) {
2568 Assert.AreEqual (sendbuf[i], (byte)i,
2569 "#1/" + i.ToString());
2573 sendsock.Send (sendbuflist, SocketFlags.None, out err);
2576 byte[] recvbuf = new byte[256];
2578 clientsock.Receive (recvbuf);
2580 /* The first 2 bytes of recvbuf should now
2581 * hold 2 bytes of sendbuf from pos 4, and the
2582 * next 230 bytes of recvbuf should be sendbuf
2586 for (i = 0; i < 2; i++) {
2587 Assert.AreEqual (recvbuf[i], sendbuf[i + 4],
2588 "#2/" + i.ToString());
2590 for (i = 2; i < 232; i++) {
2591 Assert.AreEqual (recvbuf[i], sendbuf[i + 18],
2592 "#2/" + i.ToString());
2596 clientsock.Close ();
2597 listensock.Close ();
2601 public void ListenNotBound ()
2603 Socket sock = new Socket (AddressFamily.InterNetwork,
2609 Assert.Fail ("ListenNotBound #1");
2610 } catch (SocketException ex) {
2611 Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
2617 static Socket CWRSocket;
2618 static bool CWRReceiving = true;
2619 static ManualResetEvent CWRReady = new ManualResetEvent (false);
2621 private static void CWRReceiveThread ()
2623 byte[] buf = new byte[256];
2626 CWRSocket.Receive (buf);
2627 } catch (SocketException) {
2628 CWRReceiving = false;
2635 public void CloseWhileReceiving ()
2637 CWRSocket = new Socket (AddressFamily.InterNetwork,
2640 CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
2641 NetworkHelpers.FindFreePort ()));
2643 Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
2645 recv_thread.Start ();
2646 Thread.Sleep (250); /* Wait for the thread to be already receiving */
2649 if (CWRReady.WaitOne (1000, false) == false) {
2650 Assert.Fail ("CloseWhileReceiving wait timed out");
2653 Assert.IsFalse (CWRReceiving);
2656 static bool RRCLastRead = false;
2657 static ManualResetEvent RRCReady = new ManualResetEvent (false);
2659 private static void RRCClientThread (int port)
2661 byte[] bytes = new byte[8];
2664 Socket sock = new Socket (AddressFamily.InterNetwork,
2667 sock.Connect (new IPEndPoint (IPAddress.Loopback,
2670 NetworkStream stream = new NetworkStream (sock);
2672 readbyte = stream.ReadByte ();
2673 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1");
2675 stream.Read (bytes, 0, 0);
2677 readbyte = stream.ReadByte ();
2678 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2");
2680 stream.Read (bytes, 0, 0);
2682 readbyte = stream.ReadByte ();
2683 Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3");
2691 [Test] // Receive (Byte [])
2692 public void Receive1_Buffer_Null ()
2694 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2698 s.Receive ((byte []) null);
2700 } catch (ArgumentNullException ex) {
2701 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2702 Assert.IsNull (ex.InnerException, "#3");
2703 Assert.IsNotNull (ex.Message, "#4");
2704 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2710 [Test] // Receive (Byte [])
2711 public void Receive1_Socket_Closed ()
2713 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2718 s.Receive ((byte []) null);
2720 } catch (ObjectDisposedException ex) {
2721 // Cannot access a disposed object
2722 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2723 Assert.IsNull (ex.InnerException, "#3");
2724 Assert.IsNotNull (ex.Message, "#4");
2725 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2729 [Test] // Receive (Byte [], SocketFlags)
2730 public void Receive2_Buffer_Null ()
2732 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2736 s.Receive ((byte []) null, (SocketFlags) 666);
2738 } catch (ArgumentNullException ex) {
2739 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2740 Assert.IsNull (ex.InnerException, "#3");
2741 Assert.IsNotNull (ex.Message, "#4");
2742 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2748 [Test] // Receive (Byte [], SocketFlags)
2749 public void Receive2_Socket_Closed ()
2751 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2756 s.Receive ((byte []) null, (SocketFlags) 666);
2758 } catch (ObjectDisposedException ex) {
2759 // Cannot access a disposed object
2760 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2761 Assert.IsNull (ex.InnerException, "#3");
2762 Assert.IsNotNull (ex.Message, "#4");
2763 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2767 [Test] // Receive (Byte [], Int32, SocketFlags)
2768 public void Receive3_Buffer_Null ()
2770 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2774 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2776 } catch (ArgumentNullException ex) {
2777 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2778 Assert.IsNull (ex.InnerException, "#3");
2779 Assert.IsNotNull (ex.Message, "#4");
2780 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2786 [Test] // Receive (Byte [], Int32, SocketFlags)
2787 public void Receive3_Socket_Closed ()
2789 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2794 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2796 } catch (ObjectDisposedException ex) {
2797 // Cannot access a disposed object
2798 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2799 Assert.IsNull (ex.InnerException, "#3");
2800 Assert.IsNotNull (ex.Message, "#4");
2801 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2805 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2806 public void Receive4_Buffer_Null ()
2808 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2812 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2814 } catch (ArgumentNullException ex) {
2815 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2816 Assert.IsNull (ex.InnerException, "#3");
2817 Assert.IsNotNull (ex.Message, "#4");
2818 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2824 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2825 public void Receive4_Socket_Closed ()
2827 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2832 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2834 } catch (ObjectDisposedException ex) {
2835 // Cannot access a disposed object
2836 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2837 Assert.IsNull (ex.InnerException, "#3");
2838 Assert.IsNotNull (ex.Message, "#4");
2839 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2843 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2844 public void Receive5_Buffer_Null ()
2846 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2851 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2853 } catch (ArgumentNullException ex) {
2854 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2855 Assert.IsNull (ex.InnerException, "#3");
2856 Assert.IsNotNull (ex.Message, "#4");
2857 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2863 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2864 public void Receive5_Socket_Closed ()
2866 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2872 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2874 } catch (ObjectDisposedException ex) {
2875 // Cannot access a disposed object
2876 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2877 Assert.IsNull (ex.InnerException, "#3");
2878 Assert.IsNotNull (ex.Message, "#4");
2879 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2883 [Test] // Receive (IList<ArraySegment<Byte>>)
2884 public void Receive6_Buffers_Null ()
2886 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2890 s.Receive ((IList<ArraySegment<byte>>) null);
2892 } catch (ArgumentNullException ex) {
2893 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2894 Assert.IsNull (ex.InnerException, "#3");
2895 Assert.IsNotNull (ex.Message, "#4");
2896 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2902 [Test] // Receive (IList<ArraySegment<Byte>>)
2903 public void Receive6_Socket_Closed ()
2905 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2910 s.Receive ((IList<ArraySegment<byte>>) null);
2912 } catch (ObjectDisposedException ex) {
2913 // Cannot access a disposed object
2914 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2915 Assert.IsNull (ex.InnerException, "#3");
2916 Assert.IsNotNull (ex.Message, "#4");
2917 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2921 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2922 public void Receive7_Buffers_Null ()
2924 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2928 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2930 } catch (ArgumentNullException ex) {
2931 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2932 Assert.IsNull (ex.InnerException, "#3");
2933 Assert.IsNotNull (ex.Message, "#4");
2934 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2940 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2941 public void Receive7_Socket_Closed ()
2943 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2948 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2950 } catch (ObjectDisposedException ex) {
2951 // Cannot access a disposed object
2952 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2953 Assert.IsNull (ex.InnerException, "#3");
2954 Assert.IsNotNull (ex.Message, "#4");
2955 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2959 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
2960 public void Receive8_Buffers_Null ()
2962 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2967 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
2970 } catch (ArgumentNullException ex) {
2971 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2972 Assert.IsNull (ex.InnerException, "#3");
2973 Assert.IsNotNull (ex.Message, "#4");
2974 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2980 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
2981 public void Receive8_Socket_Closed ()
2983 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2989 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
2992 } catch (ObjectDisposedException ex) {
2993 // Cannot access a disposed object
2994 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2995 Assert.IsNull (ex.InnerException, "#3");
2996 Assert.IsNotNull (ex.Message, "#4");
2997 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3003 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3004 public void ReceiveFrom1_Buffer_Null ()
3006 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3009 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3011 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3013 } catch (ArgumentNullException ex) {
3014 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3015 Assert.IsNull (ex.InnerException, "#3");
3016 Assert.IsNotNull (ex.Message, "#4");
3017 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3023 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3024 public void ReceiveFrom1_RemoteEP_Null ()
3026 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3029 byte [] buffer = new byte [0];
3030 EndPoint remoteEP = null;
3032 s.ReceiveFrom (buffer, ref remoteEP);
3034 } catch (ArgumentNullException ex) {
3035 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3036 Assert.IsNull (ex.InnerException, "#3");
3037 Assert.IsNotNull (ex.Message, "#4");
3038 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3044 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3045 public void ReceiveFrom1_Socket_Closed ()
3047 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3051 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3053 s.ReceiveFrom ((Byte []) null, ref remoteEP);
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");
3064 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3065 public void ReceiveFrom2_Buffer_Null ()
3067 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3070 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3072 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3074 } catch (ArgumentNullException ex) {
3075 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3076 Assert.IsNull (ex.InnerException, "#3");
3077 Assert.IsNotNull (ex.Message, "#4");
3078 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3084 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3085 public void ReceiveFrom2_RemoteEP_Null ()
3087 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3090 byte [] buffer = new byte [5];
3091 EndPoint remoteEP = null;
3093 s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP);
3095 } catch (ArgumentNullException ex) {
3096 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3097 Assert.IsNull (ex.InnerException, "#3");
3098 Assert.IsNotNull (ex.Message, "#4");
3099 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3105 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3106 public void ReceiveFrom2_Socket_Closed ()
3108 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3112 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3114 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3116 } catch (ObjectDisposedException ex) {
3117 // Cannot access a disposed object
3118 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3119 Assert.IsNull (ex.InnerException, "#3");
3120 Assert.IsNotNull (ex.Message, "#4");
3121 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3125 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3126 public void ReceiveFrom3_Buffer_Null ()
3128 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3131 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3133 s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
3136 } catch (ArgumentNullException ex) {
3137 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3138 Assert.IsNull (ex.InnerException, "#3");
3139 Assert.IsNotNull (ex.Message, "#4");
3140 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3146 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3147 public void ReceiveFrom3_RemoteEP_Null ()
3149 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3152 byte [] buffer = new byte [5];
3153 EndPoint remoteEP = null;
3155 s.ReceiveFrom (buffer, buffer.Length, (SocketFlags) 666, ref remoteEP);
3157 } catch (ArgumentNullException ex) {
3158 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3159 Assert.IsNull (ex.InnerException, "#3");
3160 Assert.IsNotNull (ex.Message, "#4");
3161 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3167 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3168 public void ReceiveFrom3_Size_OutOfRange ()
3171 byte [] buffer = new byte [5];
3172 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3175 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3178 s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP);
3179 Assert.Fail ("#A1");
3180 } catch (ArgumentOutOfRangeException ex) {
3181 // Specified argument was out of the range of valid values
3182 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3183 Assert.IsNull (ex.InnerException, "#A3");
3184 Assert.IsNotNull (ex.Message, "#A4");
3185 Assert.AreEqual ("size", ex.ParamName, "#A5");
3190 // size > buffer length
3191 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3194 s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666,
3196 Assert.Fail ("#B1");
3197 } catch (ArgumentOutOfRangeException ex) {
3198 // Specified argument was out of the range of valid values
3199 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3200 Assert.IsNull (ex.InnerException, "#B3");
3201 Assert.IsNotNull (ex.Message, "#B4");
3202 Assert.AreEqual ("size", ex.ParamName, "#B5");
3208 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3209 public void ReceiveFrom3_Socket_Closed ()
3211 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3215 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3217 s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
3220 } catch (ObjectDisposedException ex) {
3221 // Cannot access a disposed object
3222 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3223 Assert.IsNull (ex.InnerException, "#3");
3224 Assert.IsNotNull (ex.Message, "#4");
3225 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3229 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3230 public void ReceiveFrom4_Buffer_Null ()
3232 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3234 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3237 s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
3240 } catch (ArgumentNullException ex) {
3241 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3242 Assert.IsNull (ex.InnerException, "#3");
3243 Assert.IsNotNull (ex.Message, "#4");
3244 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3248 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3249 public void ReceiveFrom4_Offset_OutOfRange ()
3252 byte [] buffer = new byte [5];
3253 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3256 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3259 s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666,
3261 Assert.Fail ("#A1");
3262 } catch (ArgumentOutOfRangeException ex) {
3263 // Specified argument was out of the range of valid values
3264 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3265 Assert.IsNull (ex.InnerException, "#A3");
3266 Assert.IsNotNull (ex.Message, "#A4");
3267 Assert.AreEqual ("offset", ex.ParamName, "#A5");
3272 // offset > buffer length
3273 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3276 s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666,
3278 Assert.Fail ("#B1");
3279 } catch (ArgumentOutOfRangeException ex) {
3280 // Specified argument was out of the range of valid values
3281 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3282 Assert.IsNull (ex.InnerException, "#B3");
3283 Assert.IsNotNull (ex.Message, "#B4");
3284 Assert.AreEqual ("offset", ex.ParamName, "#B5");
3290 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint)
3291 public void ReceiveFrom4_RemoteEP_Null ()
3293 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3295 byte [] buffer = new byte [5];
3296 EndPoint remoteEP = null;
3299 s.ReceiveFrom (buffer, 0, buffer.Length, (SocketFlags) 666, ref remoteEP);
3301 } catch (ArgumentNullException ex) {
3302 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3303 Assert.IsNull (ex.InnerException, "#3");
3304 Assert.IsNotNull (ex.Message, "#4");
3305 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3311 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3312 public void ReceiveFrom4_Size_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, 0, -1, (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 ("size", ex.ParamName, "#A5");
3335 // size > buffer length
3336 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3339 s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (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 ("size", ex.ParamName, "#B5");
3352 // offset + size > buffer length
3353 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3356 s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP);
3357 Assert.Fail ("#C1");
3358 } catch (ArgumentOutOfRangeException ex) {
3359 // Specified argument was out of the range of valid values
3360 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
3361 Assert.IsNull (ex.InnerException, "#C3");
3362 Assert.IsNotNull (ex.Message, "#C4");
3363 Assert.AreEqual ("size", ex.ParamName, "#C5");
3369 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
3370 public void ReceiveFrom4_Socket_Closed ()
3372 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3376 byte [] buffer = new byte [5];
3377 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3379 s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
3382 } catch (ObjectDisposedException ex) {
3383 // Cannot access a disposed object
3384 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3385 Assert.IsNull (ex.InnerException, "#3");
3386 Assert.IsNotNull (ex.Message, "#4");
3387 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3392 public void ReceiveRemoteClosed ()
3394 var port = NetworkHelpers.FindFreePort ();
3395 Socket sock = new Socket (AddressFamily.InterNetwork,
3398 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
3402 Thread client_thread = new Thread (() => RRCClientThread (port));
3403 client_thread.Start ();
3405 Socket client = sock.Accept ();
3406 NetworkStream stream = new NetworkStream (client);
3407 stream.WriteByte (0x00);
3408 stream.WriteByte (0x00);
3412 RRCReady.WaitOne (1000, false);
3413 Assert.IsTrue (RRCLastRead);
3417 // Test case for bug #471580
3419 public void UdpDoubleBind ()
3421 using (Socket s = new Socket (AddressFamily.InterNetwork,
3422 SocketType.Dgram, ProtocolType.Udp))
3423 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3424 SocketType.Dgram, ProtocolType.Udp)) {
3425 var supportsReuseAddress = true;
3427 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3428 } catch (SocketException e) {
3429 // Exception is thrown when ReuseAddress is not supported
3430 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3431 "Expected SocketError.OperationNotSupported");
3432 supportsReuseAddress = false;
3435 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3438 if (supportsReuseAddress)
3439 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3442 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3443 if (!supportsReuseAddress)
3444 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3445 } catch (SocketException e) {
3450 // Test case for bug #31557
3452 public void TcpDoubleBind ()
3454 using (Socket s = new Socket (AddressFamily.InterNetwork,
3455 SocketType.Stream, ProtocolType.Tcp))
3456 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3457 SocketType.Stream, ProtocolType.Tcp)) {
3458 var supportsReuseAddress = true;
3460 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3461 } catch (SocketException e) {
3462 // Exception is thrown when ReuseAddress is not supported
3463 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3464 "Expected SocketError.OperationNotSupported");
3465 supportsReuseAddress = false;
3468 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3472 if (supportsReuseAddress)
3473 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3476 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3478 if (!supportsReuseAddress)
3479 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3480 } catch (SocketException e) {
3486 [Category ("NotOnMac")]
3487 public void ConnectedProperty ()
3489 TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3492 Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3493 client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
3494 Socket server = listener.AcceptSocket ();
3497 server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null));
3500 server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null));
3503 Assert.IsTrue (!client.Connected);
3504 Assert.IsTrue (!server.Connected);
3512 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
3513 public void GetSocketOption1_Socket_Closed ()
3515 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3518 s.GetSocketOption (0, 0);
3520 } catch (ObjectDisposedException ex) {
3521 // Cannot access a disposed object
3522 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3523 Assert.IsNull (ex.InnerException, "#3");
3524 Assert.IsNotNull (ex.Message, "#4");
3525 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3529 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3530 public void GetSocketOption2_OptionValue_Null ()
3532 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3534 s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3537 } catch (SocketException ex) {
3538 // The system detected an invalid pointer address in attempting
3539 // to use a pointer argument in a call
3540 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3541 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3542 Assert.IsNull (ex.InnerException, "#4");
3543 Assert.IsNotNull (ex.Message, "#5");
3544 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3545 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3549 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3550 public void GetSocketOption2_Socket_Closed ()
3552 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3555 s.GetSocketOption (0, 0, (byte []) null);
3557 } catch (ObjectDisposedException ex) {
3558 // Cannot access a disposed object
3559 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3560 Assert.IsNull (ex.InnerException, "#3");
3561 Assert.IsNotNull (ex.Message, "#4");
3562 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3566 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3567 public void GetSocketOption3_Socket_Closed ()
3569 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3572 s.GetSocketOption (0, 0, 0);
3574 } catch (ObjectDisposedException ex) {
3575 // Cannot access a disposed object
3576 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3577 Assert.IsNull (ex.InnerException, "#3");
3578 Assert.IsNotNull (ex.Message, "#4");
3579 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3583 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3584 public void SetSocketOption1_DontLinger ()
3586 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3587 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3588 new byte [] { 0x00 });
3589 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3590 new byte [] { 0x01 });
3594 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3595 public void SetSocketOption1_DontLinger_Null ()
3597 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3599 s.SetSocketOption (SocketOptionLevel.Socket,
3600 SocketOptionName.DontLinger, (byte []) null);
3602 } catch (SocketException ex) {
3603 // The system detected an invalid pointer address in attempting
3604 // to use a pointer argument in a call
3605 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3606 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3607 Assert.IsNull (ex.InnerException, "#4");
3608 Assert.IsNotNull (ex.Message, "#5");
3609 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3610 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3615 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3616 public void SetSocketOption1_Linger_Null ()
3618 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3620 s.SetSocketOption (SocketOptionLevel.Socket,
3621 SocketOptionName.DontLinger, (byte []) null);
3623 } catch (SocketException ex) {
3624 // The system detected an invalid pointer address in attempting
3625 // to use a pointer argument in a call
3626 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3627 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3628 Assert.IsNull (ex.InnerException, "#4");
3629 Assert.IsNotNull (ex.Message, "#5");
3630 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3631 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3636 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3637 public void SetSocketOption1_Socket_Close ()
3639 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3642 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3643 new byte [] { 0x00 });
3645 } catch (ObjectDisposedException ex) {
3646 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3647 Assert.IsNull (ex.InnerException, "#3");
3648 Assert.IsNotNull (ex.Message, "#4");
3649 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3653 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3654 public void SetSocketOption2_DontLinger ()
3656 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3657 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3658 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
3662 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3663 [Category ("NotWorking")]
3664 public void SetSocketOption2_Linger ()
3666 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3667 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
3668 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
3672 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3673 public void SetSocketOption2_Socket_Closed ()
3675 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3678 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3680 } catch (ObjectDisposedException ex) {
3681 // Cannot access a disposed object
3682 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3683 Assert.IsNull (ex.InnerException, "#3");
3684 Assert.IsNotNull (ex.Message, "#4");
3685 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3689 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3690 public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
3692 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3694 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3695 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3697 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3698 new IPv6MulticastOption (mcast_addr));
3700 } catch (ArgumentException ex) {
3701 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3702 Assert.IsNull (ex.InnerException, "#3");
3703 Assert.IsNotNull (ex.Message, "#4");
3704 // The specified value is not a valid 'MulticastOption'
3705 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3706 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3711 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3712 public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
3714 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3716 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3717 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3718 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3719 new MulticastOption (mcast_addr));
3723 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3724 [Category ("NotWorking")]
3725 public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
3727 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3729 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3731 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3732 new MulticastOption (mcast_addr));
3734 } catch (SocketException ex) {
3735 // An invalid argument was supplied
3736 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3737 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3738 Assert.IsNull (ex.InnerException, "#4");
3739 Assert.IsNotNull (ex.Message, "#5");
3740 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3741 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3747 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3748 public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
3750 if (!Socket.OSSupportsIPv6)
3751 Assert.Ignore ("IPv6 not enabled.");
3753 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3755 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3756 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3757 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3758 new IPv6MulticastOption (mcast_addr));
3762 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3763 public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
3765 if (!Socket.OSSupportsIPv6)
3766 Assert.Ignore ("IPv6 not enabled.");
3768 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3770 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3771 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3773 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3774 new MulticastOption (mcast_addr));
3776 } catch (ArgumentException ex) {
3777 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3778 Assert.IsNull (ex.InnerException, "#3");
3779 Assert.IsNotNull (ex.Message, "#4");
3780 // The specified value is not a valid 'IPv6MulticastOption'
3781 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
3782 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3787 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3788 [Category ("NotWorking")]
3789 public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
3791 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3793 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
3795 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3796 new IPv6MulticastOption (mcast_addr));
3798 } catch (SocketException ex) {
3799 // An invalid argument was supplied
3800 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3801 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3802 Assert.IsNull (ex.InnerException, "#4");
3803 Assert.IsNotNull (ex.Message, "#5");
3804 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3805 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3811 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3812 public void SetSocketOption3_DontLinger_Boolean ()
3814 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3816 s.SetSocketOption (SocketOptionLevel.Socket,
3817 SocketOptionName.DontLinger, (object) false);
3819 } catch (ArgumentException ex) {
3820 // The specified value is not valid
3821 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3822 Assert.IsNull (ex.InnerException, "#3");
3823 Assert.IsNotNull (ex.Message, "#4");
3824 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3829 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3830 public void SetSocketOption3_DontLinger_Int32 ()
3832 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3834 s.SetSocketOption (SocketOptionLevel.Socket,
3835 SocketOptionName.DontLinger, (object) 0);
3837 } catch (ArgumentException ex) {
3838 // The specified value is not valid
3839 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3840 Assert.IsNull (ex.InnerException, "#3");
3841 Assert.IsNotNull (ex.Message, "#4");
3842 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3847 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3848 public void SetSocketOption3_DontLinger_LingerOption ()
3850 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3852 s.SetSocketOption (SocketOptionLevel.Socket,
3853 SocketOptionName.DontLinger, new LingerOption (true, 1000));
3855 } catch (ArgumentException ex) {
3856 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3857 Assert.IsNull (ex.InnerException, "#3");
3858 // The specified value is not valid
3859 Assert.IsNotNull (ex.Message, "#4");
3860 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3865 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3866 public void SetSocketOption3_Linger_Boolean ()
3868 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3870 s.SetSocketOption (SocketOptionLevel.Socket,
3871 SocketOptionName.Linger, (object) false);
3873 } catch (ArgumentException ex) {
3874 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3875 Assert.IsNull (ex.InnerException, "#3");
3876 // The specified value is not valid
3877 Assert.IsNotNull (ex.Message, "#4");
3878 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3883 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3884 public void SetSocketOption3_Linger_Int32 ()
3886 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3888 s.SetSocketOption (SocketOptionLevel.Socket,
3889 SocketOptionName.Linger, (object) 0);
3891 } catch (ArgumentException ex) {
3892 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3893 Assert.IsNull (ex.InnerException, "#3");
3894 // The specified value is not valid
3895 Assert.IsNotNull (ex.Message, "#4");
3896 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3901 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3902 public void SetSocketOption3_Linger_LingerOption ()
3904 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3905 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3906 new LingerOption (false, 0));
3907 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3908 new LingerOption (true, 0));
3909 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3910 new LingerOption (false, 1000));
3911 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3912 new LingerOption (true, 1000));
3916 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3917 public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
3919 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3921 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3922 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3923 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3924 new MulticastOption (mcast_addr));
3926 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3927 new IPv6MulticastOption (mcast_addr));
3929 } catch (ArgumentException ex) {
3930 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3931 Assert.IsNull (ex.InnerException, "#3");
3932 Assert.IsNotNull (ex.Message, "#4");
3933 // The specified value is not a valid 'MulticastOption'
3934 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3935 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3940 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3941 public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
3943 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3945 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3946 MulticastOption option = new MulticastOption (mcast_addr);
3948 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3949 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3951 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3956 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3957 [Category ("NotWorking")]
3958 public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
3960 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3962 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3964 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3965 new MulticastOption (mcast_addr));
3967 } catch (SocketException ex) {
3968 // An invalid argument was supplied
3969 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3970 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3971 Assert.IsNull (ex.InnerException, "#4");
3972 Assert.IsNotNull (ex.Message, "#5");
3973 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3974 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3980 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3981 public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
3983 if (!Socket.OSSupportsIPv6)
3984 Assert.Ignore ("IPv6 not enabled.");
3986 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3987 IPv6MulticastOption option = new IPv6MulticastOption (
3988 IPAddress.Parse ("ff02::1"));
3990 s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
3991 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3993 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
3998 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3999 public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
4001 if (!Socket.OSSupportsIPv6)
4002 Assert.Ignore ("IPv6 not enabled.");
4004 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4006 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4007 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
4008 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4009 new IPv6MulticastOption (mcast_addr));
4011 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4012 new MulticastOption (mcast_addr));
4014 } catch (ArgumentException ex) {
4015 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
4016 Assert.IsNull (ex.InnerException, "#3");
4017 Assert.IsNotNull (ex.Message, "#4");
4018 // The specified value is not a valid 'IPv6MulticastOption'
4019 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
4020 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4025 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4026 [Category ("NotWorking")]
4027 public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
4029 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4031 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
4033 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4034 new IPv6MulticastOption (mcast_addr));
4036 } catch (SocketException ex) {
4037 // An invalid argument was supplied
4038 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4039 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4040 Assert.IsNull (ex.InnerException, "#4");
4041 Assert.IsNotNull (ex.Message, "#5");
4042 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4043 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4049 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4050 public void SetSocketOption3_OptionValue_Null ()
4052 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4054 s.SetSocketOption (SocketOptionLevel.Socket,
4055 SocketOptionName.Linger, (object) null);
4057 } catch (ArgumentNullException ex) {
4058 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
4059 Assert.IsNull (ex.InnerException, "#3");
4060 Assert.IsNotNull (ex.Message, "#4");
4061 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
4066 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4067 public void SetSocketOption3_Socket_Closed ()
4069 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4072 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
4073 new LingerOption (false, 0));
4075 } catch (ObjectDisposedException ex) {
4076 // Cannot access a disposed object
4077 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
4078 Assert.IsNull (ex.InnerException, "#3");
4079 Assert.IsNotNull (ex.Message, "#4");
4080 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
4085 public void SetSocketOption_MulticastInterfaceIndex_Any ()
4087 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4089 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4091 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4092 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4097 public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
4099 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4101 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4103 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4104 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4109 public void SetSocketOption_MulticastInterfaceIndex_Invalid ()
4111 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4113 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4117 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4124 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4133 public void Shutdown_NoConnect ()
4135 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4136 s.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
4139 s.Shutdown (SocketShutdown.Both);
4141 } catch (SocketException exc) {
4142 Assert.AreEqual (10057, exc.ErrorCode, "#2");
4149 [ExpectedException (typeof (NullReferenceException))]
4150 public void ReceiveAsync_Null ()
4152 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4153 s.ReceiveAsync (null);
4158 [ExpectedException (typeof (NullReferenceException))]
4159 public void ReceiveAsync_Default ()
4161 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4162 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4163 s.ReceiveAsync (saea);
4169 [ExpectedException (typeof (NullReferenceException))]
4170 public void ReceiveAsync_NullBuffer ()
4172 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4173 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4174 saea.SetBuffer (null, 0, 0);
4175 s.ReceiveAsync (null);
4180 [ExpectedException (typeof (ObjectDisposedException))]
4181 public void ReceiveAsync_ClosedSocket ()
4183 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4185 s.ReceiveAsync (null);
4189 [ExpectedException (typeof (NullReferenceException))]
4190 public void SendAsync_Null ()
4192 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4198 [ExpectedException (typeof (NullReferenceException))]
4199 public void SendAsync_Default ()
4201 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4202 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4209 [ExpectedException (typeof (NullReferenceException))]
4210 public void SendAsync_NullBuffer ()
4212 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4213 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4214 saea.SetBuffer (null, 0, 0);
4220 [ExpectedException (typeof (ObjectDisposedException))]
4221 public void SendAsync_ClosedSocket ()
4223 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4229 public void SendAsyncFile ()
4231 Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4233 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
4234 serverSocket.Listen (1);
4236 var mReceived = new ManualResetEvent (false);
4238 serverSocket.BeginAccept (AsyncCall => {
4239 byte[] bytes = new byte [1024];
4241 Socket listener = (Socket)AsyncCall.AsyncState;
4242 Socket client = listener.EndAccept (AsyncCall);
4243 client.Receive (bytes, bytes.Length, 0);
4248 Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4249 clientSocket.Connect (serverSocket.LocalEndPoint);
4250 clientSocket.NoDelay = true;
4252 // Initialize buffer used to create testing file
4253 var buffer = new byte [1024];
4254 for (int i = 0; i < 1024; ++i)
4255 buffer [i] = (byte) (i % 256);
4257 string temp = Path.GetTempFileName ();
4259 // Testing file creation
4260 using (StreamWriter sw = new StreamWriter (temp)) {
4264 var mSent = new ManualResetEvent (false);
4266 // Async Send File to server
4267 clientSocket.BeginSendFile(temp, (ar) => {
4268 Socket client = (Socket) ar.AsyncState;
4269 client.EndSendFile (ar);
4273 if (!mSent.WaitOne (1500))
4274 throw new TimeoutException ();
4275 if (!mReceived.WaitOne (1500))
4276 throw new TimeoutException ();
4278 if (File.Exists (temp))
4281 clientSocket.Close ();
4282 serverSocket.Close ();
4287 public void ConnectToIPV4EndPointUsingDualModelSocket () {
4288 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4289 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4290 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4295 var ep = server.LocalEndPoint as IPEndPoint;
4297 client.Connect (ep);
4298 client.Disconnect (true);
4300 client.Connect (IPAddress.Loopback, ep.Port);
4301 client.Disconnect (true);
4303 client.Connect (new [] {IPAddress.Loopback}, ep.Port);
4304 client.Disconnect (true);
4309 public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
4310 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4311 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4312 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4317 var ep = server.LocalEndPoint as IPEndPoint;
4319 BCCalledBack.Reset ();
4320 var ar1 = client.BeginConnect (ep, BCCallback, client);
4321 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
4322 client.Disconnect (true);
4324 BCCalledBack.Reset ();
4325 var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
4326 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4327 client.Disconnect (true);
4329 BCCalledBack.Reset ();
4330 var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
4331 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4332 client.Disconnect (true);
4337 public void UdpMulticasTimeToLive ()
4339 /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
4341 using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4342 IPEndPoint end_point = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
4343 socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
4344 socket.Bind (end_point);
4345 socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);