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) {
577 Assert.Fail ("DontFragment #2");
584 public void EnableBroadcastDefaultTcp ()
586 Socket sock = new Socket (AddressFamily.InterNetwork,
591 bool value = sock.EnableBroadcast;
592 Assert.Fail ("EnableBroadcastDefaultTcp #1");
593 } catch (SocketException ex) {
594 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
596 Assert.Fail ("EnableBroadcastDefaultTcp #2");
603 public void EnableBroadcastDefaultUdp ()
605 Socket sock = new Socket (AddressFamily.InterNetwork,
609 Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp");
615 public void EnableBroadcastChangeTcp ()
617 Socket sock = new Socket (AddressFamily.InterNetwork,
622 sock.EnableBroadcast = true;
623 Assert.Fail ("EnableBroadcastChangeTcp #1");
624 } catch (SocketException ex) {
625 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
627 Assert.Fail ("EnableBroadcastChangeTcp #2");
634 public void EnableBroadcastChangeUdp ()
636 Socket sock = new Socket (AddressFamily.InterNetwork,
640 sock.EnableBroadcast = true;
642 Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp");
648 [ExpectedException (typeof(ObjectDisposedException))]
649 public void EnableBroadcastClosed ()
651 Socket sock = new Socket (AddressFamily.InterNetwork,
657 bool val = sock.EnableBroadcast;
660 /* Can't test the default for ExclusiveAddressUse as
661 * it's different on different versions and service
665 [Category ("NotWorking")] // Not supported on Linux
666 public void ExclusiveAddressUseUnbound ()
668 Socket sock = new Socket (AddressFamily.InterNetwork,
672 sock.ExclusiveAddressUse = true;
674 Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound");
680 [ExpectedException (typeof(InvalidOperationException))]
681 [Category ("NotWorking")] // Not supported on Linux
682 public void ExclusiveAddressUseBound ()
684 Socket sock = new Socket (AddressFamily.InterNetwork,
688 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
689 sock.ExclusiveAddressUse = true;
694 [ExpectedException (typeof(ObjectDisposedException))]
695 public void ExclusiveAddressUseClosed ()
697 Socket sock = new Socket (AddressFamily.InterNetwork,
703 bool val = sock.ExclusiveAddressUse;
707 public void IsBoundTcp ()
709 Socket sock = new Socket (AddressFamily.InterNetwork,
712 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
715 Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1");
718 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2");
722 Socket sock2 = new Socket (AddressFamily.InterNetwork,
726 Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3");
729 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4");
732 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5");
735 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6");
739 public void IsBoundUdp ()
741 Socket sock = new Socket (AddressFamily.InterNetwork,
744 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
747 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1");
750 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2");
753 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3");
756 sock = new Socket (AddressFamily.InterNetwork,
760 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4");
763 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5");
766 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6");
770 /* Should not throw an exception */
771 public void IsBoundClosed ()
773 Socket sock = new Socket (AddressFamily.InterNetwork,
779 bool val = sock.IsBound;
782 /* Nothing much to test for LingerState */
785 public void MulticastLoopbackDefaultTcp ()
787 Socket sock = new Socket (AddressFamily.InterNetwork,
792 bool value = sock.MulticastLoopback;
793 Assert.Fail ("MulticastLoopbackDefaultTcp #1");
794 } catch (SocketException ex) {
795 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
797 Assert.Fail ("MulticastLoopbackDefaultTcp #2");
804 public void MulticastLoopbackChangeTcp ()
806 Socket sock = new Socket (AddressFamily.InterNetwork,
811 sock.MulticastLoopback = false;
812 Assert.Fail ("MulticastLoopbackChangeTcp #1");
813 } catch (SocketException ex) {
814 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
816 Assert.Fail ("MulticastLoopbackChangeTcp #2");
823 public void MulticastLoopbackDefaultUdp ()
825 Socket sock = new Socket (AddressFamily.InterNetwork,
829 Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp");
835 public void MulticastLoopbackChangeUdp ()
837 Socket sock = new Socket (AddressFamily.InterNetwork,
841 sock.MulticastLoopback = false;
843 Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp");
849 [ExpectedException (typeof(ObjectDisposedException))]
850 public void MulticastLoopbackClosed ()
852 Socket sock = new Socket (AddressFamily.InterNetwork,
858 bool val = sock.MulticastLoopback;
861 /* OSSupportsIPv6 depends on the environment */
864 [Category("NotWorking")] // We have different defaults for perf reasons
865 public void ReceiveBufferSizeDefault ()
867 Socket sock = new Socket (AddressFamily.InterNetwork,
871 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault");
877 [Category("NotWorking")] // We have different defaults for perf reasons
878 public void ReceiveBufferSizeDefaultUdp ()
880 Socket sock = new Socket (AddressFamily.InterNetwork,
884 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp");
890 public void ReceiveBufferSizeChange ()
892 Socket sock = new Socket (AddressFamily.InterNetwork,
896 sock.ReceiveBufferSize = 16384;
898 Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange");
904 [Category("NotWorking")] // We cannot totally remove buffers (minimum is set to 256
905 public void BuffersCheck_None ()
907 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
908 int original = s.ReceiveBufferSize;
909 s.ReceiveBufferSize = 0;
910 Assert.AreEqual (0, s.ReceiveBufferSize, "ReceiveBufferSize " + original.ToString ());
912 original = s.SendBufferSize;
913 s.SendBufferSize = 0;
914 Assert.AreEqual (0, s.SendBufferSize, "SendBufferSize " + original.ToString ());
919 [ExpectedException (typeof(ObjectDisposedException))]
920 public void ReceiveBufferSizeClosed ()
922 Socket sock = new Socket (AddressFamily.InterNetwork,
928 int val = sock.ReceiveBufferSize;
932 [Category("NotWorking")] // We have different defaults for perf reasons
933 public void SendBufferSizeDefault ()
935 Socket sock = new Socket (AddressFamily.InterNetwork,
939 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault");
945 [Category("NotWorking")] // We have different defaults for perf reasons
946 public void SendBufferSizeDefaultUdp ()
948 Socket sock = new Socket (AddressFamily.InterNetwork,
952 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp");
958 public void SendBufferSizeChange ()
960 Socket sock = new Socket (AddressFamily.InterNetwork,
964 sock.SendBufferSize = 16384;
966 Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange");
972 [ExpectedException (typeof(ObjectDisposedException))]
973 public void SendBufferSizeClosed ()
975 Socket sock = new Socket (AddressFamily.InterNetwork,
981 int val = sock.SendBufferSize;
984 /* No test for TTL default as it's platform dependent */
986 public void TtlChange ()
988 Socket sock = new Socket (AddressFamily.InterNetwork,
994 Assert.AreEqual (255, sock.Ttl, "TtlChange");
1000 [Category ("NotOnMac")] // Mac doesn't throw when overflowing the ttl
1001 public void TtlChangeOverflow ()
1003 Socket sock = new Socket (AddressFamily.InterNetwork,
1009 Assert.Fail ("TtlChangeOverflow #1");
1010 } catch (SocketException ex) {
1011 Assert.AreEqual (10022, ex.ErrorCode,
1012 "TtlChangeOverflow #2");
1014 Assert.Fail ("TtlChangeoverflow #3");
1020 /* Apparently you can set TTL=0 on the ms runtime!!
1023 Assert.Fail ("TtlChangeOverflow #4");
1024 } catch (SocketException ex) {
1025 Assert.AreEqual (10022, ex.ErrorCode,
1026 "TtlChangeOverflow #5");
1028 Assert.Fail ("TtlChangeOverflow #6");
1035 [ExpectedException (typeof(ObjectDisposedException))]
1036 public void TtlClosed ()
1038 Socket sock = new Socket (AddressFamily.InterNetwork,
1048 public void UseOnlyOverlappedIODefault ()
1050 Socket sock = new Socket (AddressFamily.InterNetwork,
1054 Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault");
1060 // We need this because the Linux kernel in certain configurations
1061 // will end up rounding up the values passed on to the kernel
1062 // for socket send/receive timeouts.
1064 int Approximate (int target, int value)
1068 if (value > target-10 && value < target+10)
1074 public void UseOnlyOverlappedIOChange ()
1076 Socket sock = new Socket (AddressFamily.InterNetwork,
1080 sock.UseOnlyOverlappedIO = true;
1082 Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange");
1088 /* Should not throw an exception */
1089 public void UseOnlyOverlappedIOClosed ()
1091 Socket sock = new Socket (AddressFamily.InterNetwork,
1097 bool val = sock.UseOnlyOverlappedIO;
1101 public void SendTimeoutDefault ()
1103 Socket sock = new Socket (AddressFamily.InterNetwork,
1107 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault");
1113 public void SendTimeoutChange ()
1115 Socket sock = new Socket (AddressFamily.InterNetwork,
1119 /* Should be rounded up to 500, according to
1120 * the MSDN docs, but the MS runtime doesn't
1122 sock.SendTimeout = 50;
1123 Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1");
1125 sock.SendTimeout = 2000;
1126 Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2");
1128 sock.SendTimeout = 0;
1129 Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3");
1131 /* Should be the same as setting 0 */
1132 sock.SendTimeout = -1;
1133 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4");
1135 sock.SendTimeout = 65536;
1136 Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5");
1139 sock.SendTimeout = -2;
1140 Assert.Fail ("SendTimeoutChange #8");
1141 } catch (ArgumentOutOfRangeException) {
1143 Assert.Fail ("SendTimeoutChange #9");
1150 [ExpectedException (typeof(ObjectDisposedException))]
1151 public void SendTimeoutClosed ()
1153 Socket sock = new Socket (AddressFamily.InterNetwork,
1159 int val = sock.SendTimeout;
1163 public void ReceiveTimeoutDefault ()
1165 Socket sock = new Socket (AddressFamily.InterNetwork,
1169 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault");
1175 public void ReceiveTimeoutChange ()
1177 Socket sock = new Socket (AddressFamily.InterNetwork,
1181 sock.ReceiveTimeout = 50;
1182 Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1");
1184 sock.ReceiveTimeout = 2000;
1185 Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2");
1187 sock.ReceiveTimeout = 0;
1188 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3");
1190 /* Should be the same as setting 0 */
1191 sock.ReceiveTimeout = -1;
1192 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4");
1194 sock.ReceiveTimeout = 65536;
1195 Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5");
1198 sock.ReceiveTimeout = -2;
1199 Assert.Fail ("ReceiveTimeoutChange #8");
1200 } catch (ArgumentOutOfRangeException) {
1202 Assert.Fail ("ReceiveTimeoutChange #9");
1209 [ExpectedException (typeof(ObjectDisposedException))]
1210 public void ReceiveTimeoutClosed ()
1212 Socket sock = new Socket (AddressFamily.InterNetwork,
1218 int val = sock.ReceiveTimeout;
1222 public void NoDelayDefaultTcp ()
1224 Socket sock = new Socket (AddressFamily.InterNetwork,
1228 Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
1234 public void NoDelayChangeTcp ()
1236 Socket sock = new Socket (AddressFamily.InterNetwork,
1240 sock.NoDelay = true;
1242 Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp");
1248 public void NoDelayDefaultUdp ()
1250 Socket sock = new Socket (AddressFamily.InterNetwork,
1255 bool val = sock.NoDelay;
1256 Assert.Fail ("NoDelayDefaultUdp #1");
1257 } catch (SocketException ex) {
1258 Assert.AreEqual (10042, ex.ErrorCode,
1259 "NoDelayDefaultUdp #2");
1261 Assert.Fail ("NoDelayDefaultUdp #3");
1268 public void NoDelayChangeUdp ()
1270 Socket sock = new Socket (AddressFamily.InterNetwork,
1275 sock.NoDelay = true;
1276 Assert.Fail ("NoDelayChangeUdp #1");
1277 } catch (SocketException ex) {
1278 Assert.AreEqual (10042, ex.ErrorCode,
1279 "NoDelayChangeUdp #2");
1281 Assert.Fail ("NoDelayChangeUdp #3");
1288 [ExpectedException (typeof(ObjectDisposedException))]
1289 public void NoDelayClosed ()
1291 Socket sock = new Socket (AddressFamily.InterNetwork,
1297 bool val = sock.NoDelay;
1300 static bool BAAccepted = false;
1301 static Socket BASocket = null;
1302 static ManualResetEvent BACalledBack = new ManualResetEvent (false);
1304 private static void BACallback (IAsyncResult asyncResult)
1306 Socket sock = (Socket)asyncResult.AsyncState;
1308 BASocket = sock.EndAccept (asyncResult);
1311 BACalledBack.Set ();
1315 [ExpectedException (typeof(InvalidOperationException))]
1316 public void BeginAcceptNotBound ()
1318 Socket sock = new Socket (AddressFamily.InterNetwork,
1322 sock.BeginAccept (BACallback, sock);
1328 [ExpectedException (typeof(InvalidOperationException))]
1329 public void BeginAcceptNotListening ()
1331 Socket sock = new Socket (AddressFamily.InterNetwork,
1335 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
1337 sock.BeginAccept (BACallback, sock);
1343 public void BeginAccept ()
1345 Socket sock = new Socket (AddressFamily.InterNetwork,
1348 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1349 NetworkHelpers.FindFreePort ());
1354 BACalledBack.Reset ();
1356 sock.BeginAccept (BACallback, sock);
1358 Socket conn = new Socket (AddressFamily.InterNetwork,
1364 if (BACalledBack.WaitOne (2000, false) == false) {
1365 Assert.Fail ("BeginAccept wait timed out");
1368 Assert.AreEqual (true, BAAccepted, "BeginAccept #1");
1369 Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2");
1370 Assert.AreEqual (false, sock.Connected, "BeginAccept #3");
1371 Assert.AreEqual (true, conn.Connected, "BeginAccept #4");
1379 [ExpectedException (typeof(ObjectDisposedException))]
1380 public void BeginAcceptClosed ()
1382 Socket sock = new Socket (AddressFamily.InterNetwork,
1388 sock.BeginAccept (BACallback, sock);
1391 static bool BADAccepted = false;
1392 static Socket BADSocket = null;
1393 static byte[] BADBytes;
1394 static int BADByteCount;
1395 static ManualResetEvent BADCalledBack = new ManualResetEvent (false);
1397 private static void BADCallback (IAsyncResult asyncResult)
1399 Socket sock = (Socket)asyncResult.AsyncState;
1401 BADSocket = sock.EndAccept (out BADBytes,
1406 BADCalledBack.Set ();
1410 public void BeginAcceptData ()
1412 Socket sock = new Socket (AddressFamily.InterNetwork,
1415 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1416 NetworkHelpers.FindFreePort ());
1421 BADCalledBack.Reset ();
1423 sock.BeginAccept (256, BADCallback, sock);
1425 Socket conn = new Socket (AddressFamily.InterNetwork,
1428 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1431 conn.Send (send_bytes);
1433 if (BADCalledBack.WaitOne (2000, false) == false) {
1434 Assert.Fail ("BeginAcceptData wait timed out");
1437 Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1");
1438 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2");
1439 Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3");
1440 Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4");
1441 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5");
1443 /* The MS runtime gives the returned data in a
1444 * much bigger array. TODO: investigate
1445 * whether it the size correlates to the first
1446 * parameter in BeginAccept()
1448 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1449 "BeginAcceptData #6");
1451 for(int i = 0; i < send_bytes.Length; i++) {
1452 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ());
1461 [ExpectedException (typeof(ObjectDisposedException))]
1462 public void BeginAcceptDataClosed ()
1464 Socket sock = new Socket (AddressFamily.InterNetwork,
1470 sock.BeginAccept (256, BADCallback, sock);
1474 public void BeginAcceptSocketUdp ()
1476 Socket sock = new Socket (AddressFamily.InterNetwork,
1479 Socket acc = new Socket (AddressFamily.InterNetwork,
1483 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1484 NetworkHelpers.FindFreePort ());
1490 sock.BeginAccept (acc, 256, BADCallback, sock);
1491 Assert.Fail ("BeginAcceptSocketUdp #1");
1492 } catch (SocketException ex) {
1493 Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
1495 Assert.Fail ("BeginAcceptSocketUdp #3");
1503 public void BeginAcceptSocketBound ()
1505 Socket sock = new Socket (AddressFamily.InterNetwork,
1508 Socket acc = new Socket (AddressFamily.InterNetwork,
1512 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
1513 NetworkHelpers.FindFreePort ());
1515 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
1516 NetworkHelpers.FindFreePort ());
1524 sock.BeginAccept (acc, 256, BADCallback, sock);
1525 Assert.Fail ("BeginAcceptSocketBound #1");
1526 } catch (InvalidOperationException) {
1528 Assert.Fail ("BeginAcceptSocketBound #2");
1536 public void BeginAcceptSocket ()
1538 Socket sock = new Socket (AddressFamily.InterNetwork,
1541 Socket acc = new Socket (AddressFamily.InterNetwork,
1545 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1546 NetworkHelpers.FindFreePort ());
1551 BADCalledBack.Reset ();
1553 sock.BeginAccept (acc, 256, BADCallback, sock);
1555 Socket conn = new Socket (AddressFamily.InterNetwork,
1558 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1561 conn.Send (send_bytes);
1563 if (BADCalledBack.WaitOne (2000, false) == false) {
1564 Assert.Fail ("BeginAcceptSocket wait timed out");
1567 Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1");
1568 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2");
1569 Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3");
1570 Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4");
1571 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5");
1572 Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6");
1573 Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7");
1574 Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8");
1575 Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9");
1577 /* The MS runtime gives the returned data in a
1578 * much bigger array. TODO: investigate
1579 * whether it the size correlates to the first
1580 * parameter in BeginAccept()
1582 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1583 "BeginAcceptSocket #10");
1585 for(int i = 0; i < send_bytes.Length; i++) {
1586 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ());
1596 public void BeginAcceptSocketClosed ()
1598 Socket sock = new Socket (AddressFamily.InterNetwork,
1601 Socket acc = new Socket (AddressFamily.InterNetwork,
1608 sock.BeginAccept (acc, 256, BADCallback, null);
1609 Assert.Fail ("BeginAcceptSocketClosed #1");
1610 } catch (ObjectDisposedException) {
1612 Assert.Fail ("BeginAcceptSocketClosed #2");
1619 public void BeginAcceptSocketAccClosed ()
1621 Socket sock = new Socket (AddressFamily.InterNetwork,
1624 Socket acc = new Socket (AddressFamily.InterNetwork,
1627 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1628 NetworkHelpers.FindFreePort ());
1635 BADCalledBack.Reset ();
1638 sock.BeginAccept (acc, 256, BADCallback, null);
1639 Assert.Fail ("BeginAcceptSocketAccClosed #1");
1640 } catch (ObjectDisposedException) {
1642 Assert.Fail ("BeginAcceptSocketAccClosed #2");
1648 static bool BCConnected = false;
1649 static ManualResetEvent BCCalledBack = new ManualResetEvent (false);
1651 private static void BCCallback (IAsyncResult asyncResult)
1653 Socket sock = (Socket)asyncResult.AsyncState;
1656 sock.EndConnect (asyncResult);
1657 } catch (Exception e) {
1658 Console.WriteLine ("BCCallback exception:");
1659 Console.WriteLine (e);
1666 BCCalledBack.Set ();
1670 public void BeginConnectAddressPort ()
1672 Socket sock = new Socket (AddressFamily.InterNetwork,
1675 Socket listen = new Socket (AddressFamily.InterNetwork,
1678 IPAddress ip = IPAddress.Loopback;
1679 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1684 BCCalledBack.Reset ();
1686 BCConnected = false;
1688 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1690 if (BCCalledBack.WaitOne (2000, false) == false) {
1691 Assert.Fail ("BeginConnectAddressPort wait timed out");
1694 Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1");
1701 public void BeginConnectAddressPortNull ()
1703 Socket sock = new Socket (AddressFamily.InterNetwork,
1706 IPAddress ip = null;
1709 sock.BeginConnect (ip, 1244, BCCallback,
1711 Assert.Fail ("BeginConnectAddressPortNull #1");
1712 } catch (ArgumentNullException) {
1714 Assert.Fail ("BeginConnectAddressPortNull #2");
1721 public void BeginConnectAddressPortListen ()
1723 Socket sock = new Socket (AddressFamily.InterNetwork,
1726 IPAddress ip = IPAddress.Loopback;
1727 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1733 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1734 Assert.Fail ("BeginConnectAddressPortListen #1");
1735 } catch (InvalidOperationException) {
1737 Assert.Fail ("BeginConnectAddressPortListen #2");
1744 [ExpectedException (typeof(ObjectDisposedException))]
1745 public void BeginConnectAddressPortClosed ()
1747 Socket sock = new Socket (AddressFamily.InterNetwork,
1750 IPAddress ip = IPAddress.Loopback;
1754 sock.BeginConnect (ip, 1244, BCCallback, sock);
1758 [Category ("NotOnMac")]
1760 * This is not a Mono bug.
1762 * By default, only 127.0.0.1 is enabled and you must explicitly
1763 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
1765 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
1766 * until I add that alias.
1769 public void BeginConnectMultiple ()
1771 Socket sock = new Socket (AddressFamily.InterNetwork,
1774 Socket listen = new Socket (AddressFamily.InterNetwork,
1777 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1778 NetworkHelpers.FindFreePort ());
1779 IPAddress[] ips = new IPAddress[4];
1781 ips[0] = IPAddress.Parse ("127.0.0.4");
1782 ips[1] = IPAddress.Parse ("127.0.0.3");
1783 ips[2] = IPAddress.Parse ("127.0.0.2");
1784 ips[3] = IPAddress.Parse ("127.0.0.1");
1789 BCCalledBack.Reset ();
1791 BCConnected = false;
1793 sock.BeginConnect (ips, ep.Port, BCCallback, sock);
1795 /* Longer wait here, because the ms runtime
1796 * takes a lot longer to not connect
1799 if (BCCalledBack.WaitOne (30000, false) == false) {
1800 Assert.Fail ("BeginConnectMultiple wait failed");
1804 Assert.IsTrue (BCCalledBack.WaitOne (30000), "#0");
1806 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
1807 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
1808 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1810 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2");
1817 public void BeginConnectMultiple2 ()
1819 Socket sock = new Socket (AddressFamily.InterNetwork,
1822 Socket listen = new Socket (AddressFamily.InterNetwork,
1826 // Need at least two addresses.
1827 var ips = Dns.GetHostAddresses (string.Empty);
1829 Assert.Ignore ("This test needs at least two IP addresses.");
1831 var allIps = new IPAddress [ips.Length + 1];
1832 allIps [0] = IPAddress.Loopback;
1833 ips.CopyTo (allIps, 1);
1836 * Only bind to the loopback interface, so all the non-loopback
1837 * IP addresses will fail. BeginConnect()/EndConnect() should
1838 * succeed it it can connect to at least one of the requested
1841 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
1846 BCCalledBack.Reset ();
1848 BCConnected = false;
1850 sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
1852 /* Longer wait here, because the ms runtime
1853 * takes a lot longer to not connect
1855 if (BCCalledBack.WaitOne (10000, false) == false) {
1856 Assert.Fail ("BeginConnectMultiple2 wait failed");
1859 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple2 #1");
1860 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple2 #2");
1861 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1863 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple2 #2");
1871 public void BeginConnectMultipleNull ()
1873 Socket sock = new Socket (AddressFamily.InterNetwork,
1876 IPAddress[] ips = null;
1879 sock.BeginConnect (ips, 1246, BCCallback,
1881 Assert.Fail ("BeginConnectMultipleNull #1");
1882 } catch (ArgumentNullException) {
1884 Assert.Fail ("BeginConnectMultipleNull #2");
1891 public void BeginConnectMultipleListen ()
1893 Socket sock = new Socket (AddressFamily.InterNetwork,
1896 IPAddress[] ips = new IPAddress[4];
1897 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1898 NetworkHelpers.FindFreePort ());
1900 ips[0] = IPAddress.Parse ("127.0.0.4");
1901 ips[1] = IPAddress.Parse ("127.0.0.3");
1902 ips[2] = IPAddress.Parse ("127.0.0.2");
1903 ips[3] = IPAddress.Parse ("127.0.0.1");
1909 sock.BeginConnect (ips, ep.Port, BCCallback,
1911 Assert.Fail ("BeginConnectMultipleListen #1");
1912 } catch (InvalidOperationException) {
1914 Assert.Fail ("BeginConnectMultipleListen #2");
1921 [ExpectedException (typeof(ObjectDisposedException))]
1922 public void BeginConnectMultipleClosed ()
1924 Socket sock = new Socket (AddressFamily.InterNetwork,
1927 IPAddress[] ips = new IPAddress[4];
1929 ips[0] = IPAddress.Parse ("127.0.0.4");
1930 ips[1] = IPAddress.Parse ("127.0.0.3");
1931 ips[2] = IPAddress.Parse ("127.0.0.2");
1932 ips[3] = IPAddress.Parse ("127.0.0.1");
1936 sock.BeginConnect (ips, 1247, BCCallback, sock);
1940 public void BeginConnectHostPortNull ()
1942 Socket sock = new Socket (AddressFamily.InterNetwork,
1947 sock.BeginConnect ((string)null, 0,
1949 Assert.Fail ("BeginConnectHostPort #1");
1950 } catch (ArgumentNullException) {
1952 Assert.Fail ("BeginConnectHostPort #2");
1959 public void BeginConnectHostPortListen ()
1961 Socket sock = new Socket (AddressFamily.InterNetwork,
1964 IPAddress ip = IPAddress.Loopback;
1965 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1971 sock.BeginConnect ("localhost", ep.Port,
1973 Assert.Fail ("BeginConnectHostPortListen #1");
1974 } catch (InvalidOperationException) {
1976 Assert.Fail ("BeginConnectHostPortListen #2");
1983 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
1984 public void BeginConnectHostPortNotIP ()
1986 Socket sock = new Socket (AddressFamily.NetBios,
1987 SocketType.Seqpacket,
1988 ProtocolType.Unspecified);
1991 sock.BeginConnect ("localhost", 0, BCCallback,
1993 Assert.Fail ("BeginConnectHostPortNotIP #1");
1994 } catch (NotSupportedException) {
1996 Assert.Fail ("BeginConnectHostPortNotIP #2");
2003 [ExpectedException (typeof(ObjectDisposedException))]
2004 public void BeginConnectHostPortClosed ()
2006 Socket sock = new Socket (AddressFamily.InterNetwork,
2012 sock.BeginConnect ("localhost", 0, BCCallback, sock);
2015 static bool BDDisconnected = false;
2016 static ManualResetEvent BDCalledBack = new ManualResetEvent (false);
2018 private static void BDCallback (IAsyncResult asyncResult)
2020 Socket sock = (Socket)asyncResult.AsyncState;
2022 sock.EndDisconnect (asyncResult);
2023 BDDisconnected = true;
2025 BDCalledBack.Set ();
2029 [Category ("NotDotNet")] // "Needs XP or later"
2030 public void BeginDisconnect ()
2032 Socket sock = new Socket (AddressFamily.InterNetwork,
2035 Socket listen = new Socket (AddressFamily.InterNetwork,
2038 IPAddress ip = IPAddress.Loopback;
2039 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2044 sock.Connect (ip, ep.Port);
2046 Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
2048 sock.Shutdown (SocketShutdown.Both);
2050 BDCalledBack.Reset ();
2051 BDDisconnected = false;
2053 sock.BeginDisconnect (false, BDCallback, sock);
2055 if (BDCalledBack.WaitOne (2000, false) == false) {
2056 Assert.Fail ("BeginDisconnect wait timed out");
2059 Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2");
2060 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2067 public void BeginReceiveSocketError ()
2072 public void BeginReceiveGeneric ()
2077 public void BeginReceiveGenericSocketError ()
2081 private static void BSCallback (IAsyncResult asyncResult)
2083 Socket sock = (Socket)asyncResult.AsyncState;
2085 sock.EndSend (asyncResult);
2089 public void BeginSendNotConnected ()
2091 Socket sock = new Socket (AddressFamily.InterNetwork,
2095 byte[] send_bytes = new byte[] {10, 11, 12, 13};
2098 sock.BeginSend (send_bytes, 0,
2100 SocketFlags.None, BSCallback,
2102 Assert.Fail ("BeginSendNotConnected #1");
2103 } catch (SocketException ex) {
2104 Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
2106 Assert.Fail ("BeginSendNotConnected #3");
2113 public void BeginSendSocketError ()
2118 public void BeginSendGeneric ()
2123 public void BeginSendGenericSocketError ()
2128 public void BindTwice ()
2130 Socket sock = new Socket (AddressFamily.InterNetwork,
2133 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
2134 NetworkHelpers.FindFreePort ());
2135 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
2136 NetworkHelpers.FindFreePort ());
2142 Assert.Fail ("BindTwice #1");
2143 } catch (SocketException ex) {
2144 Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
2146 Assert.Fail ("BindTwice #3");
2153 public void Close ()
2155 Socket sock = new Socket (AddressFamily.InterNetwork,
2158 Socket listen = new Socket (AddressFamily.InterNetwork,
2161 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2162 NetworkHelpers.FindFreePort ());
2169 Assert.AreEqual (true, sock.Connected, "Close #1");
2173 Thread.Sleep (3000);
2175 Assert.AreEqual (false, sock.Connected, "Close #2");
2181 public void ConnectAddressPort ()
2183 Socket sock = new Socket (AddressFamily.InterNetwork,
2186 Socket listen = new Socket (AddressFamily.InterNetwork,
2189 IPAddress ip = IPAddress.Loopback;
2190 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2195 sock.Connect (ip, ep.Port);
2197 Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
2204 public void ConnectAddressPortNull ()
2206 Socket sock = new Socket (AddressFamily.InterNetwork,
2209 IPAddress ip = null;
2212 sock.Connect (ip, 1249);
2213 Assert.Fail ("ConnectAddressPortNull #1");
2214 } catch (ArgumentNullException) {
2216 Assert.Fail ("ConnectAddressPortNull #2");
2223 public void ConnectAddressPortListen ()
2225 Socket sock = new Socket (AddressFamily.InterNetwork,
2228 IPAddress ip = IPAddress.Loopback;
2229 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2235 sock.Connect (ip, ep.Port);
2236 Assert.Fail ("ConnectAddressPortListen #1");
2237 } catch (InvalidOperationException) {
2239 Assert.Fail ("ConnectAddressPortListen #2");
2246 [ExpectedException (typeof(ObjectDisposedException))]
2247 public void ConnectAddressPortClosed ()
2249 Socket sock = new Socket (AddressFamily.InterNetwork,
2252 IPAddress ip = IPAddress.Loopback;
2256 sock.Connect (ip, 1250);
2260 [Category ("NotOnMac")] // MacOSX trashes the fd after the failed connect attempt to 127.0.0.4
2262 * This is not a Mono bug.
2264 * By default, only 127.0.0.1 is enabled and you must explicitly
2265 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
2267 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
2268 * until I add that alias.
2270 * However, after doing so, Mac OS treats these as separate addresses, ie. attempting
2271 * to connect to 127.0.0.4 yields a connection refused.
2273 * When using Connect(), the .NET runtime also throws an exception if connecting to
2274 * any of the IP addresses fails. This is different with BeginConnect()/EndConnect()
2275 * which succeeds when it can connect to at least one of the addresses.
2278 public void ConnectMultiple ()
2280 Socket sock = new Socket (AddressFamily.InterNetwork,
2283 Socket listen = new Socket (AddressFamily.InterNetwork,
2286 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2287 NetworkHelpers.FindFreePort ());
2288 IPAddress[] ips = new IPAddress[4];
2290 ips[0] = IPAddress.Parse ("127.0.0.4");
2291 ips[1] = IPAddress.Parse ("127.0.0.3");
2292 ips[2] = IPAddress.Parse ("127.0.0.2");
2293 ips[3] = IPAddress.Parse ("127.0.0.1");
2298 sock.Connect (ips, ep.Port);
2300 Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
2301 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
2302 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2304 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2");
2311 public void ConnectMultiple2 ()
2313 Socket sock = new Socket (AddressFamily.InterNetwork,
2316 Socket listen = new Socket (AddressFamily.InterNetwork,
2320 // Need at least two addresses.
2321 var ips = Dns.GetHostAddresses (string.Empty);
2323 Assert.Ignore ("This test needs at least two IP addresses.");
2325 var allIps = new IPAddress [ips.Length + 1];
2326 allIps [0] = IPAddress.Loopback;
2327 ips.CopyTo (allIps, 1);
2330 * Bind to IPAddress.Any; Connect() will fail unless it can
2331 * connect to all the addresses in allIps.
2333 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
2338 sock.Connect (allIps, ep.Port);
2340 Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
2341 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
2342 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2344 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple2 #3");
2351 public void ConnectMultipleNull ()
2353 Socket sock = new Socket (AddressFamily.InterNetwork,
2356 IPAddress[] ips = null;
2359 sock.Connect (ips, 1251);
2360 Assert.Fail ("ConnectMultipleNull #1");
2361 } catch (ArgumentNullException) {
2363 Assert.Fail ("ConnectMultipleNull #2");
2370 public void ConnectMultipleListen ()
2372 Socket sock = new Socket (AddressFamily.InterNetwork,
2375 IPAddress[] ips = new IPAddress[4];
2376 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2377 NetworkHelpers.FindFreePort ());
2379 ips[0] = IPAddress.Parse ("127.0.0.4");
2380 ips[1] = IPAddress.Parse ("127.0.0.3");
2381 ips[2] = IPAddress.Parse ("127.0.0.2");
2382 ips[3] = IPAddress.Parse ("127.0.0.1");
2388 sock.Connect (ips, ep.Port);
2389 Assert.Fail ("ConnectMultipleListen #1");
2390 } catch (InvalidOperationException) {
2392 Assert.Fail ("ConnectMultipleListen #2");
2399 [ExpectedException (typeof(ObjectDisposedException))]
2400 public void ConnectMultipleClosed ()
2402 Socket sock = new Socket (AddressFamily.InterNetwork,
2405 IPAddress[] ips = new IPAddress[4];
2407 ips[0] = IPAddress.Parse ("127.0.0.4");
2408 ips[1] = IPAddress.Parse ("127.0.0.3");
2409 ips[2] = IPAddress.Parse ("127.0.0.2");
2410 ips[3] = IPAddress.Parse ("127.0.0.1");
2414 sock.Connect (ips, 1252);
2418 public void ConnectHostPortNull ()
2420 Socket sock = new Socket (AddressFamily.InterNetwork,
2425 sock.Connect ((string)null, 0);
2426 Assert.Fail ("ConnectHostPort #1");
2427 } catch (ArgumentNullException) {
2429 Assert.Fail ("ConnectHostPort #2");
2436 public void ConnectHostPortListen ()
2438 Socket sock = new Socket (AddressFamily.InterNetwork,
2441 IPAddress ip = IPAddress.Loopback;
2442 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2448 sock.Connect ("localhost", ep.Port);
2449 Assert.Fail ("ConnectHostPortListen #1");
2450 } catch (InvalidOperationException) {
2452 Assert.Fail ("ConnectHostPortListen #2");
2459 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
2460 public void ConnectHostPortNotIP ()
2462 Socket sock = new Socket (AddressFamily.NetBios,
2463 SocketType.Seqpacket,
2464 ProtocolType.Unspecified);
2467 sock.Connect ("localhost", 0);
2468 Assert.Fail ("ConnectHostPortNotIP #1");
2469 } catch (NotSupportedException) {
2471 Assert.Fail ("ConnectHostPortNotIP #2");
2478 [ExpectedException (typeof(ObjectDisposedException))]
2479 public void ConnectHostPortClosed ()
2481 Socket sock = new Socket (AddressFamily.InterNetwork,
2487 sock.Connect ("localhost", 0);
2491 [Category ("NotDotNet")] // "Needs XP or later"
2492 public void Disconnect ()
2494 Socket sock = new Socket (AddressFamily.InterNetwork,
2497 Socket listen = new Socket (AddressFamily.InterNetwork,
2500 IPAddress ip = IPAddress.Loopback;
2501 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2506 sock.Connect (ip, ep.Port);
2508 Assert.AreEqual (true, sock.Connected, "Disconnect #1");
2510 sock.Shutdown (SocketShutdown.Both);
2512 sock.Disconnect (false);
2514 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2521 public void DuplicateAndClose ()
2526 public void IOControl ()
2531 public void TestDefaultsDualMode ()
2533 using (var socket = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)){
2534 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2537 using (var socket = new Socket (SocketType.Stream, ProtocolType.Tcp)){
2538 Assert.AreEqual (AddressFamily.InterNetworkV6, socket.AddressFamily, "When creating sockets of type stream/tcp, the address family should be InterNetworkV6");
2539 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2541 socket.DualMode = false;
2543 Assert.IsFalse (socket.DualMode, "Setting of DualSocket should turn DualSockets off");
2549 public void ReceiveGeneric ()
2553 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2555 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2556 listensock.Bind (endpoint);
2557 listensock.Listen(1);
2559 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2560 sendsock.Connect(endpoint);
2562 Socket clientsock = listensock.Accept();
2564 byte[] sendbuf = new byte[256];
2566 for(i = 0; i < 256; i++) {
2567 sendbuf[i] = (byte)i;
2569 for (i = 4; i < 6; i++) {
2570 Assert.AreEqual (sendbuf[i], (byte)i,
2571 "#1/" + i.ToString());
2575 sendsock.Send (sendbuf, 0, 256, SocketFlags.None,
2579 byte[] recvbuf = new byte[256];
2580 List<ArraySegment<byte>> recvbuflist = new List<ArraySegment<byte>>(2);
2581 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 4, 2));
2582 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 20, 230));
2584 clientsock.Receive (recvbuflist);
2586 /* recvbuf should now hold the first 2 bytes
2587 * of sendbuf from pos 4, and the next 230
2588 * bytes of sendbuf from pos 20
2591 for (i = 0; i < 2; i++) {
2592 Assert.AreEqual (sendbuf[i], recvbuf[i + 4],
2593 "#2/" + i.ToString());
2595 for (i = 2; i < 232; i++) {
2596 Assert.AreEqual (sendbuf[i], recvbuf[i + 18],
2597 "#2/" + i.ToString());
2601 clientsock.Close ();
2602 listensock.Close ();
2606 public void SendGeneric ()
2610 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2612 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2613 listensock.Bind (endpoint);
2614 listensock.Listen(1);
2616 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2617 sendsock.Connect(endpoint);
2619 Socket clientsock = listensock.Accept();
2621 byte[] sendbuf = new byte[256];
2622 List<ArraySegment<byte>> sendbuflist = new List<ArraySegment<byte>>(2);
2624 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 4, 2));
2625 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 20, 230));
2627 for(i = 0; i < 256; i++) {
2628 sendbuf[i] = (byte)i;
2630 for (i = 4; i < 6; i++) {
2631 Assert.AreEqual (sendbuf[i], (byte)i,
2632 "#1/" + i.ToString());
2636 sendsock.Send (sendbuflist, SocketFlags.None, out err);
2639 byte[] recvbuf = new byte[256];
2641 clientsock.Receive (recvbuf);
2643 /* The first 2 bytes of recvbuf should now
2644 * hold 2 bytes of sendbuf from pos 4, and the
2645 * next 230 bytes of recvbuf should be sendbuf
2649 for (i = 0; i < 2; i++) {
2650 Assert.AreEqual (recvbuf[i], sendbuf[i + 4],
2651 "#2/" + i.ToString());
2653 for (i = 2; i < 232; i++) {
2654 Assert.AreEqual (recvbuf[i], sendbuf[i + 18],
2655 "#2/" + i.ToString());
2659 clientsock.Close ();
2660 listensock.Close ();
2664 public void ListenNotBound ()
2666 Socket sock = new Socket (AddressFamily.InterNetwork,
2672 Assert.Fail ("ListenNotBound #1");
2673 } catch (SocketException ex) {
2674 Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
2676 Assert.Fail ("ListenNotBound #3");
2682 static Socket CWRSocket;
2683 static bool CWRReceiving = true;
2684 static ManualResetEvent CWRReady = new ManualResetEvent (false);
2686 private static void CWRReceiveThread ()
2688 byte[] buf = new byte[256];
2691 CWRSocket.Receive (buf);
2692 } catch (SocketException) {
2693 CWRReceiving = false;
2700 public void CloseWhileReceiving ()
2702 CWRSocket = new Socket (AddressFamily.InterNetwork,
2705 CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
2706 NetworkHelpers.FindFreePort ()));
2708 Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
2710 recv_thread.Start ();
2711 Thread.Sleep (250); /* Wait for the thread to be already receiving */
2714 if (CWRReady.WaitOne (1000, false) == false) {
2715 Assert.Fail ("CloseWhileReceiving wait timed out");
2718 Assert.IsFalse (CWRReceiving);
2721 static bool RRCLastRead = false;
2722 static ManualResetEvent RRCReady = new ManualResetEvent (false);
2724 private static void RRCClientThread (int port)
2726 byte[] bytes = new byte[8];
2729 Socket sock = new Socket (AddressFamily.InterNetwork,
2732 sock.Connect (new IPEndPoint (IPAddress.Loopback,
2735 NetworkStream stream = new NetworkStream (sock);
2737 readbyte = stream.ReadByte ();
2738 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1");
2740 stream.Read (bytes, 0, 0);
2742 readbyte = stream.ReadByte ();
2743 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2");
2745 stream.Read (bytes, 0, 0);
2747 readbyte = stream.ReadByte ();
2748 Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3");
2756 [Test] // Receive (Byte [])
2757 public void Receive1_Buffer_Null ()
2759 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2763 s.Receive ((byte []) null);
2765 } catch (ArgumentNullException ex) {
2766 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2767 Assert.IsNull (ex.InnerException, "#3");
2768 Assert.IsNotNull (ex.Message, "#4");
2769 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2775 [Test] // Receive (Byte [])
2776 public void Receive1_Socket_Closed ()
2778 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2783 s.Receive ((byte []) null);
2785 } catch (ObjectDisposedException ex) {
2786 // Cannot access a disposed object
2787 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2788 Assert.IsNull (ex.InnerException, "#3");
2789 Assert.IsNotNull (ex.Message, "#4");
2790 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2794 [Test] // Receive (Byte [], SocketFlags)
2795 public void Receive2_Buffer_Null ()
2797 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2801 s.Receive ((byte []) null, (SocketFlags) 666);
2803 } catch (ArgumentNullException ex) {
2804 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2805 Assert.IsNull (ex.InnerException, "#3");
2806 Assert.IsNotNull (ex.Message, "#4");
2807 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2813 [Test] // Receive (Byte [], SocketFlags)
2814 public void Receive2_Socket_Closed ()
2816 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2821 s.Receive ((byte []) null, (SocketFlags) 666);
2823 } catch (ObjectDisposedException ex) {
2824 // Cannot access a disposed object
2825 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2826 Assert.IsNull (ex.InnerException, "#3");
2827 Assert.IsNotNull (ex.Message, "#4");
2828 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2832 [Test] // Receive (Byte [], Int32, SocketFlags)
2833 public void Receive3_Buffer_Null ()
2835 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2839 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2841 } catch (ArgumentNullException ex) {
2842 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2843 Assert.IsNull (ex.InnerException, "#3");
2844 Assert.IsNotNull (ex.Message, "#4");
2845 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2851 [Test] // Receive (Byte [], Int32, SocketFlags)
2852 public void Receive3_Socket_Closed ()
2854 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2859 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2861 } catch (ObjectDisposedException ex) {
2862 // Cannot access a disposed object
2863 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2864 Assert.IsNull (ex.InnerException, "#3");
2865 Assert.IsNotNull (ex.Message, "#4");
2866 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2870 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2871 public void Receive4_Buffer_Null ()
2873 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2877 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2879 } catch (ArgumentNullException ex) {
2880 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2881 Assert.IsNull (ex.InnerException, "#3");
2882 Assert.IsNotNull (ex.Message, "#4");
2883 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2889 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2890 public void Receive4_Socket_Closed ()
2892 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2897 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2899 } catch (ObjectDisposedException ex) {
2900 // Cannot access a disposed object
2901 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2902 Assert.IsNull (ex.InnerException, "#3");
2903 Assert.IsNotNull (ex.Message, "#4");
2904 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2908 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2909 public void Receive5_Buffer_Null ()
2911 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2916 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2918 } catch (ArgumentNullException ex) {
2919 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2920 Assert.IsNull (ex.InnerException, "#3");
2921 Assert.IsNotNull (ex.Message, "#4");
2922 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2928 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2929 public void Receive5_Socket_Closed ()
2931 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2937 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2939 } catch (ObjectDisposedException ex) {
2940 // Cannot access a disposed object
2941 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2942 Assert.IsNull (ex.InnerException, "#3");
2943 Assert.IsNotNull (ex.Message, "#4");
2944 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2948 [Test] // Receive (IList<ArraySegment<Byte>>)
2949 public void Receive6_Buffers_Null ()
2951 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2955 s.Receive ((IList<ArraySegment<byte>>) null);
2957 } catch (ArgumentNullException ex) {
2958 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2959 Assert.IsNull (ex.InnerException, "#3");
2960 Assert.IsNotNull (ex.Message, "#4");
2961 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2967 [Test] // Receive (IList<ArraySegment<Byte>>)
2968 public void Receive6_Socket_Closed ()
2970 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2975 s.Receive ((IList<ArraySegment<byte>>) null);
2977 } catch (ObjectDisposedException ex) {
2978 // Cannot access a disposed object
2979 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2980 Assert.IsNull (ex.InnerException, "#3");
2981 Assert.IsNotNull (ex.Message, "#4");
2982 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2986 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2987 public void Receive7_Buffers_Null ()
2989 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2993 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2995 } catch (ArgumentNullException ex) {
2996 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2997 Assert.IsNull (ex.InnerException, "#3");
2998 Assert.IsNotNull (ex.Message, "#4");
2999 Assert.AreEqual ("buffers", ex.ParamName, "#5");
3005 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
3006 public void Receive7_Socket_Closed ()
3008 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3013 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
3015 } catch (ObjectDisposedException ex) {
3016 // Cannot access a disposed object
3017 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3018 Assert.IsNull (ex.InnerException, "#3");
3019 Assert.IsNotNull (ex.Message, "#4");
3020 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3024 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
3025 public void Receive8_Buffers_Null ()
3027 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3032 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
3035 } catch (ArgumentNullException ex) {
3036 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3037 Assert.IsNull (ex.InnerException, "#3");
3038 Assert.IsNotNull (ex.Message, "#4");
3039 Assert.AreEqual ("buffers", ex.ParamName, "#5");
3045 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
3046 public void Receive8_Socket_Closed ()
3048 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3054 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
3057 } catch (ObjectDisposedException ex) {
3058 // Cannot access a disposed object
3059 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3060 Assert.IsNull (ex.InnerException, "#3");
3061 Assert.IsNotNull (ex.Message, "#4");
3062 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3068 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3069 public void ReceiveFrom1_Buffer_Null ()
3071 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3074 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3076 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3078 } catch (ArgumentNullException ex) {
3079 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3080 Assert.IsNull (ex.InnerException, "#3");
3081 Assert.IsNotNull (ex.Message, "#4");
3082 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3088 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3089 public void ReceiveFrom1_RemoteEP_Null ()
3091 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3094 byte [] buffer = new byte [0];
3095 EndPoint remoteEP = null;
3097 s.ReceiveFrom (buffer, ref remoteEP);
3099 } catch (ArgumentNullException ex) {
3100 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3101 Assert.IsNull (ex.InnerException, "#3");
3102 Assert.IsNotNull (ex.Message, "#4");
3103 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3109 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3110 public void ReceiveFrom1_Socket_Closed ()
3112 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3116 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3118 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3120 } catch (ObjectDisposedException ex) {
3121 // Cannot access a disposed object
3122 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3123 Assert.IsNull (ex.InnerException, "#3");
3124 Assert.IsNotNull (ex.Message, "#4");
3125 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3129 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3130 public void ReceiveFrom2_Buffer_Null ()
3132 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3135 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3137 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3139 } catch (ArgumentNullException ex) {
3140 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3141 Assert.IsNull (ex.InnerException, "#3");
3142 Assert.IsNotNull (ex.Message, "#4");
3143 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3149 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3150 public void ReceiveFrom2_RemoteEP_Null ()
3152 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3155 byte [] buffer = new byte [5];
3156 EndPoint remoteEP = null;
3158 s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP);
3160 } catch (ArgumentNullException ex) {
3161 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3162 Assert.IsNull (ex.InnerException, "#3");
3163 Assert.IsNotNull (ex.Message, "#4");
3164 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3170 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3171 public void ReceiveFrom2_Socket_Closed ()
3173 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3177 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3179 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3181 } catch (ObjectDisposedException ex) {
3182 // Cannot access a disposed object
3183 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3184 Assert.IsNull (ex.InnerException, "#3");
3185 Assert.IsNotNull (ex.Message, "#4");
3186 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3190 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3191 public void ReceiveFrom3_Buffer_Null ()
3193 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3196 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3198 s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
3201 } catch (ArgumentNullException ex) {
3202 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3203 Assert.IsNull (ex.InnerException, "#3");
3204 Assert.IsNotNull (ex.Message, "#4");
3205 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3211 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3212 public void ReceiveFrom3_RemoteEP_Null ()
3214 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3217 byte [] buffer = new byte [5];
3218 EndPoint remoteEP = null;
3220 s.ReceiveFrom (buffer, buffer.Length, (SocketFlags) 666, ref remoteEP);
3222 } catch (ArgumentNullException ex) {
3223 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3224 Assert.IsNull (ex.InnerException, "#3");
3225 Assert.IsNotNull (ex.Message, "#4");
3226 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3232 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3233 public void ReceiveFrom3_Size_OutOfRange ()
3236 byte [] buffer = new byte [5];
3237 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3240 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3243 s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP);
3244 Assert.Fail ("#A1");
3245 } catch (ArgumentOutOfRangeException ex) {
3246 // Specified argument was out of the range of valid values
3247 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3248 Assert.IsNull (ex.InnerException, "#A3");
3249 Assert.IsNotNull (ex.Message, "#A4");
3250 Assert.AreEqual ("size", ex.ParamName, "#A5");
3255 // size > buffer length
3256 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3259 s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666,
3261 Assert.Fail ("#B1");
3262 } catch (ArgumentOutOfRangeException ex) {
3263 // Specified argument was out of the range of valid values
3264 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3265 Assert.IsNull (ex.InnerException, "#B3");
3266 Assert.IsNotNull (ex.Message, "#B4");
3267 Assert.AreEqual ("size", ex.ParamName, "#B5");
3273 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3274 public void ReceiveFrom3_Socket_Closed ()
3276 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3280 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3282 s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
3285 } catch (ObjectDisposedException ex) {
3286 // Cannot access a disposed object
3287 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3288 Assert.IsNull (ex.InnerException, "#3");
3289 Assert.IsNotNull (ex.Message, "#4");
3290 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3294 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3295 public void ReceiveFrom4_Buffer_Null ()
3297 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3299 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3302 s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
3305 } catch (ArgumentNullException ex) {
3306 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3307 Assert.IsNull (ex.InnerException, "#3");
3308 Assert.IsNotNull (ex.Message, "#4");
3309 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3313 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3314 public void ReceiveFrom4_Offset_OutOfRange ()
3317 byte [] buffer = new byte [5];
3318 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3321 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3324 s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666,
3326 Assert.Fail ("#A1");
3327 } catch (ArgumentOutOfRangeException ex) {
3328 // Specified argument was out of the range of valid values
3329 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3330 Assert.IsNull (ex.InnerException, "#A3");
3331 Assert.IsNotNull (ex.Message, "#A4");
3332 Assert.AreEqual ("offset", ex.ParamName, "#A5");
3337 // offset > buffer length
3338 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3341 s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666,
3343 Assert.Fail ("#B1");
3344 } catch (ArgumentOutOfRangeException ex) {
3345 // Specified argument was out of the range of valid values
3346 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3347 Assert.IsNull (ex.InnerException, "#B3");
3348 Assert.IsNotNull (ex.Message, "#B4");
3349 Assert.AreEqual ("offset", ex.ParamName, "#B5");
3355 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint)
3356 public void ReceiveFrom4_RemoteEP_Null ()
3358 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3360 byte [] buffer = new byte [5];
3361 EndPoint remoteEP = null;
3364 s.ReceiveFrom (buffer, 0, buffer.Length, (SocketFlags) 666, ref remoteEP);
3366 } catch (ArgumentNullException ex) {
3367 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3368 Assert.IsNull (ex.InnerException, "#3");
3369 Assert.IsNotNull (ex.Message, "#4");
3370 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3376 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3377 public void ReceiveFrom4_Size_OutOfRange ()
3380 byte [] buffer = new byte [5];
3381 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3384 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3387 s.ReceiveFrom (buffer, 0, -1, (SocketFlags) 666,
3389 Assert.Fail ("#A1");
3390 } catch (ArgumentOutOfRangeException ex) {
3391 // Specified argument was out of the range of valid values
3392 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3393 Assert.IsNull (ex.InnerException, "#A3");
3394 Assert.IsNotNull (ex.Message, "#A4");
3395 Assert.AreEqual ("size", ex.ParamName, "#A5");
3400 // size > buffer length
3401 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3404 s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (SocketFlags) 666,
3406 Assert.Fail ("#B1");
3407 } catch (ArgumentOutOfRangeException ex) {
3408 // Specified argument was out of the range of valid values
3409 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3410 Assert.IsNull (ex.InnerException, "#B3");
3411 Assert.IsNotNull (ex.Message, "#B4");
3412 Assert.AreEqual ("size", ex.ParamName, "#B5");
3417 // offset + size > buffer length
3418 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3421 s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP);
3422 Assert.Fail ("#C1");
3423 } catch (ArgumentOutOfRangeException ex) {
3424 // Specified argument was out of the range of valid values
3425 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
3426 Assert.IsNull (ex.InnerException, "#C3");
3427 Assert.IsNotNull (ex.Message, "#C4");
3428 Assert.AreEqual ("size", ex.ParamName, "#C5");
3434 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
3435 public void ReceiveFrom4_Socket_Closed ()
3437 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3441 byte [] buffer = new byte [5];
3442 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3444 s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
3447 } catch (ObjectDisposedException ex) {
3448 // Cannot access a disposed object
3449 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3450 Assert.IsNull (ex.InnerException, "#3");
3451 Assert.IsNotNull (ex.Message, "#4");
3452 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3457 public void ReceiveRemoteClosed ()
3459 var port = NetworkHelpers.FindFreePort ();
3460 Socket sock = new Socket (AddressFamily.InterNetwork,
3463 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
3467 Thread client_thread = new Thread (() => RRCClientThread (port));
3468 client_thread.Start ();
3470 Socket client = sock.Accept ();
3471 NetworkStream stream = new NetworkStream (client);
3472 stream.WriteByte (0x00);
3473 stream.WriteByte (0x00);
3477 RRCReady.WaitOne (1000, false);
3478 Assert.IsTrue (RRCLastRead);
3482 // Test case for bug #471580
3484 public void UdpDoubleBind ()
3486 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3487 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
3489 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3492 Socket ss = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3493 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
3495 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3497 // If we make it this far, we succeeded.
3504 // when the linker is enabled then reflection won't work and would throw an NRE
3505 // this is also always true for iOS - so we do not need to poke internals
3506 static bool SupportsPortReuse ()
3511 static bool? supportsPortReuse;
3512 static bool SupportsPortReuse ()
3514 if (supportsPortReuse.HasValue)
3515 return supportsPortReuse.Value;
3517 supportsPortReuse = (bool) typeof (Socket).GetMethod ("SupportsPortReuse",
3518 BindingFlags.Static | BindingFlags.NonPublic)
3519 .Invoke (null, new object [] {});
3520 return supportsPortReuse.Value;
3524 // Test case for bug #31557
3526 public void TcpDoubleBind ()
3528 using (Socket s = new Socket (AddressFamily.InterNetwork,
3529 SocketType.Stream, ProtocolType.Tcp))
3530 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3531 SocketType.Stream, ProtocolType.Tcp)) {
3532 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3533 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3537 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3539 Exception ex = null;
3541 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3543 } catch (SocketException e) {
3547 Assert.AreEqual (SupportsPortReuse (), ex == null);
3552 [Category ("NotOnMac")]
3553 public void ConnectedProperty ()
3555 TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3558 Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3559 client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
3560 Socket server = listener.AcceptSocket ();
3563 server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null));
3566 server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null));
3569 Assert.IsTrue (!client.Connected);
3570 Assert.IsTrue (!server.Connected);
3578 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
3579 public void GetSocketOption1_Socket_Closed ()
3581 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3584 s.GetSocketOption (0, 0);
3586 } catch (ObjectDisposedException ex) {
3587 // Cannot access a disposed object
3588 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3589 Assert.IsNull (ex.InnerException, "#3");
3590 Assert.IsNotNull (ex.Message, "#4");
3591 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3595 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3596 public void GetSocketOption2_OptionValue_Null ()
3598 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3600 s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3603 } catch (SocketException ex) {
3604 // The system detected an invalid pointer address in attempting
3605 // to use a pointer argument in a call
3606 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3607 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3608 Assert.IsNull (ex.InnerException, "#4");
3609 Assert.IsNotNull (ex.Message, "#5");
3610 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3611 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3615 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3616 public void GetSocketOption2_Socket_Closed ()
3618 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3621 s.GetSocketOption (0, 0, (byte []) null);
3623 } catch (ObjectDisposedException ex) {
3624 // Cannot access a disposed object
3625 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3626 Assert.IsNull (ex.InnerException, "#3");
3627 Assert.IsNotNull (ex.Message, "#4");
3628 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3632 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3633 public void GetSocketOption3_Socket_Closed ()
3635 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3638 s.GetSocketOption (0, 0, 0);
3640 } catch (ObjectDisposedException ex) {
3641 // Cannot access a disposed object
3642 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3643 Assert.IsNull (ex.InnerException, "#3");
3644 Assert.IsNotNull (ex.Message, "#4");
3645 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3649 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3650 public void SetSocketOption1_DontLinger ()
3652 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3653 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3654 new byte [] { 0x00 });
3655 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3656 new byte [] { 0x01 });
3660 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3661 public void SetSocketOption1_DontLinger_Null ()
3663 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3665 s.SetSocketOption (SocketOptionLevel.Socket,
3666 SocketOptionName.DontLinger, (byte []) null);
3668 } catch (SocketException ex) {
3669 // The system detected an invalid pointer address in attempting
3670 // to use a pointer argument in a call
3671 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3672 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3673 Assert.IsNull (ex.InnerException, "#4");
3674 Assert.IsNotNull (ex.Message, "#5");
3675 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3676 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3681 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3682 public void SetSocketOption1_Linger_Null ()
3684 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3686 s.SetSocketOption (SocketOptionLevel.Socket,
3687 SocketOptionName.DontLinger, (byte []) null);
3689 } catch (SocketException ex) {
3690 // The system detected an invalid pointer address in attempting
3691 // to use a pointer argument in a call
3692 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3693 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3694 Assert.IsNull (ex.InnerException, "#4");
3695 Assert.IsNotNull (ex.Message, "#5");
3696 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3697 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3702 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3703 public void SetSocketOption1_Socket_Close ()
3705 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3708 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3709 new byte [] { 0x00 });
3711 } catch (ObjectDisposedException ex) {
3712 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3713 Assert.IsNull (ex.InnerException, "#3");
3714 Assert.IsNotNull (ex.Message, "#4");
3715 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3719 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3720 public void SetSocketOption2_DontLinger ()
3722 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3723 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3724 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
3728 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3729 [Category ("NotWorking")]
3730 public void SetSocketOption2_Linger ()
3732 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3733 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
3734 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
3738 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3739 public void SetSocketOption2_Socket_Closed ()
3741 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3744 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3746 } catch (ObjectDisposedException ex) {
3747 // Cannot access a disposed object
3748 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3749 Assert.IsNull (ex.InnerException, "#3");
3750 Assert.IsNotNull (ex.Message, "#4");
3751 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3755 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3756 public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
3758 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3760 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3761 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3763 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3764 new IPv6MulticastOption (mcast_addr));
3766 } catch (ArgumentException ex) {
3767 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3768 Assert.IsNull (ex.InnerException, "#3");
3769 Assert.IsNotNull (ex.Message, "#4");
3770 // The specified value is not a valid 'MulticastOption'
3771 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3772 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3777 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3778 public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
3780 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3782 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3783 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3784 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3785 new MulticastOption (mcast_addr));
3789 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3790 [Category ("NotWorking")]
3791 public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
3793 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3795 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3797 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3798 new MulticastOption (mcast_addr));
3800 } catch (SocketException ex) {
3801 // An invalid argument was supplied
3802 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3803 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3804 Assert.IsNull (ex.InnerException, "#4");
3805 Assert.IsNotNull (ex.Message, "#5");
3806 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3807 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3813 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3814 public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
3816 if (!Socket.OSSupportsIPv6)
3817 Assert.Ignore ("IPv6 not enabled.");
3819 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3821 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3822 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3823 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3824 new IPv6MulticastOption (mcast_addr));
3828 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3829 public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
3831 if (!Socket.OSSupportsIPv6)
3832 Assert.Ignore ("IPv6 not enabled.");
3834 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3836 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3837 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3839 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3840 new MulticastOption (mcast_addr));
3842 } catch (ArgumentException ex) {
3843 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3844 Assert.IsNull (ex.InnerException, "#3");
3845 Assert.IsNotNull (ex.Message, "#4");
3846 // The specified value is not a valid 'IPv6MulticastOption'
3847 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
3848 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3853 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3854 [Category ("NotWorking")]
3855 public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
3857 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3859 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
3861 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3862 new IPv6MulticastOption (mcast_addr));
3864 } catch (SocketException ex) {
3865 // An invalid argument was supplied
3866 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3867 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3868 Assert.IsNull (ex.InnerException, "#4");
3869 Assert.IsNotNull (ex.Message, "#5");
3870 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3871 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3877 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3878 public void SetSocketOption3_DontLinger_Boolean ()
3880 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3882 s.SetSocketOption (SocketOptionLevel.Socket,
3883 SocketOptionName.DontLinger, (object) false);
3885 } catch (ArgumentException ex) {
3886 // The specified value is not valid
3887 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3888 Assert.IsNull (ex.InnerException, "#3");
3889 Assert.IsNotNull (ex.Message, "#4");
3890 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3895 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3896 public void SetSocketOption3_DontLinger_Int32 ()
3898 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3900 s.SetSocketOption (SocketOptionLevel.Socket,
3901 SocketOptionName.DontLinger, (object) 0);
3903 } catch (ArgumentException ex) {
3904 // The specified value is not valid
3905 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3906 Assert.IsNull (ex.InnerException, "#3");
3907 Assert.IsNotNull (ex.Message, "#4");
3908 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3913 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3914 public void SetSocketOption3_DontLinger_LingerOption ()
3916 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3918 s.SetSocketOption (SocketOptionLevel.Socket,
3919 SocketOptionName.DontLinger, new LingerOption (true, 1000));
3921 } catch (ArgumentException ex) {
3922 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3923 Assert.IsNull (ex.InnerException, "#3");
3924 // The specified value is not valid
3925 Assert.IsNotNull (ex.Message, "#4");
3926 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3931 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3932 public void SetSocketOption3_Linger_Boolean ()
3934 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3936 s.SetSocketOption (SocketOptionLevel.Socket,
3937 SocketOptionName.Linger, (object) false);
3939 } catch (ArgumentException ex) {
3940 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3941 Assert.IsNull (ex.InnerException, "#3");
3942 // The specified value is not valid
3943 Assert.IsNotNull (ex.Message, "#4");
3944 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3949 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3950 public void SetSocketOption3_Linger_Int32 ()
3952 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3954 s.SetSocketOption (SocketOptionLevel.Socket,
3955 SocketOptionName.Linger, (object) 0);
3957 } catch (ArgumentException ex) {
3958 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3959 Assert.IsNull (ex.InnerException, "#3");
3960 // The specified value is not valid
3961 Assert.IsNotNull (ex.Message, "#4");
3962 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3967 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3968 public void SetSocketOption3_Linger_LingerOption ()
3970 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3971 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3972 new LingerOption (false, 0));
3973 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3974 new LingerOption (true, 0));
3975 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3976 new LingerOption (false, 1000));
3977 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3978 new LingerOption (true, 1000));
3982 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3983 public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
3985 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3987 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3988 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3989 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3990 new MulticastOption (mcast_addr));
3992 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3993 new IPv6MulticastOption (mcast_addr));
3995 } catch (ArgumentException ex) {
3996 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3997 Assert.IsNull (ex.InnerException, "#3");
3998 Assert.IsNotNull (ex.Message, "#4");
3999 // The specified value is not a valid 'MulticastOption'
4000 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
4001 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4006 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4007 public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
4009 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
4011 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4012 MulticastOption option = new MulticastOption (mcast_addr);
4014 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
4015 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
4017 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
4022 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4023 [Category ("NotWorking")]
4024 public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
4026 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
4028 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
4030 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
4031 new MulticastOption (mcast_addr));
4033 } catch (SocketException ex) {
4034 // An invalid argument was supplied
4035 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4036 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4037 Assert.IsNull (ex.InnerException, "#4");
4038 Assert.IsNotNull (ex.Message, "#5");
4039 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4040 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4046 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4047 public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
4049 if (!Socket.OSSupportsIPv6)
4050 Assert.Ignore ("IPv6 not enabled.");
4052 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4053 IPv6MulticastOption option = new IPv6MulticastOption (
4054 IPAddress.Parse ("ff02::1"));
4056 s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
4057 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4059 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4064 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4065 public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
4067 if (!Socket.OSSupportsIPv6)
4068 Assert.Ignore ("IPv6 not enabled.");
4070 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4072 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4073 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
4074 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4075 new IPv6MulticastOption (mcast_addr));
4077 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4078 new MulticastOption (mcast_addr));
4080 } catch (ArgumentException ex) {
4081 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
4082 Assert.IsNull (ex.InnerException, "#3");
4083 Assert.IsNotNull (ex.Message, "#4");
4084 // The specified value is not a valid 'IPv6MulticastOption'
4085 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
4086 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4091 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4092 [Category ("NotWorking")]
4093 public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
4095 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4097 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
4099 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4100 new IPv6MulticastOption (mcast_addr));
4102 } catch (SocketException ex) {
4103 // An invalid argument was supplied
4104 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4105 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4106 Assert.IsNull (ex.InnerException, "#4");
4107 Assert.IsNotNull (ex.Message, "#5");
4108 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4109 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4115 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4116 public void SetSocketOption3_OptionValue_Null ()
4118 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4120 s.SetSocketOption (SocketOptionLevel.Socket,
4121 SocketOptionName.Linger, (object) null);
4123 } catch (ArgumentNullException ex) {
4124 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
4125 Assert.IsNull (ex.InnerException, "#3");
4126 Assert.IsNotNull (ex.Message, "#4");
4127 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
4132 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4133 public void SetSocketOption3_Socket_Closed ()
4135 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4138 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
4139 new LingerOption (false, 0));
4141 } catch (ObjectDisposedException ex) {
4142 // Cannot access a disposed object
4143 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
4144 Assert.IsNull (ex.InnerException, "#3");
4145 Assert.IsNotNull (ex.Message, "#4");
4146 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
4151 public void SetSocketOption_MulticastInterfaceIndex_Any ()
4153 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4155 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4157 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4158 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4163 public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
4165 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4167 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4169 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4170 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4175 public void SetSocketOption_MulticastInterfaceIndex_Invalid ()
4177 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4179 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4183 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4190 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4199 public void Shutdown_NoConnect ()
4201 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4202 s.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
4205 s.Shutdown (SocketShutdown.Both);
4207 } catch (SocketException exc) {
4208 Assert.AreEqual (10057, exc.ErrorCode, "#2");
4215 [ExpectedException (typeof (NullReferenceException))]
4216 public void ReceiveAsync_Null ()
4218 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4219 s.ReceiveAsync (null);
4224 [ExpectedException (typeof (NullReferenceException))]
4225 public void ReceiveAsync_Default ()
4227 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4228 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4229 s.ReceiveAsync (saea);
4235 [ExpectedException (typeof (NullReferenceException))]
4236 public void ReceiveAsync_NullBuffer ()
4238 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4239 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4240 saea.SetBuffer (null, 0, 0);
4241 s.ReceiveAsync (null);
4246 [ExpectedException (typeof (ObjectDisposedException))]
4247 public void ReceiveAsync_ClosedSocket ()
4249 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4251 s.ReceiveAsync (null);
4255 [ExpectedException (typeof (NullReferenceException))]
4256 public void SendAsync_Null ()
4258 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4264 [ExpectedException (typeof (NullReferenceException))]
4265 public void SendAsync_Default ()
4267 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4268 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4275 [ExpectedException (typeof (NullReferenceException))]
4276 public void SendAsync_NullBuffer ()
4278 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4279 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4280 saea.SetBuffer (null, 0, 0);
4286 [ExpectedException (typeof (ObjectDisposedException))]
4287 public void SendAsync_ClosedSocket ()
4289 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4295 public void SendAsyncFile ()
4297 Socket serverSocket = StartSocketServer ();
4299 Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4300 clientSocket.Connect (serverSocket.LocalEndPoint);
4301 clientSocket.NoDelay = true;
4303 // Initialize buffer used to create testing file
4304 var buffer = new byte [1024];
4305 for (int i = 0; i < 1024; ++i)
4306 buffer [i] = (byte) (i % 256);
4308 string temp = Path.GetTempFileName ();
4310 // Testing file creation
4311 using (StreamWriter sw = new StreamWriter (temp)) {
4315 var m = new ManualResetEvent (false);
4317 // Async Send File to server
4318 clientSocket.BeginSendFile(temp, (ar) => {
4319 Socket client = (Socket) ar.AsyncState;
4320 client.EndSendFile (ar);
4324 if (!m.WaitOne (1500))
4325 throw new TimeoutException ();
4328 if (File.Exists (temp))
4331 clientSocket.Close ();
4332 serverSocket.Close ();
4337 public void ConnectToIPV4EndPointUsingDualModelSocket () {
4338 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4339 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4340 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4345 var ep = server.LocalEndPoint as IPEndPoint;
4347 client.Connect (ep);
4348 client.Disconnect (true);
4350 client.Connect (IPAddress.Loopback, ep.Port);
4351 client.Disconnect (true);
4353 client.Connect (new [] {IPAddress.Loopback}, ep.Port);
4354 client.Disconnect (true);
4359 public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
4360 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4361 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4362 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4367 var ep = server.LocalEndPoint as IPEndPoint;
4369 BCCalledBack.Reset ();
4370 var ar1 = client.BeginConnect (ep, BCCallback, client);
4371 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
4372 client.Disconnect (true);
4374 BCCalledBack.Reset ();
4375 var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
4376 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4377 client.Disconnect (true);
4379 BCCalledBack.Reset ();
4380 var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
4381 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4382 client.Disconnect (true);
4386 Socket StartSocketServer ()
4389 Socket listenSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4391 listenSocket.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
4392 listenSocket.Listen (1);
4394 listenSocket.BeginAccept (new AsyncCallback (ReceiveCallback), listenSocket);
4396 return listenSocket;
4399 public static void ReceiveCallback (IAsyncResult AsyncCall)
4401 byte[] bytes = new byte [1024];
4403 Socket listener = (Socket)AsyncCall.AsyncState;
4404 Socket client = listener.EndAccept (AsyncCall);
4406 client.Receive (bytes, bytes.Length, 0);
4411 public void UdpMulticasTimeToLive ()
4413 /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
4415 using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4416 IPEndPoint end_point = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
4417 socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
4418 socket.Bind (end_point);
4419 socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);