1 // System.Net.Sockets.SocketTest.cs
4 // Brad Fitzpatrick (brad@danga.com)
5 // Gonzalo Paniagua Javier (gonzalo@novell.com)
7 // (C) Copyright 2003 Brad Fitzpatrick
8 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
12 using System.Diagnostics;
14 using System.Collections;
15 using System.Threading;
16 using System.Reflection;
17 using System.Text.RegularExpressions;
18 using System.Threading.Tasks;
20 using System.Net.Sockets;
21 using NUnit.Framework;
24 using System.Collections.Generic;
26 using MonoTests.Helpers;
28 namespace MonoTests.System.Net.Sockets
31 public class SocketTest
33 // note: also used in SocketCas tests
34 public const string BogusAddress = "192.168.244.244";
35 public const int BogusPort = 23483;
38 public void ConnectIPAddressAny ()
40 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
42 /* UDP sockets use Any to disconnect
44 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
49 } catch (SocketException ex) {
50 Assert.AreEqual (10049, ex.ErrorCode, "#2");
55 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
60 } catch (SocketException ex) {
61 Assert.AreEqual (10049, ex.ErrorCode, "#4");
66 [Ignore ("Bug #75158")] // Looks like MS fails after the .ctor, when you try to use the socket
67 public void IncompatibleAddress ()
69 IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any,
70 NetworkHelpers.FindFreePort ());
73 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) {
78 } catch (SocketException ex) {
79 // address incompatible with protocol
80 int expectedError = 10047;
81 Assert.AreEqual (expectedError, ex.ErrorCode,
87 [Category ("InetAccess")]
88 public void BogusEndConnect ()
90 IPAddress ipOne = IPAddress.Parse (BogusAddress);
91 IPEndPoint ipEP = new IPEndPoint (ipOne, BogusPort);
92 Socket sock = new Socket (ipEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
93 IAsyncResult ar = sock.BeginConnect (ipEP, null, null);
96 // should raise an exception because connect was bogus
99 } catch (SocketException ex) {
100 // Actual error code depends on network configuration.
101 var error = (SocketError) ex.ErrorCode;
102 Assert.That (error == SocketError.TimedOut ||
103 error == SocketError.ConnectionRefused ||
104 error == SocketError.NetworkUnreachable ||
105 error == SocketError.HostUnreachable, "#2");
110 [ExpectedException (typeof (ArgumentNullException))]
111 public void SelectEmpty ()
113 ArrayList list = new ArrayList ();
114 Socket.Select (list, list, list, 1000);
117 private bool BlockingConnect (bool block, int port)
119 IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, port);
120 Socket server = new Socket(AddressFamily.InterNetwork,
124 server.Blocking=block;
128 Socket conn = new Socket (AddressFamily.InterNetwork,
133 Socket client = null;
134 var sw = Stopwatch.StartNew ();
135 while (sw.ElapsedMilliseconds < 100)
138 client = server.Accept();
141 catch (SocketException ex) {
142 if (ex.SocketErrorCode == SocketError.WouldBlock)
147 Assert.IsNotNull (client, "Couldn't accept a client connection within 100ms.");
148 bool client_block = client.Blocking;
154 return(client_block);
158 public void AcceptBlockingStatus()
161 var port = NetworkHelpers.FindFreePort ();
163 block = BlockingConnect(true, port);
164 Assert.AreEqual (block, true, "BlockingStatus01");
166 block = BlockingConnect(false, port);
167 Assert.AreEqual (block, false, "BlockingStatus02");
170 static bool CFAConnected = false;
171 static ManualResetEvent CFACalledBack;
173 private static void CFACallback (IAsyncResult asyncResult)
175 Socket sock = (Socket)asyncResult.AsyncState;
176 CFAConnected = sock.Connected;
178 if (sock.Connected) {
179 sock.EndConnect (asyncResult);
182 CFACalledBack.Set ();
185 [Test] // Connect (IPEndPoint)
186 public void Connect1_RemoteEP_Null ()
188 Socket s = new Socket (AddressFamily.InterNetwork,
189 SocketType.Stream, ProtocolType.Tcp);
191 s.Connect ((IPEndPoint) null);
193 } catch (ArgumentNullException ex) {
194 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
195 Assert.IsNull (ex.InnerException, "#3");
196 Assert.IsNotNull (ex.Message, "#4");
197 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
202 public void ConnectFailAsync ()
204 Socket sock = new Socket (AddressFamily.InterNetwork,
207 sock.Blocking = false;
208 CFACalledBack = new ManualResetEvent (false);
209 CFACalledBack.Reset ();
211 /* Need a port that is not being used for
214 sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
215 NetworkHelpers.FindFreePort ()),
216 new AsyncCallback (CFACallback),
218 CFACalledBack.WaitOne ();
220 Assert.AreEqual (CFAConnected, false, "ConnectFail");
224 public void SetSocketOptionBoolean ()
226 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
227 Socket sock = new Socket (ep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
229 sock.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
235 public void TestSelect1 ()
237 Socket srv = CreateServer (NetworkHelpers.FindFreePort ());
238 ClientSocket clnt = new ClientSocket (srv.LocalEndPoint);
239 Thread th = new Thread (new ThreadStart (clnt.ConnectSleepClose));
245 ArrayList list = new ArrayList ();
246 ArrayList empty = new ArrayList ();
248 Socket.Select (list, empty, empty, 100);
249 Assert.AreEqual (0, empty.Count, "#01");
250 Assert.AreEqual (1, list.Count, "#02");
251 Socket.Select (empty, list, empty, 100);
252 Assert.AreEqual (0, empty.Count, "#03");
253 Assert.AreEqual (1, list.Count, "#04");
254 Socket.Select (list, empty, empty, -1);
255 Assert.AreEqual (0, empty.Count, "#05");
256 Assert.AreEqual (1, list.Count, "#06");
257 // Need to read the 10 bytes from the client to avoid a RST
258 byte [] bytes = new byte [10];
267 static Socket CreateServer (int port)
269 Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
270 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
279 public ClientSocket (EndPoint ep)
282 sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
285 public void ConnectSleepClose ()
294 byte [] b = new byte [10];
299 byte[] buf = new byte[100];
302 [ExpectedException (typeof (ObjectDisposedException))]
303 public void Disposed2 ()
305 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
312 [ExpectedException (typeof (ObjectDisposedException))]
313 public void Disposed6 ()
315 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
322 [ExpectedException (typeof (ObjectDisposedException))]
323 public void Disposed7 ()
325 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
332 [ExpectedException (typeof (ObjectDisposedException))]
333 public void Disposed15 ()
335 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
342 [ExpectedException (typeof (ObjectDisposedException))]
343 public void Disposed16 ()
345 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
352 [ExpectedException (typeof (ObjectDisposedException))]
353 public void Disposed17 ()
355 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
362 [ExpectedException (typeof (ObjectDisposedException))]
363 public void Disposed18 ()
365 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
368 s.Send (buf, 0, 10, 0);
372 [ExpectedException (typeof (ObjectDisposedException))]
373 public void Disposed19 ()
375 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
376 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
379 s.SendTo (buf, 0, ep);
383 [ExpectedException (typeof (ObjectDisposedException))]
384 public void Disposed20 ()
386 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
387 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
390 s.SendTo (buf, 10, 0, ep);
394 [ExpectedException (typeof (ObjectDisposedException))]
395 public void Disposed21 ()
397 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
398 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
401 s.SendTo (buf, 0, 10, 0, ep);
405 [ExpectedException (typeof (ObjectDisposedException))]
406 public void Disposed22 ()
408 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
409 EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
416 [ExpectedException (typeof (ObjectDisposedException))]
417 public void Disposed23 ()
419 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
426 public void GetHashCodeTest ()
428 Socket server = new Socket (AddressFamily.InterNetwork,
429 SocketType.Stream, ProtocolType.Tcp);
430 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
431 NetworkHelpers.FindFreePort ());
435 Socket client = new Socket (AddressFamily.InterNetwork,
436 SocketType.Stream, ProtocolType.Tcp);
437 int hashcodeA = client.GetHashCode ();
439 int hashcodeB = client.GetHashCode ();
440 Assert.AreEqual (hashcodeA, hashcodeB, "#1");
442 int hashcodeC = client.GetHashCode ();
443 Assert.AreEqual (hashcodeB, hashcodeC, "#2");
447 static ManualResetEvent SocketError_event = new ManualResetEvent (false);
449 private static void SocketError_callback (IAsyncResult ar)
451 Socket sock = (Socket)ar.AsyncState;
454 sock.EndConnect (ar);
457 SocketError_event.Set ();
461 public void SocketErrorTest ()
463 Socket sock = new Socket (AddressFamily.InterNetwork,
466 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
469 SocketError_event.Reset ();
471 sock.Blocking = false;
472 sock.BeginConnect (ep, new AsyncCallback(SocketError_callback),
475 if (SocketError_event.WaitOne (2000, false) == false) {
476 Assert.Fail ("SocketError wait timed out");
479 Assert.AreEqual (false, sock.Connected, "SocketError #1");
483 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
484 Assert.AreEqual (10061, error, "SocketError #2");
486 error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
487 Assert.AreEqual (10061, error, "SocketError #3");
494 public void SocketInformationCtor ()
499 public void DontFragmentDefaultTcp ()
501 Socket sock = new Socket (AddressFamily.InterNetwork,
505 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultTcp");
511 [Category ("NotWorking")] // DontFragment doesn't work
512 public void DontFragmentChangeTcp ()
514 Socket sock = new Socket (AddressFamily.InterNetwork,
518 sock.DontFragment = true;
520 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeTcp");
526 public void DontFragmentDefaultUdp ()
528 Socket sock = new Socket (AddressFamily.InterNetwork,
532 Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultUdp");
538 [Category ("NotWorking")] // DontFragment doesn't work
539 public void DontFragmentChangeUdp ()
541 Socket sock = new Socket (AddressFamily.InterNetwork,
545 sock.DontFragment = true;
547 Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeUdp");
553 [ExpectedException (typeof(ObjectDisposedException))]
554 public void DontFragmentClosed ()
556 Socket sock = new Socket (AddressFamily.InterNetwork,
562 bool val = sock.DontFragment;
566 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
567 public void DontFragment ()
569 Socket sock = new Socket (AddressFamily.NetBios,
570 SocketType.Seqpacket,
571 ProtocolType.Unspecified);
574 sock.DontFragment = true;
575 Assert.Fail ("DontFragment #1");
576 } catch (NotSupportedException) {
583 public void EnableBroadcastDefaultTcp ()
585 Socket sock = new Socket (AddressFamily.InterNetwork,
590 bool value = sock.EnableBroadcast;
591 Assert.Fail ("EnableBroadcastDefaultTcp #1");
592 } catch (SocketException ex) {
593 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
600 public void EnableBroadcastDefaultUdp ()
602 Socket sock = new Socket (AddressFamily.InterNetwork,
606 Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp");
612 public void EnableBroadcastChangeTcp ()
614 Socket sock = new Socket (AddressFamily.InterNetwork,
619 sock.EnableBroadcast = true;
620 Assert.Fail ("EnableBroadcastChangeTcp #1");
621 } catch (SocketException ex) {
622 Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
629 public void EnableBroadcastChangeUdp ()
631 Socket sock = new Socket (AddressFamily.InterNetwork,
635 sock.EnableBroadcast = true;
637 Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp");
643 [ExpectedException (typeof(ObjectDisposedException))]
644 public void EnableBroadcastClosed ()
646 Socket sock = new Socket (AddressFamily.InterNetwork,
652 bool val = sock.EnableBroadcast;
655 /* Can't test the default for ExclusiveAddressUse as
656 * it's different on different versions and service
660 [Category ("NotWorking")] // Not supported on Linux
661 public void ExclusiveAddressUseUnbound ()
663 Socket sock = new Socket (AddressFamily.InterNetwork,
667 sock.ExclusiveAddressUse = true;
669 Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound");
675 [ExpectedException (typeof(InvalidOperationException))]
676 [Category ("NotWorking")] // Not supported on Linux
677 public void ExclusiveAddressUseBound ()
679 Socket sock = new Socket (AddressFamily.InterNetwork,
683 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
684 sock.ExclusiveAddressUse = true;
689 [ExpectedException (typeof(ObjectDisposedException))]
690 public void ExclusiveAddressUseClosed ()
692 Socket sock = new Socket (AddressFamily.InterNetwork,
698 bool val = sock.ExclusiveAddressUse;
702 public void IsBoundTcp ()
704 Socket sock = new Socket (AddressFamily.InterNetwork,
707 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
710 Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1");
713 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2");
717 Socket sock2 = new Socket (AddressFamily.InterNetwork,
721 Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3");
724 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4");
727 Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5");
730 Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6");
734 public void IsBoundUdp ()
736 Socket sock = new Socket (AddressFamily.InterNetwork,
739 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
742 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1");
745 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2");
748 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3");
751 sock = new Socket (AddressFamily.InterNetwork,
755 Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4");
758 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5");
761 Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6");
765 /* Should not throw an exception */
766 public void IsBoundClosed ()
768 Socket sock = new Socket (AddressFamily.InterNetwork,
774 bool val = sock.IsBound;
777 /* Nothing much to test for LingerState */
780 public void MulticastLoopbackDefaultTcp ()
782 Socket sock = new Socket (AddressFamily.InterNetwork,
787 bool value = sock.MulticastLoopback;
788 Assert.Fail ("MulticastLoopbackDefaultTcp #1");
789 } catch (SocketException ex) {
790 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
797 public void MulticastLoopbackChangeTcp ()
799 Socket sock = new Socket (AddressFamily.InterNetwork,
804 sock.MulticastLoopback = false;
805 Assert.Fail ("MulticastLoopbackChangeTcp #1");
806 } catch (SocketException ex) {
807 Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
814 public void MulticastLoopbackDefaultUdp ()
816 Socket sock = new Socket (AddressFamily.InterNetwork,
820 Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp");
826 public void MulticastLoopbackChangeUdp ()
828 Socket sock = new Socket (AddressFamily.InterNetwork,
832 sock.MulticastLoopback = false;
834 Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp");
840 [ExpectedException (typeof(ObjectDisposedException))]
841 public void MulticastLoopbackClosed ()
843 Socket sock = new Socket (AddressFamily.InterNetwork,
849 bool val = sock.MulticastLoopback;
852 /* OSSupportsIPv6 depends on the environment */
855 [Category("NotWorking")] // We have different defaults for perf reasons
856 public void ReceiveBufferSizeDefault ()
858 Socket sock = new Socket (AddressFamily.InterNetwork,
862 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault");
868 [Category("NotWorking")] // We have different defaults for perf reasons
869 public void ReceiveBufferSizeDefaultUdp ()
871 Socket sock = new Socket (AddressFamily.InterNetwork,
875 Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp");
881 public void ReceiveBufferSizeChange ()
883 Socket sock = new Socket (AddressFamily.InterNetwork,
887 sock.ReceiveBufferSize = 16384;
889 Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange");
895 [Category("NotWorking")] // We cannot totally remove buffers (minimum is set to 256
896 public void BuffersCheck_None ()
898 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
899 int original = s.ReceiveBufferSize;
900 s.ReceiveBufferSize = 0;
901 Assert.AreEqual (0, s.ReceiveBufferSize, "ReceiveBufferSize " + original.ToString ());
903 original = s.SendBufferSize;
904 s.SendBufferSize = 0;
905 Assert.AreEqual (0, s.SendBufferSize, "SendBufferSize " + original.ToString ());
910 [ExpectedException (typeof(ObjectDisposedException))]
911 public void ReceiveBufferSizeClosed ()
913 Socket sock = new Socket (AddressFamily.InterNetwork,
919 int val = sock.ReceiveBufferSize;
923 [Category("NotWorking")] // We have different defaults for perf reasons
924 public void SendBufferSizeDefault ()
926 Socket sock = new Socket (AddressFamily.InterNetwork,
930 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault");
936 [Category("NotWorking")] // We have different defaults for perf reasons
937 public void SendBufferSizeDefaultUdp ()
939 Socket sock = new Socket (AddressFamily.InterNetwork,
943 Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp");
949 public void SendBufferSizeChange ()
951 Socket sock = new Socket (AddressFamily.InterNetwork,
955 sock.SendBufferSize = 16384;
957 Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange");
963 [ExpectedException (typeof(ObjectDisposedException))]
964 public void SendBufferSizeClosed ()
966 Socket sock = new Socket (AddressFamily.InterNetwork,
972 int val = sock.SendBufferSize;
975 /* No test for TTL default as it's platform dependent */
977 public void TtlChange ()
979 Socket sock = new Socket (AddressFamily.InterNetwork,
985 Assert.AreEqual (255, sock.Ttl, "TtlChange");
991 public void TtlChangeOverflow ()
993 Socket sock = new Socket (AddressFamily.InterNetwork,
999 Assert.Fail ("TtlChangeOverflow #1");
1000 } catch (ArgumentOutOfRangeException ex) {
1001 Assert.AreEqual ("value", ex.ParamName,
1002 "TtlChangeOverflow #2");
1008 /* Apparently you can set TTL=0 on the ms runtime!!
1011 Assert.Fail ("TtlChangeOverflow #4");
1012 } catch (SocketException ex) {
1013 Assert.AreEqual (10022, ex.ErrorCode,
1014 "TtlChangeOverflow #5");
1021 [ExpectedException (typeof(ObjectDisposedException))]
1022 public void TtlClosed ()
1024 Socket sock = new Socket (AddressFamily.InterNetwork,
1034 public void UseOnlyOverlappedIODefault ()
1036 Socket sock = new Socket (AddressFamily.InterNetwork,
1040 Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault");
1046 // We need this because the Linux kernel in certain configurations
1047 // will end up rounding up the values passed on to the kernel
1048 // for socket send/receive timeouts.
1050 int Approximate (int target, int value)
1054 if (value > target-10 && value < target+10)
1060 public void UseOnlyOverlappedIOChange ()
1062 Socket sock = new Socket (AddressFamily.InterNetwork,
1066 sock.UseOnlyOverlappedIO = true;
1068 Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange");
1074 /* Should not throw an exception */
1075 public void UseOnlyOverlappedIOClosed ()
1077 Socket sock = new Socket (AddressFamily.InterNetwork,
1083 bool val = sock.UseOnlyOverlappedIO;
1087 public void SendTimeoutDefault ()
1089 Socket sock = new Socket (AddressFamily.InterNetwork,
1093 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault");
1099 public void SendTimeoutChange ()
1101 Socket sock = new Socket (AddressFamily.InterNetwork,
1105 /* Should be rounded up to 500, according to
1106 * the MSDN docs, but the MS runtime doesn't
1108 sock.SendTimeout = 50;
1109 Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1");
1111 sock.SendTimeout = 2000;
1112 Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2");
1114 sock.SendTimeout = 0;
1115 Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3");
1117 /* Should be the same as setting 0 */
1118 sock.SendTimeout = -1;
1119 Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4");
1121 sock.SendTimeout = 65536;
1122 Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5");
1125 sock.SendTimeout = -2;
1126 Assert.Fail ("SendTimeoutChange #8");
1127 } catch (ArgumentOutOfRangeException) {
1134 [ExpectedException (typeof(ObjectDisposedException))]
1135 public void SendTimeoutClosed ()
1137 Socket sock = new Socket (AddressFamily.InterNetwork,
1143 int val = sock.SendTimeout;
1147 public void ReceiveTimeoutDefault ()
1149 Socket sock = new Socket (AddressFamily.InterNetwork,
1153 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault");
1159 public void ReceiveTimeoutChange ()
1161 Socket sock = new Socket (AddressFamily.InterNetwork,
1165 sock.ReceiveTimeout = 50;
1166 Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1");
1168 sock.ReceiveTimeout = 2000;
1169 Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2");
1171 sock.ReceiveTimeout = 0;
1172 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3");
1174 /* Should be the same as setting 0 */
1175 sock.ReceiveTimeout = -1;
1176 Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4");
1178 sock.ReceiveTimeout = 65536;
1179 Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5");
1182 sock.ReceiveTimeout = -2;
1183 Assert.Fail ("ReceiveTimeoutChange #8");
1184 } catch (ArgumentOutOfRangeException) {
1191 [ExpectedException (typeof(ObjectDisposedException))]
1192 public void ReceiveTimeoutClosed ()
1194 Socket sock = new Socket (AddressFamily.InterNetwork,
1200 int val = sock.ReceiveTimeout;
1204 public void NoDelayDefaultTcp ()
1206 Socket sock = new Socket (AddressFamily.InterNetwork,
1210 Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
1216 public void NoDelayChangeTcp ()
1218 Socket sock = new Socket (AddressFamily.InterNetwork,
1222 sock.NoDelay = true;
1224 Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp");
1230 public void NoDelayDefaultUdp ()
1232 Socket sock = new Socket (AddressFamily.InterNetwork,
1237 bool val = sock.NoDelay;
1238 Assert.Fail ("NoDelayDefaultUdp #1");
1239 } catch (SocketException ex) {
1240 Assert.AreEqual (10042, ex.ErrorCode,
1241 "NoDelayDefaultUdp #2");
1248 public void NoDelayChangeUdp ()
1250 Socket sock = new Socket (AddressFamily.InterNetwork,
1255 sock.NoDelay = true;
1256 Assert.Fail ("NoDelayChangeUdp #1");
1257 } catch (SocketException ex) {
1258 Assert.AreEqual (10042, ex.ErrorCode,
1259 "NoDelayChangeUdp #2");
1266 [ExpectedException (typeof(ObjectDisposedException))]
1267 public void NoDelayClosed ()
1269 Socket sock = new Socket (AddressFamily.InterNetwork,
1275 bool val = sock.NoDelay;
1278 static bool BAAccepted = false;
1279 static Socket BASocket = null;
1280 static ManualResetEvent BACalledBack = new ManualResetEvent (false);
1282 private static void BACallback (IAsyncResult asyncResult)
1284 Socket sock = (Socket)asyncResult.AsyncState;
1286 BASocket = sock.EndAccept (asyncResult);
1289 BACalledBack.Set ();
1293 [ExpectedException (typeof(InvalidOperationException))]
1294 public void BeginAcceptNotBound ()
1296 Socket sock = new Socket (AddressFamily.InterNetwork,
1300 sock.BeginAccept (BACallback, sock);
1306 [ExpectedException (typeof(InvalidOperationException))]
1307 public void BeginAcceptNotListening ()
1309 Socket sock = new Socket (AddressFamily.InterNetwork,
1313 sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
1315 sock.BeginAccept (BACallback, sock);
1321 public void BeginAccept ()
1323 Socket sock = new Socket (AddressFamily.InterNetwork,
1326 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1327 NetworkHelpers.FindFreePort ());
1332 BACalledBack.Reset ();
1334 sock.BeginAccept (BACallback, sock);
1336 Socket conn = new Socket (AddressFamily.InterNetwork,
1342 if (BACalledBack.WaitOne (2000, false) == false) {
1343 Assert.Fail ("BeginAccept wait timed out");
1346 Assert.AreEqual (true, BAAccepted, "BeginAccept #1");
1347 Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2");
1348 Assert.AreEqual (false, sock.Connected, "BeginAccept #3");
1349 Assert.AreEqual (true, conn.Connected, "BeginAccept #4");
1357 [ExpectedException (typeof(ObjectDisposedException))]
1358 public void BeginAcceptClosed ()
1360 Socket sock = new Socket (AddressFamily.InterNetwork,
1366 sock.BeginAccept (BACallback, sock);
1369 static bool BADAccepted = false;
1370 static Socket BADSocket = null;
1371 static byte[] BADBytes;
1372 static int BADByteCount;
1373 static ManualResetEvent BADCalledBack = new ManualResetEvent (false);
1375 private static void BADCallback (IAsyncResult asyncResult)
1377 Socket sock = (Socket)asyncResult.AsyncState;
1379 BADSocket = sock.EndAccept (out BADBytes,
1384 BADCalledBack.Set ();
1388 public void BeginAcceptData ()
1390 Socket sock = new Socket (AddressFamily.InterNetwork,
1393 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1394 NetworkHelpers.FindFreePort ());
1399 BADCalledBack.Reset ();
1401 sock.BeginAccept (256, BADCallback, sock);
1403 Socket conn = new Socket (AddressFamily.InterNetwork,
1406 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1409 conn.Send (send_bytes);
1411 if (BADCalledBack.WaitOne (2000, false) == false) {
1412 Assert.Fail ("BeginAcceptData wait timed out");
1415 Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1");
1416 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2");
1417 Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3");
1418 Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4");
1419 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5");
1421 /* The MS runtime gives the returned data in a
1422 * much bigger array. TODO: investigate
1423 * whether it the size correlates to the first
1424 * parameter in BeginAccept()
1426 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1427 "BeginAcceptData #6");
1429 for(int i = 0; i < send_bytes.Length; i++) {
1430 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ());
1439 [ExpectedException (typeof(ObjectDisposedException))]
1440 public void BeginAcceptDataClosed ()
1442 Socket sock = new Socket (AddressFamily.InterNetwork,
1448 sock.BeginAccept (256, BADCallback, sock);
1452 public void BeginAcceptSocketUdp ()
1454 Socket sock = new Socket (AddressFamily.InterNetwork,
1457 Socket acc = new Socket (AddressFamily.InterNetwork,
1461 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1462 NetworkHelpers.FindFreePort ());
1468 sock.BeginAccept (acc, 256, BADCallback, sock);
1469 Assert.Fail ("BeginAcceptSocketUdp #1");
1470 } catch (SocketException ex) {
1471 Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
1479 public void BeginAcceptSocketBound ()
1481 Socket sock = new Socket (AddressFamily.InterNetwork,
1484 Socket acc = new Socket (AddressFamily.InterNetwork,
1488 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
1489 NetworkHelpers.FindFreePort ());
1491 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
1492 NetworkHelpers.FindFreePort ());
1500 sock.BeginAccept (acc, 256, BADCallback, sock);
1501 Assert.Fail ("BeginAcceptSocketBound #1");
1502 } catch (InvalidOperationException) {
1510 public void BeginAcceptSocket ()
1512 Socket sock = new Socket (AddressFamily.InterNetwork,
1515 Socket acc = new Socket (AddressFamily.InterNetwork,
1519 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1520 NetworkHelpers.FindFreePort ());
1525 BADCalledBack.Reset ();
1527 sock.BeginAccept (acc, 256, BADCallback, sock);
1529 Socket conn = new Socket (AddressFamily.InterNetwork,
1532 byte[] send_bytes = new byte[] {10, 11, 12, 13};
1535 conn.Send (send_bytes);
1537 if (BADCalledBack.WaitOne (2000, false) == false) {
1538 Assert.Fail ("BeginAcceptSocket wait timed out");
1541 Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1");
1542 Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2");
1543 Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3");
1544 Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4");
1545 Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5");
1546 Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6");
1547 Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7");
1548 Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8");
1549 Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9");
1551 /* The MS runtime gives the returned data in a
1552 * much bigger array. TODO: investigate
1553 * whether it the size correlates to the first
1554 * parameter in BeginAccept()
1556 Assert.IsFalse (BADBytes.Length == send_bytes.Length,
1557 "BeginAcceptSocket #10");
1559 for(int i = 0; i < send_bytes.Length; i++) {
1560 Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ());
1570 public void BeginAcceptSocketClosed ()
1572 Socket sock = new Socket (AddressFamily.InterNetwork,
1575 Socket acc = new Socket (AddressFamily.InterNetwork,
1582 sock.BeginAccept (acc, 256, BADCallback, null);
1583 Assert.Fail ("BeginAcceptSocketClosed #1");
1584 } catch (ObjectDisposedException) {
1591 public void BeginAcceptSocketAccClosed ()
1593 Socket sock = new Socket (AddressFamily.InterNetwork,
1596 Socket acc = new Socket (AddressFamily.InterNetwork,
1599 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1600 NetworkHelpers.FindFreePort ());
1607 BADCalledBack.Reset ();
1610 sock.BeginAccept (acc, 256, BADCallback, null);
1611 Assert.Fail ("BeginAcceptSocketAccClosed #1");
1612 } catch (ObjectDisposedException) {
1618 static bool BCConnected = false;
1619 static ManualResetEvent BCCalledBack = new ManualResetEvent (false);
1621 private static void BCCallback (IAsyncResult asyncResult)
1623 Socket sock = (Socket)asyncResult.AsyncState;
1626 sock.EndConnect (asyncResult);
1627 } catch (Exception e) {
1628 Console.WriteLine ("BCCallback exception:");
1629 Console.WriteLine (e);
1636 BCCalledBack.Set ();
1640 public void BeginConnectAddressPort ()
1642 Socket sock = new Socket (AddressFamily.InterNetwork,
1645 Socket listen = new Socket (AddressFamily.InterNetwork,
1648 IPAddress ip = IPAddress.Loopback;
1649 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1654 BCCalledBack.Reset ();
1656 BCConnected = false;
1658 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1660 if (BCCalledBack.WaitOne (2000, false) == false) {
1661 Assert.Fail ("BeginConnectAddressPort wait timed out");
1664 Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1");
1671 public void BeginConnectAddressPortNull ()
1673 Socket sock = new Socket (AddressFamily.InterNetwork,
1676 IPAddress ip = null;
1679 sock.BeginConnect (ip, 1244, BCCallback,
1681 Assert.Fail ("BeginConnectAddressPortNull #1");
1682 } catch (ArgumentNullException) {
1689 public void BeginConnectAddressPortListen ()
1691 Socket sock = new Socket (AddressFamily.InterNetwork,
1694 IPAddress ip = IPAddress.Loopback;
1695 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1701 sock.BeginConnect (ip, ep.Port, BCCallback, sock);
1702 Assert.Fail ("BeginConnectAddressPortListen #1");
1703 } catch (InvalidOperationException) {
1710 [ExpectedException (typeof(ObjectDisposedException))]
1711 public void BeginConnectAddressPortClosed ()
1713 Socket sock = new Socket (AddressFamily.InterNetwork,
1716 IPAddress ip = IPAddress.Loopback;
1720 sock.BeginConnect (ip, 1244, BCCallback, sock);
1724 [Category ("NotOnMac")]
1726 * This is not a Mono bug.
1728 * By default, only 127.0.0.1 is enabled and you must explicitly
1729 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
1731 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
1732 * until I add that alias.
1735 public void BeginConnectMultiple ()
1737 Socket sock = new Socket (AddressFamily.InterNetwork,
1740 Socket listen = new Socket (AddressFamily.InterNetwork,
1743 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1744 NetworkHelpers.FindFreePort ());
1745 IPAddress[] ips = new IPAddress[4];
1747 ips[0] = IPAddress.Parse ("127.0.0.4");
1748 ips[1] = IPAddress.Parse ("127.0.0.3");
1749 ips[2] = IPAddress.Parse ("127.0.0.2");
1750 ips[3] = IPAddress.Parse ("127.0.0.1");
1755 BCCalledBack.Reset ();
1757 BCConnected = false;
1759 sock.BeginConnect (ips, ep.Port, BCCallback, sock);
1761 /* Longer wait here, because the ms runtime
1762 * takes a lot longer to not connect
1765 if (BCCalledBack.WaitOne (30000, false) == false) {
1766 Assert.Fail ("BeginConnectMultiple wait failed");
1770 Assert.IsTrue (BCCalledBack.WaitOne (30000), "#0");
1772 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
1773 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
1774 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1776 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2");
1783 public void BeginConnectMultiple2 ()
1785 Socket sock = new Socket (AddressFamily.InterNetwork,
1788 Socket listen = new Socket (AddressFamily.InterNetwork,
1792 // Need at least two addresses.
1793 var ips = Dns.GetHostAddresses (string.Empty);
1795 Assert.Ignore ("This test needs at least two IP addresses.");
1797 var allIps = new IPAddress [ips.Length + 1];
1798 allIps [0] = IPAddress.Loopback;
1799 ips.CopyTo (allIps, 1);
1802 * Only bind to the loopback interface, so all the non-loopback
1803 * IP addresses will fail. BeginConnect()/EndConnect() should
1804 * succeed it it can connect to at least one of the requested
1807 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
1812 BCCalledBack.Reset ();
1814 BCConnected = false;
1816 sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
1818 /* Longer wait here, because the ms runtime
1819 * takes a lot longer to not connect
1821 if (BCCalledBack.WaitOne (10000, false) == false) {
1822 Assert.Fail ("BeginConnectMultiple2 wait failed");
1825 Assert.AreEqual (true, BCConnected, "BeginConnectMultiple2 #1");
1826 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple2 #2");
1827 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
1829 Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple2 #2");
1837 public void BeginConnectMultipleNull ()
1839 Socket sock = new Socket (AddressFamily.InterNetwork,
1842 IPAddress[] ips = null;
1845 sock.BeginConnect (ips, 1246, BCCallback,
1847 Assert.Fail ("BeginConnectMultipleNull #1");
1848 } catch (ArgumentNullException) {
1855 public void BeginConnectMultipleListen ()
1857 Socket sock = new Socket (AddressFamily.InterNetwork,
1860 IPAddress[] ips = new IPAddress[4];
1861 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
1862 NetworkHelpers.FindFreePort ());
1864 ips[0] = IPAddress.Parse ("127.0.0.4");
1865 ips[1] = IPAddress.Parse ("127.0.0.3");
1866 ips[2] = IPAddress.Parse ("127.0.0.2");
1867 ips[3] = IPAddress.Parse ("127.0.0.1");
1873 sock.BeginConnect (ips, ep.Port, BCCallback,
1875 Assert.Fail ("BeginConnectMultipleListen #1");
1876 } catch (InvalidOperationException) {
1883 [ExpectedException (typeof(ObjectDisposedException))]
1884 public void BeginConnectMultipleClosed ()
1886 Socket sock = new Socket (AddressFamily.InterNetwork,
1889 IPAddress[] ips = new IPAddress[4];
1891 ips[0] = IPAddress.Parse ("127.0.0.4");
1892 ips[1] = IPAddress.Parse ("127.0.0.3");
1893 ips[2] = IPAddress.Parse ("127.0.0.2");
1894 ips[3] = IPAddress.Parse ("127.0.0.1");
1898 sock.BeginConnect (ips, 1247, BCCallback, sock);
1902 public void BeginConnectHostPortNull ()
1904 Socket sock = new Socket (AddressFamily.InterNetwork,
1909 sock.BeginConnect ((string)null, 0,
1911 Assert.Fail ("BeginConnectHostPort #1");
1912 } catch (ArgumentNullException) {
1919 public void BeginConnectHostPortListen ()
1921 Socket sock = new Socket (AddressFamily.InterNetwork,
1924 IPAddress ip = IPAddress.Loopback;
1925 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
1931 sock.BeginConnect ("localhost", ep.Port,
1933 Assert.Fail ("BeginConnectHostPortListen #1");
1934 } catch (InvalidOperationException) {
1941 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
1942 public void BeginConnectHostPortNotIP ()
1944 Socket sock = new Socket (AddressFamily.NetBios,
1945 SocketType.Seqpacket,
1946 ProtocolType.Unspecified);
1949 sock.BeginConnect ("localhost", 0, BCCallback,
1951 Assert.Fail ("BeginConnectHostPortNotIP #1");
1952 } catch (NotSupportedException) {
1959 [ExpectedException (typeof(ObjectDisposedException))]
1960 public void BeginConnectHostPortClosed ()
1962 Socket sock = new Socket (AddressFamily.InterNetwork,
1968 sock.BeginConnect ("localhost", 0, BCCallback, sock);
1971 static bool BDDisconnected = false;
1972 static ManualResetEvent BDCalledBack = new ManualResetEvent (false);
1974 private static void BDCallback (IAsyncResult asyncResult)
1976 Socket sock = (Socket)asyncResult.AsyncState;
1978 sock.EndDisconnect (asyncResult);
1979 BDDisconnected = true;
1981 BDCalledBack.Set ();
1985 [Category ("NotDotNet")] // "Needs XP or later"
1986 public void BeginDisconnect ()
1988 Socket sock = new Socket (AddressFamily.InterNetwork,
1991 Socket listen = new Socket (AddressFamily.InterNetwork,
1994 IPAddress ip = IPAddress.Loopback;
1995 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2000 sock.Connect (ip, ep.Port);
2002 Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
2004 sock.Shutdown (SocketShutdown.Both);
2006 BDCalledBack.Reset ();
2007 BDDisconnected = false;
2009 sock.BeginDisconnect (false, BDCallback, sock);
2011 if (BDCalledBack.WaitOne (2000, false) == false) {
2012 Assert.Fail ("BeginDisconnect wait timed out");
2015 Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2");
2016 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2023 public void BeginReceiveSocketError ()
2028 public void BeginReceiveGeneric ()
2033 public void BeginReceiveGenericSocketError ()
2037 private static void BSCallback (IAsyncResult asyncResult)
2039 Socket sock = (Socket)asyncResult.AsyncState;
2041 sock.EndSend (asyncResult);
2045 public void BeginSendNotConnected ()
2047 Socket sock = new Socket (AddressFamily.InterNetwork,
2051 byte[] send_bytes = new byte[] {10, 11, 12, 13};
2054 sock.BeginSend (send_bytes, 0,
2056 SocketFlags.None, BSCallback,
2058 Assert.Fail ("BeginSendNotConnected #1");
2059 } catch (SocketException ex) {
2060 Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
2067 public void BeginSendSocketError ()
2072 public void BeginSendGeneric ()
2077 public void BeginSendGenericSocketError ()
2082 public void BindTwice ()
2084 Socket sock = new Socket (AddressFamily.InterNetwork,
2087 IPEndPoint ep1 = new IPEndPoint (IPAddress.Loopback,
2088 NetworkHelpers.FindFreePort ());
2089 IPEndPoint ep2 = new IPEndPoint (IPAddress.Loopback,
2090 NetworkHelpers.FindFreePort ());
2096 Assert.Fail ("BindTwice #1");
2097 } catch (SocketException ex) {
2098 Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
2105 public void Close ()
2107 Socket sock = new Socket (AddressFamily.InterNetwork,
2110 Socket listen = new Socket (AddressFamily.InterNetwork,
2113 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2114 NetworkHelpers.FindFreePort ());
2121 Assert.AreEqual (true, sock.Connected, "Close #1");
2125 Thread.Sleep (3000);
2127 Assert.AreEqual (false, sock.Connected, "Close #2");
2133 public void ConnectAddressPort ()
2135 Socket sock = new Socket (AddressFamily.InterNetwork,
2138 Socket listen = new Socket (AddressFamily.InterNetwork,
2141 IPAddress ip = IPAddress.Loopback;
2142 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2147 sock.Connect (ip, ep.Port);
2149 Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
2156 public void ConnectAddressPortNull ()
2158 Socket sock = new Socket (AddressFamily.InterNetwork,
2161 IPAddress ip = null;
2164 sock.Connect (ip, 1249);
2165 Assert.Fail ("ConnectAddressPortNull #1");
2166 } catch (ArgumentNullException) {
2173 public void ConnectAddressPortListen ()
2175 Socket sock = new Socket (AddressFamily.InterNetwork,
2178 IPAddress ip = IPAddress.Loopback;
2179 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2185 sock.Connect (ip, ep.Port);
2186 Assert.Fail ("ConnectAddressPortListen #1");
2187 } catch (InvalidOperationException) {
2194 [ExpectedException (typeof(ObjectDisposedException))]
2195 public void ConnectAddressPortClosed ()
2197 Socket sock = new Socket (AddressFamily.InterNetwork,
2200 IPAddress ip = IPAddress.Loopback;
2204 sock.Connect (ip, 1250);
2208 [Category ("NotOnMac")] // MacOSX trashes the fd after the failed connect attempt to 127.0.0.4
2210 * This is not a Mono bug.
2212 * By default, only 127.0.0.1 is enabled and you must explicitly
2213 * enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
2215 * I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
2216 * until I add that alias.
2218 * However, after doing so, Mac OS treats these as separate addresses, ie. attempting
2219 * to connect to 127.0.0.4 yields a connection refused.
2221 * When using Connect(), the .NET runtime also throws an exception if connecting to
2222 * any of the IP addresses fails. This is different with BeginConnect()/EndConnect()
2223 * which succeeds when it can connect to at least one of the addresses.
2226 public void ConnectMultiple ()
2228 Socket sock = new Socket (AddressFamily.InterNetwork,
2231 Socket listen = new Socket (AddressFamily.InterNetwork,
2234 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2235 NetworkHelpers.FindFreePort ());
2236 IPAddress[] ips = new IPAddress[4];
2238 ips[0] = IPAddress.Parse ("127.0.0.4");
2239 ips[1] = IPAddress.Parse ("127.0.0.3");
2240 ips[2] = IPAddress.Parse ("127.0.0.2");
2241 ips[3] = IPAddress.Parse ("127.0.0.1");
2246 sock.Connect (ips, ep.Port);
2248 Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
2249 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
2250 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2252 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2");
2259 public void ConnectMultiple2 ()
2261 Socket sock = new Socket (AddressFamily.InterNetwork,
2264 Socket listen = new Socket (AddressFamily.InterNetwork,
2268 // Need at least two addresses.
2269 var ips = Dns.GetHostAddresses (string.Empty);
2271 Assert.Ignore ("This test needs at least two IP addresses.");
2273 var allIps = new IPAddress [ips.Length + 1];
2274 allIps [0] = IPAddress.Loopback;
2275 ips.CopyTo (allIps, 1);
2278 * Bind to IPAddress.Any; Connect() will fail unless it can
2279 * connect to all the addresses in allIps.
2281 IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
2286 sock.Connect (allIps, ep.Port);
2288 Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
2289 Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
2290 IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
2292 Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple2 #3");
2299 public void ConnectMultipleNull ()
2301 Socket sock = new Socket (AddressFamily.InterNetwork,
2304 IPAddress[] ips = null;
2307 sock.Connect (ips, 1251);
2308 Assert.Fail ("ConnectMultipleNull #1");
2309 } catch (ArgumentNullException) {
2316 public void ConnectMultipleListen ()
2318 Socket sock = new Socket (AddressFamily.InterNetwork,
2321 IPAddress[] ips = new IPAddress[4];
2322 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback,
2323 NetworkHelpers.FindFreePort ());
2325 ips[0] = IPAddress.Parse ("127.0.0.4");
2326 ips[1] = IPAddress.Parse ("127.0.0.3");
2327 ips[2] = IPAddress.Parse ("127.0.0.2");
2328 ips[3] = IPAddress.Parse ("127.0.0.1");
2334 sock.Connect (ips, ep.Port);
2335 Assert.Fail ("ConnectMultipleListen #1");
2336 } catch (InvalidOperationException) {
2343 [ExpectedException (typeof(ObjectDisposedException))]
2344 public void ConnectMultipleClosed ()
2346 Socket sock = new Socket (AddressFamily.InterNetwork,
2349 IPAddress[] ips = new IPAddress[4];
2351 ips[0] = IPAddress.Parse ("127.0.0.4");
2352 ips[1] = IPAddress.Parse ("127.0.0.3");
2353 ips[2] = IPAddress.Parse ("127.0.0.2");
2354 ips[3] = IPAddress.Parse ("127.0.0.1");
2358 sock.Connect (ips, 1252);
2362 public void ConnectHostPortNull ()
2364 Socket sock = new Socket (AddressFamily.InterNetwork,
2369 sock.Connect ((string)null, 0);
2370 Assert.Fail ("ConnectHostPort #1");
2371 } catch (ArgumentNullException) {
2378 public void ConnectHostPortListen ()
2380 Socket sock = new Socket (AddressFamily.InterNetwork,
2383 IPAddress ip = IPAddress.Loopback;
2384 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2390 sock.Connect ("localhost", ep.Port);
2391 Assert.Fail ("ConnectHostPortListen #1");
2392 } catch (InvalidOperationException) {
2399 [Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
2400 public void ConnectHostPortNotIP ()
2402 Socket sock = new Socket (AddressFamily.NetBios,
2403 SocketType.Seqpacket,
2404 ProtocolType.Unspecified);
2407 sock.Connect ("localhost", 0);
2408 Assert.Fail ("ConnectHostPortNotIP #1");
2409 } catch (NotSupportedException) {
2416 [ExpectedException (typeof(ObjectDisposedException))]
2417 public void ConnectHostPortClosed ()
2419 Socket sock = new Socket (AddressFamily.InterNetwork,
2425 sock.Connect ("localhost", 0);
2429 [Category ("NotDotNet")] // "Needs XP or later"
2430 public void Disconnect ()
2432 Socket sock = new Socket (AddressFamily.InterNetwork,
2435 Socket listen = new Socket (AddressFamily.InterNetwork,
2438 IPAddress ip = IPAddress.Loopback;
2439 IPEndPoint ep = new IPEndPoint (ip, NetworkHelpers.FindFreePort ());
2444 sock.Connect (ip, ep.Port);
2446 Assert.AreEqual (true, sock.Connected, "Disconnect #1");
2448 sock.Shutdown (SocketShutdown.Both);
2450 sock.Disconnect (false);
2452 Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
2459 public void DuplicateAndClose ()
2464 public void IOControl ()
2469 public void TestDefaultsDualMode ()
2471 using (var socket = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)){
2472 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2475 using (var socket = new Socket (SocketType.Stream, ProtocolType.Tcp)){
2476 Assert.AreEqual (AddressFamily.InterNetworkV6, socket.AddressFamily, "When creating sockets of type stream/tcp, the address family should be InterNetworkV6");
2477 Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
2479 socket.DualMode = false;
2481 Assert.IsFalse (socket.DualMode, "Setting of DualSocket should turn DualSockets off");
2487 public void ReceiveGeneric ()
2491 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2493 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2494 listensock.Bind (endpoint);
2495 listensock.Listen(1);
2497 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2498 sendsock.Connect(endpoint);
2500 Socket clientsock = listensock.Accept();
2502 byte[] sendbuf = new byte[256];
2504 for(i = 0; i < 256; i++) {
2505 sendbuf[i] = (byte)i;
2507 for (i = 4; i < 6; i++) {
2508 Assert.AreEqual (sendbuf[i], (byte)i,
2509 "#1/" + i.ToString());
2513 sendsock.Send (sendbuf, 0, 256, SocketFlags.None,
2517 byte[] recvbuf = new byte[256];
2518 List<ArraySegment<byte>> recvbuflist = new List<ArraySegment<byte>>(2);
2519 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 4, 2));
2520 recvbuflist.Add(new ArraySegment<byte>(recvbuf, 20, 230));
2522 clientsock.Receive (recvbuflist);
2524 /* recvbuf should now hold the first 2 bytes
2525 * of sendbuf from pos 4, and the next 230
2526 * bytes of sendbuf from pos 20
2529 for (i = 0; i < 2; i++) {
2530 Assert.AreEqual (sendbuf[i], recvbuf[i + 4],
2531 "#2/" + i.ToString());
2533 for (i = 2; i < 232; i++) {
2534 Assert.AreEqual (sendbuf[i], recvbuf[i + 18],
2535 "#2/" + i.ToString());
2539 clientsock.Close ();
2540 listensock.Close ();
2544 public void SendGeneric ()
2548 IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, NetworkHelpers.FindFreePort ());
2550 Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2551 listensock.Bind (endpoint);
2552 listensock.Listen(1);
2554 Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2555 sendsock.Connect(endpoint);
2557 Socket clientsock = listensock.Accept();
2559 byte[] sendbuf = new byte[256];
2560 List<ArraySegment<byte>> sendbuflist = new List<ArraySegment<byte>>(2);
2562 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 4, 2));
2563 sendbuflist.Add(new ArraySegment<byte>(sendbuf, 20, 230));
2565 for(i = 0; i < 256; i++) {
2566 sendbuf[i] = (byte)i;
2568 for (i = 4; i < 6; i++) {
2569 Assert.AreEqual (sendbuf[i], (byte)i,
2570 "#1/" + i.ToString());
2574 sendsock.Send (sendbuflist, SocketFlags.None, out err);
2577 byte[] recvbuf = new byte[256];
2579 clientsock.Receive (recvbuf);
2581 /* The first 2 bytes of recvbuf should now
2582 * hold 2 bytes of sendbuf from pos 4, and the
2583 * next 230 bytes of recvbuf should be sendbuf
2587 for (i = 0; i < 2; i++) {
2588 Assert.AreEqual (recvbuf[i], sendbuf[i + 4],
2589 "#2/" + i.ToString());
2591 for (i = 2; i < 232; i++) {
2592 Assert.AreEqual (recvbuf[i], sendbuf[i + 18],
2593 "#2/" + i.ToString());
2597 clientsock.Close ();
2598 listensock.Close ();
2602 public void ListenNotBound ()
2604 Socket sock = new Socket (AddressFamily.InterNetwork,
2610 Assert.Fail ("ListenNotBound #1");
2611 } catch (SocketException ex) {
2612 Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
2618 static Socket CWRSocket;
2619 static bool CWRReceiving = true;
2620 static ManualResetEvent CWRReady = new ManualResetEvent (false);
2622 private static void CWRReceiveThread ()
2624 byte[] buf = new byte[256];
2627 CWRSocket.Receive (buf);
2628 } catch (SocketException) {
2629 CWRReceiving = false;
2636 public void CloseWhileReceiving ()
2638 CWRSocket = new Socket (AddressFamily.InterNetwork,
2641 CWRSocket.Bind (new IPEndPoint (IPAddress.Loopback,
2642 NetworkHelpers.FindFreePort ()));
2644 Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
2646 recv_thread.Start ();
2647 Thread.Sleep (250); /* Wait for the thread to be already receiving */
2650 if (CWRReady.WaitOne (1000, false) == false) {
2651 Assert.Fail ("CloseWhileReceiving wait timed out");
2654 Assert.IsFalse (CWRReceiving);
2657 static bool RRCLastRead = false;
2658 static ManualResetEvent RRCReady = new ManualResetEvent (false);
2660 private static void RRCClientThread (int port)
2662 byte[] bytes = new byte[8];
2665 Socket sock = new Socket (AddressFamily.InterNetwork,
2668 sock.Connect (new IPEndPoint (IPAddress.Loopback,
2671 NetworkStream stream = new NetworkStream (sock);
2673 readbyte = stream.ReadByte ();
2674 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1");
2676 stream.Read (bytes, 0, 0);
2678 readbyte = stream.ReadByte ();
2679 Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2");
2681 stream.Read (bytes, 0, 0);
2683 readbyte = stream.ReadByte ();
2684 Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3");
2692 [Test] // Receive (Byte [])
2693 public void Receive1_Buffer_Null ()
2695 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2699 s.Receive ((byte []) null);
2701 } catch (ArgumentNullException ex) {
2702 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2703 Assert.IsNull (ex.InnerException, "#3");
2704 Assert.IsNotNull (ex.Message, "#4");
2705 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2711 [Test] // Receive (Byte [])
2712 public void Receive1_Socket_Closed ()
2714 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2719 s.Receive ((byte []) null);
2721 } catch (ObjectDisposedException ex) {
2722 // Cannot access a disposed object
2723 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2724 Assert.IsNull (ex.InnerException, "#3");
2725 Assert.IsNotNull (ex.Message, "#4");
2726 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2730 [Test] // Receive (Byte [], SocketFlags)
2731 public void Receive2_Buffer_Null ()
2733 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2737 s.Receive ((byte []) null, (SocketFlags) 666);
2739 } catch (ArgumentNullException ex) {
2740 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2741 Assert.IsNull (ex.InnerException, "#3");
2742 Assert.IsNotNull (ex.Message, "#4");
2743 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2749 [Test] // Receive (Byte [], SocketFlags)
2750 public void Receive2_Socket_Closed ()
2752 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2757 s.Receive ((byte []) null, (SocketFlags) 666);
2759 } catch (ObjectDisposedException ex) {
2760 // Cannot access a disposed object
2761 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2762 Assert.IsNull (ex.InnerException, "#3");
2763 Assert.IsNotNull (ex.Message, "#4");
2764 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2768 [Test] // Receive (Byte [], Int32, SocketFlags)
2769 public void Receive3_Buffer_Null ()
2771 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2775 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2777 } catch (ArgumentNullException ex) {
2778 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2779 Assert.IsNull (ex.InnerException, "#3");
2780 Assert.IsNotNull (ex.Message, "#4");
2781 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2787 [Test] // Receive (Byte [], Int32, SocketFlags)
2788 public void Receive3_Socket_Closed ()
2790 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2795 s.Receive ((byte []) null, 0, (SocketFlags) 666);
2797 } catch (ObjectDisposedException ex) {
2798 // Cannot access a disposed object
2799 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2800 Assert.IsNull (ex.InnerException, "#3");
2801 Assert.IsNotNull (ex.Message, "#4");
2802 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2806 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2807 public void Receive4_Buffer_Null ()
2809 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2813 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2815 } catch (ArgumentNullException ex) {
2816 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2817 Assert.IsNull (ex.InnerException, "#3");
2818 Assert.IsNotNull (ex.Message, "#4");
2819 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2825 [Test] // Receive (Byte [], Int32, Int32, SocketFlags)
2826 public void Receive4_Socket_Closed ()
2828 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2833 s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
2835 } catch (ObjectDisposedException ex) {
2836 // Cannot access a disposed object
2837 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2838 Assert.IsNull (ex.InnerException, "#3");
2839 Assert.IsNotNull (ex.Message, "#4");
2840 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2844 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2845 public void Receive5_Buffer_Null ()
2847 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2852 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2854 } catch (ArgumentNullException ex) {
2855 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2856 Assert.IsNull (ex.InnerException, "#3");
2857 Assert.IsNotNull (ex.Message, "#4");
2858 Assert.AreEqual ("buffer", ex.ParamName, "#5");
2864 [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
2865 public void Receive5_Socket_Closed ()
2867 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2873 s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
2875 } catch (ObjectDisposedException ex) {
2876 // Cannot access a disposed object
2877 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2878 Assert.IsNull (ex.InnerException, "#3");
2879 Assert.IsNotNull (ex.Message, "#4");
2880 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2884 [Test] // Receive (IList<ArraySegment<Byte>>)
2885 public void Receive6_Buffers_Null ()
2887 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2891 s.Receive ((IList<ArraySegment<byte>>) null);
2893 } catch (ArgumentNullException ex) {
2894 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2895 Assert.IsNull (ex.InnerException, "#3");
2896 Assert.IsNotNull (ex.Message, "#4");
2897 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2903 [Test] // Receive (IList<ArraySegment<Byte>>)
2904 public void Receive6_Socket_Closed ()
2906 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2911 s.Receive ((IList<ArraySegment<byte>>) null);
2913 } catch (ObjectDisposedException ex) {
2914 // Cannot access a disposed object
2915 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2916 Assert.IsNull (ex.InnerException, "#3");
2917 Assert.IsNotNull (ex.Message, "#4");
2918 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2922 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2923 public void Receive7_Buffers_Null ()
2925 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2929 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2931 } catch (ArgumentNullException ex) {
2932 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2933 Assert.IsNull (ex.InnerException, "#3");
2934 Assert.IsNotNull (ex.Message, "#4");
2935 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2941 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
2942 public void Receive7_Socket_Closed ()
2944 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2949 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
2951 } catch (ObjectDisposedException ex) {
2952 // Cannot access a disposed object
2953 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2954 Assert.IsNull (ex.InnerException, "#3");
2955 Assert.IsNotNull (ex.Message, "#4");
2956 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
2960 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
2961 public void Receive8_Buffers_Null ()
2963 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2968 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
2971 } catch (ArgumentNullException ex) {
2972 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
2973 Assert.IsNull (ex.InnerException, "#3");
2974 Assert.IsNotNull (ex.Message, "#4");
2975 Assert.AreEqual ("buffers", ex.ParamName, "#5");
2981 [Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
2982 public void Receive8_Socket_Closed ()
2984 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
2990 s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
2993 } catch (ObjectDisposedException ex) {
2994 // Cannot access a disposed object
2995 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
2996 Assert.IsNull (ex.InnerException, "#3");
2997 Assert.IsNotNull (ex.Message, "#4");
2998 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3004 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3005 public void ReceiveFrom1_Buffer_Null ()
3007 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3010 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3012 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3014 } catch (ArgumentNullException ex) {
3015 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3016 Assert.IsNull (ex.InnerException, "#3");
3017 Assert.IsNotNull (ex.Message, "#4");
3018 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3024 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3025 public void ReceiveFrom1_RemoteEP_Null ()
3027 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3030 byte [] buffer = new byte [0];
3031 EndPoint remoteEP = null;
3033 s.ReceiveFrom (buffer, ref remoteEP);
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 ("remoteEP", ex.ParamName, "#5");
3045 [Test] // ReceiveFrom (Byte [], ref EndPoint)
3046 public void ReceiveFrom1_Socket_Closed ()
3048 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3052 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3054 s.ReceiveFrom ((Byte []) null, ref remoteEP);
3056 } catch (ObjectDisposedException ex) {
3057 // Cannot access a disposed object
3058 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3059 Assert.IsNull (ex.InnerException, "#3");
3060 Assert.IsNotNull (ex.Message, "#4");
3061 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3065 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3066 public void ReceiveFrom2_Buffer_Null ()
3068 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3071 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3073 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3075 } catch (ArgumentNullException ex) {
3076 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3077 Assert.IsNull (ex.InnerException, "#3");
3078 Assert.IsNotNull (ex.Message, "#4");
3079 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3085 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3086 public void ReceiveFrom2_RemoteEP_Null ()
3088 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3091 byte [] buffer = new byte [5];
3092 EndPoint remoteEP = null;
3094 s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP);
3096 } catch (ArgumentNullException ex) {
3097 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3098 Assert.IsNull (ex.InnerException, "#3");
3099 Assert.IsNotNull (ex.Message, "#4");
3100 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3106 [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
3107 public void ReceiveFrom2_Socket_Closed ()
3109 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3113 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3115 s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
3117 } catch (ObjectDisposedException ex) {
3118 // Cannot access a disposed object
3119 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3120 Assert.IsNull (ex.InnerException, "#3");
3121 Assert.IsNotNull (ex.Message, "#4");
3122 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3126 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3127 public void ReceiveFrom3_Buffer_Null ()
3129 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3132 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3134 s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
3137 } catch (ArgumentNullException ex) {
3138 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3139 Assert.IsNull (ex.InnerException, "#3");
3140 Assert.IsNotNull (ex.Message, "#4");
3141 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3147 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3148 public void ReceiveFrom3_RemoteEP_Null ()
3150 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3153 byte [] buffer = new byte [5];
3154 EndPoint remoteEP = null;
3156 s.ReceiveFrom (buffer, buffer.Length, (SocketFlags) 666, ref remoteEP);
3158 } catch (ArgumentNullException ex) {
3159 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3160 Assert.IsNull (ex.InnerException, "#3");
3161 Assert.IsNotNull (ex.Message, "#4");
3162 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3168 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3169 public void ReceiveFrom3_Size_OutOfRange ()
3172 byte [] buffer = new byte [5];
3173 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3176 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3179 s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP);
3180 Assert.Fail ("#A1");
3181 } catch (ArgumentOutOfRangeException ex) {
3182 // Specified argument was out of the range of valid values
3183 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3184 Assert.IsNull (ex.InnerException, "#A3");
3185 Assert.IsNotNull (ex.Message, "#A4");
3186 Assert.AreEqual ("size", ex.ParamName, "#A5");
3191 // size > buffer length
3192 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3195 s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666,
3197 Assert.Fail ("#B1");
3198 } catch (ArgumentOutOfRangeException ex) {
3199 // Specified argument was out of the range of valid values
3200 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3201 Assert.IsNull (ex.InnerException, "#B3");
3202 Assert.IsNotNull (ex.Message, "#B4");
3203 Assert.AreEqual ("size", ex.ParamName, "#B5");
3209 [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
3210 public void ReceiveFrom3_Socket_Closed ()
3212 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3216 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3218 s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
3221 } catch (ObjectDisposedException ex) {
3222 // Cannot access a disposed object
3223 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3224 Assert.IsNull (ex.InnerException, "#3");
3225 Assert.IsNotNull (ex.Message, "#4");
3226 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3230 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3231 public void ReceiveFrom4_Buffer_Null ()
3233 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3235 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3238 s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
3241 } catch (ArgumentNullException ex) {
3242 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3243 Assert.IsNull (ex.InnerException, "#3");
3244 Assert.IsNotNull (ex.Message, "#4");
3245 Assert.AreEqual ("buffer", ex.ParamName, "#5");
3249 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3250 public void ReceiveFrom4_Offset_OutOfRange ()
3253 byte [] buffer = new byte [5];
3254 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3257 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3260 s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666,
3262 Assert.Fail ("#A1");
3263 } catch (ArgumentOutOfRangeException ex) {
3264 // Specified argument was out of the range of valid values
3265 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3266 Assert.IsNull (ex.InnerException, "#A3");
3267 Assert.IsNotNull (ex.Message, "#A4");
3268 Assert.AreEqual ("offset", ex.ParamName, "#A5");
3273 // offset > buffer length
3274 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3277 s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666,
3279 Assert.Fail ("#B1");
3280 } catch (ArgumentOutOfRangeException ex) {
3281 // Specified argument was out of the range of valid values
3282 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3283 Assert.IsNull (ex.InnerException, "#B3");
3284 Assert.IsNotNull (ex.Message, "#B4");
3285 Assert.AreEqual ("offset", ex.ParamName, "#B5");
3291 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint)
3292 public void ReceiveFrom4_RemoteEP_Null ()
3294 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3296 byte [] buffer = new byte [5];
3297 EndPoint remoteEP = null;
3300 s.ReceiveFrom (buffer, 0, buffer.Length, (SocketFlags) 666, ref remoteEP);
3302 } catch (ArgumentNullException ex) {
3303 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
3304 Assert.IsNull (ex.InnerException, "#3");
3305 Assert.IsNotNull (ex.Message, "#4");
3306 Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
3312 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
3313 public void ReceiveFrom4_Size_OutOfRange ()
3316 byte [] buffer = new byte [5];
3317 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3320 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3323 s.ReceiveFrom (buffer, 0, -1, (SocketFlags) 666,
3325 Assert.Fail ("#A1");
3326 } catch (ArgumentOutOfRangeException ex) {
3327 // Specified argument was out of the range of valid values
3328 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
3329 Assert.IsNull (ex.InnerException, "#A3");
3330 Assert.IsNotNull (ex.Message, "#A4");
3331 Assert.AreEqual ("size", ex.ParamName, "#A5");
3336 // size > buffer length
3337 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3340 s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (SocketFlags) 666,
3342 Assert.Fail ("#B1");
3343 } catch (ArgumentOutOfRangeException ex) {
3344 // Specified argument was out of the range of valid values
3345 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
3346 Assert.IsNull (ex.InnerException, "#B3");
3347 Assert.IsNotNull (ex.Message, "#B4");
3348 Assert.AreEqual ("size", ex.ParamName, "#B5");
3353 // offset + size > buffer length
3354 s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3357 s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP);
3358 Assert.Fail ("#C1");
3359 } catch (ArgumentOutOfRangeException ex) {
3360 // Specified argument was out of the range of valid values
3361 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
3362 Assert.IsNull (ex.InnerException, "#C3");
3363 Assert.IsNotNull (ex.Message, "#C4");
3364 Assert.AreEqual ("size", ex.ParamName, "#C5");
3370 [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
3371 public void ReceiveFrom4_Socket_Closed ()
3373 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
3377 byte [] buffer = new byte [5];
3378 EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3380 s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
3383 } catch (ObjectDisposedException ex) {
3384 // Cannot access a disposed object
3385 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3386 Assert.IsNull (ex.InnerException, "#3");
3387 Assert.IsNotNull (ex.Message, "#4");
3388 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3393 public void ReceiveRemoteClosed ()
3395 var port = NetworkHelpers.FindFreePort ();
3396 Socket sock = new Socket (AddressFamily.InterNetwork,
3399 sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
3403 Thread client_thread = new Thread (() => RRCClientThread (port));
3404 client_thread.Start ();
3406 Socket client = sock.Accept ();
3407 NetworkStream stream = new NetworkStream (client);
3408 stream.WriteByte (0x00);
3409 stream.WriteByte (0x00);
3413 RRCReady.WaitOne (1000, false);
3414 Assert.IsTrue (RRCLastRead);
3418 // Test case for bug #471580
3420 public void UdpDoubleBind ()
3422 using (Socket s = new Socket (AddressFamily.InterNetwork,
3423 SocketType.Dgram, ProtocolType.Udp))
3424 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3425 SocketType.Dgram, ProtocolType.Udp)) {
3426 var supportsReuseAddress = true;
3428 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3429 } catch (SocketException e) {
3430 // Exception is thrown when ReuseAddress is not supported
3431 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3432 "Expected SocketError.OperationNotSupported");
3433 supportsReuseAddress = false;
3436 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3439 if (supportsReuseAddress)
3440 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3443 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3444 if (!supportsReuseAddress)
3445 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3446 } catch (SocketException e) {
3451 // Test case for bug #31557
3453 public void TcpDoubleBind ()
3455 using (Socket s = new Socket (AddressFamily.InterNetwork,
3456 SocketType.Stream, ProtocolType.Tcp))
3457 using (Socket ss = new Socket (AddressFamily.InterNetwork,
3458 SocketType.Stream, ProtocolType.Tcp)) {
3459 var supportsReuseAddress = true;
3461 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3462 } catch (SocketException e) {
3463 // Exception is thrown when ReuseAddress is not supported
3464 Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
3465 "Expected SocketError.OperationNotSupported");
3466 supportsReuseAddress = false;
3469 var ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
3473 if (supportsReuseAddress)
3474 ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
3477 ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
3479 if (!supportsReuseAddress)
3480 Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
3481 } catch (SocketException e) {
3487 [Category ("NotOnMac")]
3488 public void ConnectedProperty ()
3490 TcpListener listener = new TcpListener (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
3493 Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3494 client.Connect (IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
3495 Socket server = listener.AcceptSocket ();
3498 server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null));
3501 server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null));
3504 Assert.IsTrue (!client.Connected);
3505 Assert.IsTrue (!server.Connected);
3513 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
3514 public void GetSocketOption1_Socket_Closed ()
3516 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3519 s.GetSocketOption (0, 0);
3521 } catch (ObjectDisposedException ex) {
3522 // Cannot access a disposed object
3523 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3524 Assert.IsNull (ex.InnerException, "#3");
3525 Assert.IsNotNull (ex.Message, "#4");
3526 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3530 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3531 public void GetSocketOption2_OptionValue_Null ()
3533 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3535 s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3538 } catch (SocketException ex) {
3539 // The system detected an invalid pointer address in attempting
3540 // to use a pointer argument in a call
3541 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3542 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3543 Assert.IsNull (ex.InnerException, "#4");
3544 Assert.IsNotNull (ex.Message, "#5");
3545 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3546 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3550 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3551 public void GetSocketOption2_Socket_Closed ()
3553 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3556 s.GetSocketOption (0, 0, (byte []) null);
3558 } catch (ObjectDisposedException ex) {
3559 // Cannot access a disposed object
3560 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3561 Assert.IsNull (ex.InnerException, "#3");
3562 Assert.IsNotNull (ex.Message, "#4");
3563 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3567 [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3568 public void GetSocketOption3_Socket_Closed ()
3570 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3573 s.GetSocketOption (0, 0, 0);
3575 } catch (ObjectDisposedException ex) {
3576 // Cannot access a disposed object
3577 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3578 Assert.IsNull (ex.InnerException, "#3");
3579 Assert.IsNotNull (ex.Message, "#4");
3580 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3584 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3585 public void SetSocketOption1_DontLinger ()
3587 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3588 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3589 new byte [] { 0x00 });
3590 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3591 new byte [] { 0x01 });
3595 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3596 public void SetSocketOption1_DontLinger_Null ()
3598 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3600 s.SetSocketOption (SocketOptionLevel.Socket,
3601 SocketOptionName.DontLinger, (byte []) null);
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");
3616 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3617 public void SetSocketOption1_Linger_Null ()
3619 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3621 s.SetSocketOption (SocketOptionLevel.Socket,
3622 SocketOptionName.DontLinger, (byte []) null);
3624 } catch (SocketException ex) {
3625 // The system detected an invalid pointer address in attempting
3626 // to use a pointer argument in a call
3627 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3628 Assert.AreEqual (10014, ex.ErrorCode, "#3");
3629 Assert.IsNull (ex.InnerException, "#4");
3630 Assert.IsNotNull (ex.Message, "#5");
3631 Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
3632 Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
3637 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
3638 public void SetSocketOption1_Socket_Close ()
3640 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3643 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
3644 new byte [] { 0x00 });
3646 } catch (ObjectDisposedException ex) {
3647 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3648 Assert.IsNull (ex.InnerException, "#3");
3649 Assert.IsNotNull (ex.Message, "#4");
3650 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3654 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3655 public void SetSocketOption2_DontLinger ()
3657 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3658 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3659 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
3663 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3664 [Category ("NotWorking")]
3665 public void SetSocketOption2_Linger ()
3667 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3668 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
3669 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
3673 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
3674 public void SetSocketOption2_Socket_Closed ()
3676 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
3679 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
3681 } catch (ObjectDisposedException ex) {
3682 // Cannot access a disposed object
3683 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
3684 Assert.IsNull (ex.InnerException, "#3");
3685 Assert.IsNotNull (ex.Message, "#4");
3686 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
3690 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3691 public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
3693 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3695 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3696 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3698 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3699 new IPv6MulticastOption (mcast_addr));
3701 } catch (ArgumentException ex) {
3702 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3703 Assert.IsNull (ex.InnerException, "#3");
3704 Assert.IsNotNull (ex.Message, "#4");
3705 // The specified value is not a valid 'MulticastOption'
3706 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3707 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3712 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3713 public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
3715 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3717 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3718 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3719 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3720 new MulticastOption (mcast_addr));
3724 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3725 [Category ("NotWorking")]
3726 public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
3728 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3730 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3732 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3733 new MulticastOption (mcast_addr));
3735 } catch (SocketException ex) {
3736 // An invalid argument was supplied
3737 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3738 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3739 Assert.IsNull (ex.InnerException, "#4");
3740 Assert.IsNotNull (ex.Message, "#5");
3741 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3742 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3748 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3749 public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
3751 if (!Socket.OSSupportsIPv6)
3752 Assert.Ignore ("IPv6 not enabled.");
3754 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3756 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3757 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3758 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3759 new IPv6MulticastOption (mcast_addr));
3763 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3764 public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
3766 if (!Socket.OSSupportsIPv6)
3767 Assert.Ignore ("IPv6 not enabled.");
3769 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3771 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3772 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
3774 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3775 new MulticastOption (mcast_addr));
3777 } catch (ArgumentException ex) {
3778 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3779 Assert.IsNull (ex.InnerException, "#3");
3780 Assert.IsNotNull (ex.Message, "#4");
3781 // The specified value is not a valid 'IPv6MulticastOption'
3782 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
3783 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3788 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3789 [Category ("NotWorking")]
3790 public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
3792 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
3794 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
3796 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3797 new IPv6MulticastOption (mcast_addr));
3799 } catch (SocketException ex) {
3800 // An invalid argument was supplied
3801 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3802 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3803 Assert.IsNull (ex.InnerException, "#4");
3804 Assert.IsNotNull (ex.Message, "#5");
3805 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3806 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3812 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3813 public void SetSocketOption3_DontLinger_Boolean ()
3815 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3817 s.SetSocketOption (SocketOptionLevel.Socket,
3818 SocketOptionName.DontLinger, (object) false);
3820 } catch (ArgumentException ex) {
3821 // The specified value is not valid
3822 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3823 Assert.IsNull (ex.InnerException, "#3");
3824 Assert.IsNotNull (ex.Message, "#4");
3825 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3830 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3831 public void SetSocketOption3_DontLinger_Int32 ()
3833 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3835 s.SetSocketOption (SocketOptionLevel.Socket,
3836 SocketOptionName.DontLinger, (object) 0);
3838 } catch (ArgumentException ex) {
3839 // The specified value is not valid
3840 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3841 Assert.IsNull (ex.InnerException, "#3");
3842 Assert.IsNotNull (ex.Message, "#4");
3843 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3848 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3849 public void SetSocketOption3_DontLinger_LingerOption ()
3851 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3853 s.SetSocketOption (SocketOptionLevel.Socket,
3854 SocketOptionName.DontLinger, new LingerOption (true, 1000));
3856 } catch (ArgumentException ex) {
3857 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3858 Assert.IsNull (ex.InnerException, "#3");
3859 // The specified value is not valid
3860 Assert.IsNotNull (ex.Message, "#4");
3861 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3866 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3867 public void SetSocketOption3_Linger_Boolean ()
3869 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3871 s.SetSocketOption (SocketOptionLevel.Socket,
3872 SocketOptionName.Linger, (object) false);
3874 } catch (ArgumentException ex) {
3875 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3876 Assert.IsNull (ex.InnerException, "#3");
3877 // The specified value is not valid
3878 Assert.IsNotNull (ex.Message, "#4");
3879 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3884 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3885 public void SetSocketOption3_Linger_Int32 ()
3887 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3889 s.SetSocketOption (SocketOptionLevel.Socket,
3890 SocketOptionName.Linger, (object) 0);
3892 } catch (ArgumentException ex) {
3893 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3894 Assert.IsNull (ex.InnerException, "#3");
3895 // The specified value is not valid
3896 Assert.IsNotNull (ex.Message, "#4");
3897 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
3902 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3903 public void SetSocketOption3_Linger_LingerOption ()
3905 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
3906 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3907 new LingerOption (false, 0));
3908 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3909 new LingerOption (true, 0));
3910 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3911 new LingerOption (false, 1000));
3912 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
3913 new LingerOption (true, 1000));
3917 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3918 public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
3920 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3922 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3923 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3924 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3925 new MulticastOption (mcast_addr));
3927 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3928 new IPv6MulticastOption (mcast_addr));
3930 } catch (ArgumentException ex) {
3931 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
3932 Assert.IsNull (ex.InnerException, "#3");
3933 Assert.IsNotNull (ex.Message, "#4");
3934 // The specified value is not a valid 'MulticastOption'
3935 Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
3936 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
3941 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3942 public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
3944 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3946 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
3947 MulticastOption option = new MulticastOption (mcast_addr);
3949 s.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
3950 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
3952 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3957 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3958 [Category ("NotWorking")]
3959 public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
3961 IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
3963 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3965 s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
3966 new MulticastOption (mcast_addr));
3968 } catch (SocketException ex) {
3969 // An invalid argument was supplied
3970 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
3971 Assert.AreEqual (10022, ex.ErrorCode, "#3");
3972 Assert.IsNull (ex.InnerException, "#4");
3973 Assert.IsNotNull (ex.Message, "#5");
3974 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
3975 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
3981 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
3982 public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
3984 if (!Socket.OSSupportsIPv6)
3985 Assert.Ignore ("IPv6 not enabled.");
3987 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
3988 IPv6MulticastOption option = new IPv6MulticastOption (
3989 IPAddress.Parse ("ff02::1"));
3991 s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902));
3992 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
3994 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
3999 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4000 public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
4002 if (!Socket.OSSupportsIPv6)
4003 Assert.Ignore ("IPv6 not enabled.");
4005 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4007 using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
4008 s.Bind (new IPEndPoint (IPAddress.IPv6Any, NetworkHelpers.FindFreePort ()));
4009 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
4010 new IPv6MulticastOption (mcast_addr));
4012 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4013 new MulticastOption (mcast_addr));
4015 } catch (ArgumentException ex) {
4016 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
4017 Assert.IsNull (ex.InnerException, "#3");
4018 Assert.IsNotNull (ex.Message, "#4");
4019 // The specified value is not a valid 'IPv6MulticastOption'
4020 Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
4021 Assert.AreEqual ("optionValue", ex.ParamName, "#6");
4026 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4027 [Category ("NotWorking")]
4028 public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
4030 IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
4032 Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
4034 s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
4035 new IPv6MulticastOption (mcast_addr));
4037 } catch (SocketException ex) {
4038 // An invalid argument was supplied
4039 Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
4040 Assert.AreEqual (10022, ex.ErrorCode, "#3");
4041 Assert.IsNull (ex.InnerException, "#4");
4042 Assert.IsNotNull (ex.Message, "#5");
4043 Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
4044 Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
4050 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4051 public void SetSocketOption3_OptionValue_Null ()
4053 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4055 s.SetSocketOption (SocketOptionLevel.Socket,
4056 SocketOptionName.Linger, (object) null);
4058 } catch (ArgumentNullException ex) {
4059 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
4060 Assert.IsNull (ex.InnerException, "#3");
4061 Assert.IsNotNull (ex.Message, "#4");
4062 Assert.AreEqual ("optionValue", ex.ParamName, "#5");
4067 [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
4068 public void SetSocketOption3_Socket_Closed ()
4070 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4073 s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
4074 new LingerOption (false, 0));
4076 } catch (ObjectDisposedException ex) {
4077 // Cannot access a disposed object
4078 Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
4079 Assert.IsNull (ex.InnerException, "#3");
4080 Assert.IsNotNull (ex.Message, "#4");
4081 Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
4086 public void SetSocketOption_MulticastInterfaceIndex_Any ()
4088 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4090 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4092 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4093 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4098 public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
4100 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4102 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4104 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4105 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4110 public void SetSocketOption_MulticastInterfaceIndex_Invalid ()
4112 IPAddress ip = IPAddress.Parse ("239.255.255.250");
4114 using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
4118 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
4125 s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
4134 public void Shutdown_NoConnect ()
4136 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4137 s.Bind (new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ()));
4140 s.Shutdown (SocketShutdown.Both);
4142 } catch (SocketException exc) {
4143 Assert.AreEqual (10057, exc.ErrorCode, "#2");
4150 [ExpectedException (typeof (NullReferenceException))]
4151 public void ReceiveAsync_Null ()
4153 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4154 s.ReceiveAsync (null);
4159 [ExpectedException (typeof (NullReferenceException))]
4160 public void ReceiveAsync_Default ()
4162 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4163 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4164 s.ReceiveAsync (saea);
4170 [ExpectedException (typeof (NullReferenceException))]
4171 public void ReceiveAsync_NullBuffer ()
4173 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4174 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4175 saea.SetBuffer (null, 0, 0);
4176 s.ReceiveAsync (null);
4181 [ExpectedException (typeof (ObjectDisposedException))]
4182 public void ReceiveAsync_ClosedSocket ()
4184 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4186 s.ReceiveAsync (null);
4190 [ExpectedException (typeof (NullReferenceException))]
4191 public void SendAsync_Null ()
4193 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4199 [ExpectedException (typeof (NullReferenceException))]
4200 public void SendAsync_Default ()
4202 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4203 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4210 [ExpectedException (typeof (NullReferenceException))]
4211 public void SendAsync_NullBuffer ()
4213 using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
4214 SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
4215 saea.SetBuffer (null, 0, 0);
4221 [ExpectedException (typeof (ObjectDisposedException))]
4222 public void SendAsync_ClosedSocket ()
4224 Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4230 public void SendAsyncFile ()
4232 Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4234 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
4235 serverSocket.Listen (1);
4237 var mReceived = new ManualResetEvent (false);
4239 serverSocket.BeginAccept (AsyncCall => {
4240 byte[] bytes = new byte [1024];
4242 Socket listener = (Socket)AsyncCall.AsyncState;
4243 Socket client = listener.EndAccept (AsyncCall);
4244 client.Receive (bytes, bytes.Length, 0);
4249 Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
4250 clientSocket.Connect (serverSocket.LocalEndPoint);
4251 clientSocket.NoDelay = true;
4253 // Initialize buffer used to create testing file
4254 var buffer = new byte [1024];
4255 for (int i = 0; i < 1024; ++i)
4256 buffer [i] = (byte) (i % 256);
4258 string temp = Path.GetTempFileName ();
4260 // Testing file creation
4261 using (StreamWriter sw = new StreamWriter (temp)) {
4265 var mSent = new ManualResetEvent (false);
4267 // Async Send File to server
4268 clientSocket.BeginSendFile(temp, (ar) => {
4269 Socket client = (Socket) ar.AsyncState;
4270 client.EndSendFile (ar);
4274 if (!mSent.WaitOne (1500))
4275 throw new TimeoutException ();
4276 if (!mReceived.WaitOne (1500))
4277 throw new TimeoutException ();
4279 if (File.Exists (temp))
4282 clientSocket.Close ();
4283 serverSocket.Close ();
4288 public void ConnectToIPV4EndPointUsingDualModelSocket () {
4289 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4290 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4291 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4296 var ep = server.LocalEndPoint as IPEndPoint;
4298 client.Connect (ep);
4299 client.Disconnect (true);
4301 client.Connect (IPAddress.Loopback, ep.Port);
4302 client.Disconnect (true);
4304 client.Connect (new [] {IPAddress.Loopback}, ep.Port);
4305 client.Disconnect (true);
4310 public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
4311 using (var server = new Socket (SocketType.Stream, ProtocolType.Tcp))
4312 using (var client = new Socket (SocketType.Stream, ProtocolType.Tcp)) {
4313 var host = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
4318 var ep = server.LocalEndPoint as IPEndPoint;
4320 BCCalledBack.Reset ();
4321 var ar1 = client.BeginConnect (ep, BCCallback, client);
4322 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
4323 client.Disconnect (true);
4325 BCCalledBack.Reset ();
4326 var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
4327 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4328 client.Disconnect (true);
4330 BCCalledBack.Reset ();
4331 var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
4332 Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
4333 client.Disconnect (true);
4338 public void UdpMulticasTimeToLive ()
4340 /* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
4342 using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
4343 IPEndPoint end_point = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
4344 socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
4345 socket.Bind (end_point);
4346 socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);
4350 [Test] // Covers 41616
4351 public void ConnectAsyncUnhandledEx ()
4353 var mre = new ManualResetEvent (false);
4355 var endPoint = new IPEndPoint(0,0);
4356 var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Unspecified);
4358 var socketArgs = new SocketAsyncEventArgs();
4359 socketArgs.RemoteEndPoint = endPoint;
4360 socketArgs.Completed += (sender, e) => mre.Set ();
4362 socket.ConnectAsync (socketArgs);
4364 Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");