Pat Tullmann 0cb742dafb binfmt-detector-cli: rewrite to support PE32+ binaries (#38)
Rewrite with hard-coded offsets into the PE file format to discern
if a binary is PE32 or PE32+, and then to determine if it contains
a "CLR Data Directory" entry that looks valid.

Tested with PE32 and PE32+ compiled Mono binaries, PE32 and PE32+ native
binaries, and a random assortment of garbage files.

Former-commit-id: 9e7ac86ec84f653a2f79b87183efd5b0ebda001b
2023-10-16 20:16:47 +02:00

4805 lines
138 KiB
C#
Executable File

// System.Net.Sockets.SocketTest.cs
//
// Authors:
// Brad Fitzpatrick (brad@danga.com)
// Gonzalo Paniagua Javier (gonzalo@novell.com)
//
// (C) Copyright 2003 Brad Fitzpatrick
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
//
using System;
using System.Diagnostics;
using System.Linq;
using System.Collections;
using System.Threading;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using NUnit.Framework;
using System.IO;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using MonoTests.Helpers;
namespace MonoTests.System.Net.Sockets
{
[TestFixture]
[Category("NotWasm")]
public class SocketTest
{
public const string BogusAddress = "192.168.244.244";
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectIPAddressAny ()
{
IPEndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
/* UDP sockets use Any to disconnect
try {
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
s.Connect (ep);
s.Close ();
}
Assert.Fail ("#1");
} catch (SocketException ex) {
Assert.AreEqual (10049, ex.ErrorCode, "#2");
}
*/
try {
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.Connect (ep);
s.Close ();
}
Assert.Fail ("#3");
} catch (SocketException ex) {
Assert.AreEqual (10049, ex.ErrorCode, "#4");
}
}
[Test]
[Ignore ("Bug #75158")] // Looks like MS fails after the .ctor, when you try to use the socket
public void IncompatibleAddress ()
{
IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any, 0);
try {
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)) {
s.Connect (epIPv6);
s.Close ();
}
Assert.Fail ("#1");
} catch (SocketException ex) {
// address incompatible with protocol
int expectedError = 10047;
Assert.AreEqual (expectedError, ex.ErrorCode,
"#2");
}
}
[Test]
[Category ("NotWorking")]
[Category ("InetAccess")]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BogusEndConnect ()
{
IPAddress ipOne = IPAddress.Parse (BogusAddress);
IPEndPoint ipEP = new IPEndPoint (ipOne, NetworkHelpers.FindFreePort ());
Socket sock = new Socket (ipEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult ar = sock.BeginConnect (ipEP, null, null);
try {
// should raise an exception because connect was bogus
sock.EndConnect (ar);
Assert.Fail ("#1");
} catch (SocketException ex) {
// Actual error code depends on network configuration.
var error = (SocketError) ex.ErrorCode;
Assert.That (error == SocketError.TimedOut ||
error == SocketError.ConnectionRefused ||
error == SocketError.NetworkUnreachable ||
error == SocketError.HostUnreachable, "#2");
}
}
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void SelectEmpty ()
{
ArrayList list = new ArrayList ();
Socket.Select (list, list, list, 1000);
}
private bool BlockingConnect (bool block, ref int port)
{
IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, port);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
server.Bind(ep);
server.Blocking=block;
ep = (IPEndPoint) server.LocalEndPoint;
port = ep.Port;
server.Listen(0);
Socket conn = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
conn.Connect (ep);
Socket client = null;
var sw = Stopwatch.StartNew ();
while (sw.ElapsedMilliseconds < 100)
{
try {
client = server.Accept();
break;
}
catch (SocketException ex) {
if (ex.SocketErrorCode == SocketError.WouldBlock)
continue;
throw;
}
}
Assert.IsNotNull (client, "Couldn't accept a client connection within 100ms.");
bool client_block = client.Blocking;
client.Close();
conn.Close();
server.Close();
return(client_block);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
[Ignore ("https://github.com/mono/mono/issues/6513")] // frequently fails on ARM
public void AcceptBlockingStatus()
{
bool block;
int port = 0;
block = BlockingConnect(true, ref port);
Assert.AreEqual (block, true, "BlockingStatus01");
block = BlockingConnect(false, ref port);
Assert.AreEqual (block, false, "BlockingStatus02");
}
static bool CFAConnected = false;
static ManualResetEvent CFACalledBack;
private static void CFACallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
CFAConnected = sock.Connected;
if (sock.Connected) {
sock.EndConnect (asyncResult);
}
CFACalledBack.Set ();
}
[Test] // Connect (IPEndPoint)
public void Connect1_RemoteEP_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try {
s.Connect ((IPEndPoint) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectFailAsync ()
{
// XXX: Hangs on AIX
if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("AIX")))
Assert.Ignore ("Skipping on AIX/i");
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Blocking = false;
CFACalledBack = new ManualResetEvent (false);
CFACalledBack.Reset ();
/* Need a port that is not being used for
* anything...
*/
sock.BeginConnect (new IPEndPoint (IPAddress.Loopback,
NetworkHelpers.FindFreePort ()),
new AsyncCallback (CFACallback),
sock);
CFACalledBack.WaitOne ();
Assert.AreEqual (CFAConnected, false, "ConnectFail");
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOptionBoolean ()
{
IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 0);
Socket sock = new Socket (ep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try {
sock.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void TestSelect1 ()
{
Socket srv = CreateServer (0);
ClientSocket clnt = new ClientSocket (srv.LocalEndPoint);
Socket acc = null;
try {
clnt.Connect ();
clnt.Write ();
acc = srv.Accept ();
ArrayList list = new ArrayList ();
ArrayList empty = new ArrayList ();
list.Add (acc);
Socket.Select (list, empty, empty, 1000);
Assert.AreEqual (0, empty.Count, "#01");
Assert.AreEqual (1, list.Count, "#02");
Socket.Select (empty, list, empty, 1000);
Assert.AreEqual (0, empty.Count, "#03");
Assert.AreEqual (1, list.Count, "#04");
Socket.Select (list, empty, empty, -1);
Assert.AreEqual (0, empty.Count, "#05");
Assert.AreEqual (1, list.Count, "#06");
// Need to read the 10 bytes from the client to avoid a RST
byte [] bytes = new byte [10];
acc.Receive (bytes);
} finally {
if (acc != null)
acc.Close ();
srv.Close ();
clnt.Close ();
}
}
static Socket CreateServer (int port)
{
Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind (new IPEndPoint (IPAddress.Loopback, port));
sock.Listen (1);
return sock;
}
class ClientSocket {
Socket sock;
EndPoint ep;
public ClientSocket (EndPoint ep)
{
this.ep = ep;
sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Connect ()
{
sock.Connect (ep);
}
public void Close ()
{
sock.Close ();
}
public void Write ()
{
byte [] b = new byte [10];
sock.Send (b);
}
}
byte[] buf = new byte[100];
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed2 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Blocking = true;
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed6 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Listen (5);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed7 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Poll (100, 0);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed15 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Send (buf);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed16 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Send (buf, 0);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed17 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Send (buf, 10, 0);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed18 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Send (buf, 0, 10, 0);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof (ObjectDisposedException))]
#endif
public void Disposed19 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
s.Close();
s.SendTo (buf, 0, ep);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof (ObjectDisposedException))]
#endif
public void Disposed20 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
s.Close();
s.SendTo (buf, 10, 0, ep);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof (ObjectDisposedException))]
#endif
public void Disposed21 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
s.Close();
s.SendTo (buf, 0, 10, 0, ep);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof (ObjectDisposedException))]
#endif
public void Disposed22 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ());
s.Close();
s.SendTo (buf, ep);
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void Disposed23 ()
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Close();
s.Shutdown (0);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void GetHashCodeTest ()
{
Socket server = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
server.Bind (IPAddress.Loopback, out IPEndPoint ep);
server.Listen (1);
Socket client = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
int hashcodeA = client.GetHashCode ();
client.Connect (ep);
int hashcodeB = client.GetHashCode ();
Assert.AreEqual (hashcodeA, hashcodeB, "#1");
client.Close ();
int hashcodeC = client.GetHashCode ();
Assert.AreEqual (hashcodeB, hashcodeC, "#2");
server.Close ();
}
static ManualResetEvent SocketError_event = new ManualResetEvent (false);
private static void SocketError_callback (IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
if(sock.Connected) {
sock.EndConnect (ar);
}
SocketError_event.Set ();
}
[Test]
[Category ("RequiresBSDSockets")] // This verifies particular error codes, which we don't care about when nothing's working anyway.
public void SocketErrorTest ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
SocketError_event.Reset ();
sock.Blocking = false;
sock.BeginConnect (ep, new AsyncCallback(SocketError_callback),
sock);
if (SocketError_event.WaitOne (5000, false) == false) {
Assert.Fail ("SocketError wait timed out");
}
Assert.AreEqual (false, sock.Connected, "SocketError #1");
int error;
error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
Assert.AreEqual (10061, error, "SocketError #2");
error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error);
Assert.AreEqual (10061, error, "SocketError #3");
sock.Close ();
}
[Test]
public void SocketInformationCtor ()
{
}
[Test]
public void DontFragmentDefaultTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultTcp");
sock.Close ();
}
[Test]
[Category ("NotWorking")] // DontFragment doesn't work
public void DontFragmentChangeTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.DontFragment = true;
Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeTcp");
sock.Close ();
}
[Test]
public void DontFragmentDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultUdp");
sock.Close ();
}
[Test]
[Category ("NotWorking")] // DontFragment doesn't work
public void DontFragmentChangeUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
sock.DontFragment = true;
Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeUdp");
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void DontFragmentClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.DontFragment;
}
[Test]
[Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
public void DontFragment ()
{
Socket sock = new Socket (AddressFamily.NetBios,
SocketType.Seqpacket,
ProtocolType.Unspecified);
try {
sock.DontFragment = true;
Assert.Fail ("DontFragment #1");
} catch (NotSupportedException) {
} finally {
sock.Close ();
}
}
[Test]
public void EnableBroadcastDefaultTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
bool value = sock.EnableBroadcast;
Assert.Fail ("EnableBroadcastDefaultTcp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastDefaultTcp #2");
} finally {
sock.Close ();
}
}
[Test]
public void EnableBroadcastDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp");
sock.Close ();
}
[Test]
public void EnableBroadcastChangeTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.EnableBroadcast = true;
Assert.Fail ("EnableBroadcastChangeTcp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode, "EnableBroadcastChangeTcp #2");
} finally {
sock.Close ();
}
}
[Test]
public void EnableBroadcastChangeUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
sock.EnableBroadcast = true;
Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp");
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void EnableBroadcastClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
sock.Close ();
bool val = sock.EnableBroadcast;
}
/* Can't test the default for ExclusiveAddressUse as
* it's different on different versions and service
* packs of windows
*/
[Test]
[Category ("NotWorking")] // Not supported on Linux
public void ExclusiveAddressUseUnbound ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.ExclusiveAddressUse = true;
Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound");
sock.Close ();
}
[Test]
[ExpectedException (typeof(InvalidOperationException))]
[Category ("NotWorking")] // Not supported on Linux
public void ExclusiveAddressUseBound ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (new IPEndPoint (IPAddress.Any, NetworkHelpers.FindFreePort ()));
sock.ExclusiveAddressUse = true;
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void ExclusiveAddressUseClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.ExclusiveAddressUse;
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void IsBoundTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1");
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2");
sock.Listen (1);
Socket sock2 = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3");
sock2.Connect (ep);
Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4");
sock2.Close ();
Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5");
sock.Close ();
Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6");
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void IsBoundUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1");
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2");
sock.Close ();
Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3");
sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4");
sock.Connect (ep);
Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5");
sock.Close ();
Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6");
}
[Test]
/* Should not throw an exception */
public void IsBoundClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.IsBound;
}
/* Nothing much to test for LingerState */
[Test]
public void MulticastLoopbackDefaultTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
bool value = sock.MulticastLoopback;
Assert.Fail ("MulticastLoopbackDefaultTcp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackDefaultTcp #2");
} finally {
sock.Close ();
}
}
[Test]
public void MulticastLoopbackChangeTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.MulticastLoopback = false;
Assert.Fail ("MulticastLoopbackChangeTcp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode, "MulticastLoopbackChangeTcp #2");
} finally {
sock.Close ();
}
}
[Test]
public void MulticastLoopbackDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp");
sock.Close ();
}
[Test]
public void MulticastLoopbackChangeUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
sock.MulticastLoopback = false;
Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp");
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void MulticastLoopbackClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.MulticastLoopback;
}
/* OSSupportsIPv6 depends on the environment */
[Test]
[Category("NotWorking")] // We have different defaults for perf reasons
public void ReceiveBufferSizeDefault ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault");
sock.Close ();
}
[Test]
[Category("NotWorking")] // We have different defaults for perf reasons
public void ReceiveBufferSizeDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp");
sock.Close ();
}
[Test]
public void ReceiveBufferSizeChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.ReceiveBufferSize = 16384;
Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange");
sock.Close ();
}
[Test]
[Category("NotWorking")] // We cannot totally remove buffers (minimum is set to 256
public void BuffersCheck_None ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
int original = s.ReceiveBufferSize;
s.ReceiveBufferSize = 0;
Assert.AreEqual (0, s.ReceiveBufferSize, "ReceiveBufferSize " + original.ToString ());
original = s.SendBufferSize;
s.SendBufferSize = 0;
Assert.AreEqual (0, s.SendBufferSize, "SendBufferSize " + original.ToString ());
}
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void ReceiveBufferSizeClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
int val = sock.ReceiveBufferSize;
}
[Test]
[Category("NotWorking")] // We have different defaults for perf reasons
public void SendBufferSizeDefault ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault");
sock.Close ();
}
[Test]
[Category("NotWorking")] // We have different defaults for perf reasons
public void SendBufferSizeDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp");
sock.Close ();
}
[Test]
public void SendBufferSizeChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.SendBufferSize = 16384;
Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange");
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void SendBufferSizeClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
int val = sock.SendBufferSize;
}
/* No test for TTL default as it's platform dependent */
[Test]
public void TtlChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Ttl = 255;
Assert.AreEqual (255, sock.Ttl, "TtlChange");
sock.Close ();
}
[Test]
public void TtlChangeOverflow ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.Ttl = 256;
Assert.Fail ("TtlChangeOverflow #1");
} catch (ArgumentOutOfRangeException ex) {
Assert.AreEqual ("value", ex.ParamName,
"TtlChangeOverflow #2");
} finally {
sock.Close ();
}
}
/* Apparently you can set TTL=0 on the ms runtime!!
try {
sock.Ttl = 0;
Assert.Fail ("TtlChangeOverflow #4");
} catch (SocketException ex) {
Assert.AreEqual (10022, ex.ErrorCode,
"TtlChangeOverflow #5");
} finally {
sock.Close ();
}
*/
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void TtlClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
int val = sock.Ttl;
}
[Test]
public void UseOnlyOverlappedIODefault ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault");
sock.Close ();
}
//
// We need this because the Linux kernel in certain configurations
// will end up rounding up the values passed on to the kernel
// for socket send/receive timeouts.
//
int Approximate (int target, int value)
{
int epsilon = 10;
if (value > target-10 && value < target+10)
return target;
return value;
}
[Test]
public void UseOnlyOverlappedIOChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.UseOnlyOverlappedIO = true;
Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange");
sock.Close ();
}
[Test]
/* Should not throw an exception */
public void UseOnlyOverlappedIOClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.UseOnlyOverlappedIO;
}
[Test]
public void SendTimeoutDefault ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault");
sock.Close ();
}
[Test]
public void SendTimeoutChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
/* Should be rounded up to 500, according to
* the MSDN docs, but the MS runtime doesn't
*/
sock.SendTimeout = 50;
Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1");
sock.SendTimeout = 2000;
Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2");
sock.SendTimeout = 0;
Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3");
/* Should be the same as setting 0 */
sock.SendTimeout = -1;
Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4");
sock.SendTimeout = 65536;
Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5");
try {
sock.SendTimeout = -2;
Assert.Fail ("SendTimeoutChange #8");
} catch (ArgumentOutOfRangeException) {
} finally {
sock.Close ();
}
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void SendTimeoutClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
int val = sock.SendTimeout;
}
[Test]
public void ReceiveTimeoutDefault ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault");
sock.Close ();
}
[Test]
public void ReceiveTimeoutChange ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.ReceiveTimeout = 50;
Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1");
sock.ReceiveTimeout = 2000;
Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2");
sock.ReceiveTimeout = 0;
Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3");
/* Should be the same as setting 0 */
sock.ReceiveTimeout = -1;
Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4");
sock.ReceiveTimeout = 65536;
Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5");
try {
sock.ReceiveTimeout = -2;
Assert.Fail ("ReceiveTimeoutChange #8");
} catch (ArgumentOutOfRangeException) {
} finally {
sock.Close ();
}
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void ReceiveTimeoutClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
int val = sock.ReceiveTimeout;
}
[Test]
public void NoDelayDefaultTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp");
sock.Close ();
}
[Test]
public void NoDelayChangeTcp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.NoDelay = true;
Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp");
sock.Close ();
}
[Test]
public void NoDelayDefaultUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
try {
bool val = sock.NoDelay;
Assert.Fail ("NoDelayDefaultUdp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode,
"NoDelayDefaultUdp #2");
} finally {
sock.Close ();
}
}
[Test]
public void NoDelayChangeUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
try {
sock.NoDelay = true;
Assert.Fail ("NoDelayChangeUdp #1");
} catch (SocketException ex) {
Assert.AreEqual (10042, ex.ErrorCode,
"NoDelayChangeUdp #2");
} finally {
sock.Close ();
}
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void NoDelayClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
bool val = sock.NoDelay;
}
static bool BAAccepted = false;
static Socket BASocket = null;
static ManualResetEvent BACalledBack = new ManualResetEvent (false);
private static void BACallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
BASocket = sock.EndAccept (asyncResult);
BAAccepted = true;
BACalledBack.Set ();
}
[Test]
[ExpectedException (typeof(InvalidOperationException))]
public void BeginAcceptNotBound ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.BeginAccept (BACallback, sock);
sock.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(InvalidOperationException))]
#endif
public void BeginAcceptNotListening ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (new IPEndPoint (IPAddress.Any, 0));
sock.BeginAccept (BACallback, sock);
sock.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAccept ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
sock.Listen (1);
BACalledBack.Reset ();
sock.BeginAccept (BACallback, sock);
Socket conn = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
conn.Connect (ep);
if (BACalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginAccept wait timed out");
}
Assert.AreEqual (true, BAAccepted, "BeginAccept #1");
Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2");
Assert.AreEqual (false, sock.Connected, "BeginAccept #3");
Assert.AreEqual (true, conn.Connected, "BeginAccept #4");
BASocket.Close ();
conn.Close ();
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void BeginAcceptClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
sock.BeginAccept (BACallback, sock);
}
static bool BADAccepted = false;
static Socket BADSocket = null;
static byte[] BADBytes;
static int BADByteCount;
static ManualResetEvent BADCalledBack = new ManualResetEvent (false);
private static void BADCallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
BADSocket = sock.EndAccept (out BADBytes,
out BADByteCount,
asyncResult);
BADAccepted = true;
BADCalledBack.Set ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAcceptData ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
sock.Listen (1);
BADCalledBack.Reset ();
sock.BeginAccept (256, BADCallback, sock);
Socket conn = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
byte[] send_bytes = new byte[] {10, 11, 12, 13};
conn.Connect (ep);
conn.Send (send_bytes);
if (BADCalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginAcceptData wait timed out");
}
Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1");
Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2");
Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3");
Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4");
Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5");
/* The MS runtime gives the returned data in a
* much bigger array. TODO: investigate
* whether it the size correlates to the first
* parameter in BeginAccept()
*/
Assert.IsFalse (BADBytes.Length == send_bytes.Length,
"BeginAcceptData #6");
for(int i = 0; i < send_bytes.Length; i++) {
Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ());
}
BADSocket.Close ();
conn.Close ();
sock.Close ();
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void BeginAcceptDataClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
sock.BeginAccept (256, BADCallback, sock);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAcceptSocketUdp ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket acc = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
sock.Bind (IPAddress.Loopback, out int _);
sock.Listen (1);
try {
sock.BeginAccept (acc, 256, BADCallback, sock);
Assert.Fail ("BeginAcceptSocketUdp #1");
} catch (SocketException ex) {
Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2");
} finally {
acc.Close ();
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAcceptSocketBound ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket acc = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out IPEndPoint ep1);
sock.Listen (1);
acc.Bind (IPAddress.Loopback, out IPEndPoint ep2);
try {
sock.BeginAccept (acc, 256, BADCallback, sock);
Assert.Fail ("BeginAcceptSocketBound #1");
} catch (InvalidOperationException) {
} finally {
acc.Close ();
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAcceptSocket ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket acc = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
sock.Listen (1);
BADCalledBack.Reset ();
sock.BeginAccept (acc, 256, BADCallback, sock);
Socket conn = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
byte[] send_bytes = new byte[] {10, 11, 12, 13};
conn.Connect (ep);
conn.Send (send_bytes);
if (BADCalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginAcceptSocket wait timed out");
}
Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1");
Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2");
Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3");
Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4");
Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5");
Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6");
Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7");
Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8");
Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9");
/* The MS runtime gives the returned data in a
* much bigger array. TODO: investigate
* whether it the size correlates to the first
* parameter in BeginAccept()
*/
Assert.IsFalse (BADBytes.Length == send_bytes.Length,
"BeginAcceptSocket #10");
for(int i = 0; i < send_bytes.Length; i++) {
Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ());
}
BADSocket.Close ();
conn.Close ();
acc.Close ();
sock.Close ();
}
[Test]
public void BeginAcceptSocketClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket acc = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
try {
sock.BeginAccept (acc, 256, BADCallback, null);
Assert.Fail ("BeginAcceptSocketClosed #1");
} catch (ObjectDisposedException) {
} finally {
acc.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginAcceptSocketAccClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket acc = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out int _);
sock.Listen (1);
acc.Close ();
BADCalledBack.Reset ();
try {
sock.BeginAccept (acc, 256, BADCallback, null);
Assert.Fail ("BeginAcceptSocketAccClosed #1");
} catch (ObjectDisposedException) {
} finally {
sock.Close ();
}
}
static bool BCConnected = false;
static ManualResetEvent BCCalledBack = new ManualResetEvent (false);
private static void BCCallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
try {
sock.EndConnect (asyncResult);
} catch (Exception e) {
Console.WriteLine ("BCCallback exception:");
Console.WriteLine (e);
throw;
}
BCConnected = true;
BCCalledBack.Set ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectAddressPort ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
listen.Bind (ip, out IPEndPoint ep);
listen.Listen (1);
BCCalledBack.Reset ();
BCConnected = false;
sock.BeginConnect (ip, ep.Port, BCCallback, sock);
if (BCCalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginConnectAddressPort wait timed out");
}
Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectHostNamePortWithoutCallback ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
IAsyncResult result = sock.BeginConnect (IPAddress.Loopback.ToString (), ep.Port, null, null);
if (result.AsyncWaitHandle.WaitOne (2000, false) == false) {
Assert.Fail ("BeginConnectHostNamePortWithoutCallback wait timed out");
}
Assert.AreEqual (true, result.IsCompleted, "BeginConnectHostNamePortWithoutCallback #1");
sock.EndConnect (result);
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectHostNamePortWithCallback ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
BCCalledBack.Reset ();
BCConnected = false;
IAsyncResult result = sock.BeginConnect (IPAddress.Loopback.ToString (), ep.Port, BCCallback, sock);
if (BCCalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginConnectHostNamePortWithCallback wait timed out");
}
Assert.AreEqual (true, BCConnected, "BeginConnectHostNamePortWithCallback #1");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectAddressPortNull ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = null;
try {
sock.BeginConnect (ip, port, BCCallback,
sock);
Assert.Fail ("BeginConnectAddressPortNull #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectAddressPortListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Bind (ip, out IPEndPoint ep);
sock.Listen (1);
try {
sock.BeginConnect (ip, ep.Port, BCCallback, sock);
Assert.Fail ("BeginConnectAddressPortListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(ObjectDisposedException))]
#endif
public void BeginConnectAddressPortClosed ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Close ();
sock.BeginConnect (ip, port, BCCallback, sock);
}
[Test]
[Category ("NotOnMac")]
/*
* This is not a Mono bug.
*
* By default, only 127.0.0.1 is enabled and you must explicitly
* enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
*
* I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
* until I add that alias.
*
*/
public void BeginConnectMultiple ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
BCCalledBack.Reset ();
BCConnected = false;
sock.BeginConnect (ips, ep.Port, BCCallback, sock);
/* Longer wait here, because the ms runtime
* takes a lot longer to not connect
*/
/*
if (BCCalledBack.WaitOne (30000, false) == false) {
Assert.Fail ("BeginConnectMultiple wait failed");
}
*/
Assert.IsTrue (BCCalledBack.WaitOne (30000), "#0");
Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectMultiple2 ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// Need at least two addresses.
var ips = Dns.GetHostAddresses ("localhost");
if (ips.Length < 1)
Assert.Ignore ("This test needs at least two IP addresses.");
var allIps = new IPAddress [ips.Length + 1];
allIps [0] = IPAddress.Loopback;
ips.CopyTo (allIps, 1);
/*
* Only bind to the loopback interface, so all the non-loopback
* IP addresses will fail. BeginConnect()/EndConnect() should
* succeed it it can connect to at least one of the requested
* addresses.
*/
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
BCCalledBack.Reset ();
BCConnected = false;
sock.BeginConnect (allIps, ep.Port, BCCallback, sock);
/* Longer wait here, because the ms runtime
* takes a lot longer to not connect
*/
if (BCCalledBack.WaitOne (10000, false) == false) {
Assert.Fail ("BeginConnectMultiple2 wait failed");
}
Assert.AreEqual (true, BCConnected, "BeginConnectMultiple2 #1");
Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple2 #2");
IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple2 #2");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectMultipleNull ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = null;
try {
sock.BeginConnect (ips, port, BCCallback,
sock);
Assert.Fail ("BeginConnectMultipleNull #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectMultipleListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
sock.Listen (1);
try {
sock.BeginConnect (ips, ep.Port, BCCallback,
sock);
Assert.Fail ("BeginConnectMultipleListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(ObjectDisposedException))]
#endif
public void BeginConnectMultipleClosed ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
sock.Close ();
sock.BeginConnect (ips, port, BCCallback, sock);
}
[Test]
public void BeginConnectHostPortNull ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.BeginConnect ((string)null, 0,
BCCallback, sock);
Assert.Fail ("BeginConnectHostPort #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectHostPortListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Bind (ip, out IPEndPoint ep);
sock.Listen (1);
try {
sock.BeginConnect ("localhost", ep.Port,
BCCallback, sock);
Assert.Fail ("BeginConnectHostPortListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
[Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
public void BeginConnectHostPortNotIP ()
{
Socket sock = new Socket (AddressFamily.NetBios,
SocketType.Seqpacket,
ProtocolType.Unspecified);
try {
sock.BeginConnect ("localhost", 0, BCCallback,
sock);
Assert.Fail ("BeginConnectHostPortNotIP #1");
} catch (NotSupportedException) {
} finally {
sock.Close ();
}
}
[Test]
[ExpectedException (typeof(ObjectDisposedException))]
public void BeginConnectHostPortClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
sock.BeginConnect ("localhost", 0, BCCallback, sock);
}
static bool BDDisconnected = false;
static ManualResetEvent BDCalledBack = new ManualResetEvent (false);
private static void BDCallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
sock.EndDisconnect (asyncResult);
BDDisconnected = true;
BDCalledBack.Set ();
}
[Test]
[Category ("NotDotNet")] // "Needs XP or later"
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginDisconnect ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
listen.Bind (ip, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (ip, ep.Port);
Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1");
sock.Shutdown (SocketShutdown.Both);
BDCalledBack.Reset ();
BDDisconnected = false;
sock.BeginDisconnect (false, BDCallback, sock);
if (BDCalledBack.WaitOne (2000, false) == false) {
Assert.Fail ("BeginDisconnect wait timed out");
}
Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2");
Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
sock.Close ();
listen.Close ();
}
[Test]
public void BeginReceiveSocketError ()
{
}
[Test]
public void BeginReceiveGeneric ()
{
}
[Test]
public void BeginReceiveGenericSocketError ()
{
}
private static void BSCallback (IAsyncResult asyncResult)
{
Socket sock = (Socket)asyncResult.AsyncState;
sock.EndSend (asyncResult);
}
[Test]
public void BeginSendNotConnected ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
byte[] send_bytes = new byte[] {10, 11, 12, 13};
try {
sock.BeginSend (send_bytes, 0,
send_bytes.Length,
SocketFlags.None, BSCallback,
sock);
Assert.Fail ("BeginSendNotConnected #1");
} catch (SocketException ex) {
Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2");
} finally {
sock.Close ();
}
}
[Test]
public void BeginSendSocketError ()
{
}
[Test]
public void BeginSendGeneric ()
{
}
[Test]
public void BeginSendGenericSocketError ()
{
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BindTwice ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out IPEndPoint ep1);
try {
sock.Bind (IPAddress.Loopback, out IPEndPoint ep2);
Assert.Fail ("BindTwice #1");
} catch (SocketException ex) {
Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2");
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void Close ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (ep);
Assert.AreEqual (true, sock.Connected, "Close #1");
sock.Close (2);
Thread.Sleep (3000);
Assert.AreEqual (false, sock.Connected, "Close #2");
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectAddressPort ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
listen.Bind (ip, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (ip, ep.Port);
Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectAddressPortNull ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = null;
try {
sock.Connect (ip, port);
Assert.Fail ("ConnectAddressPortNull #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectAddressPortListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Bind (ip, out IPEndPoint ep);
sock.Listen (1);
try {
sock.Connect (ip, ep.Port);
Assert.Fail ("ConnectAddressPortListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(ObjectDisposedException))]
#endif
public void ConnectAddressPortClosed ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Close ();
sock.Connect (ip, port);
}
[Test]
[Category ("NotOnMac")] // MacOSX trashes the fd after the failed connect attempt to 127.0.0.4
/*
* This is not a Mono bug.
*
* By default, only 127.0.0.1 is enabled and you must explicitly
* enable additional addresses using 'sudo ifconfig lo0 alias 127.0.0.1'.
*
* I tested this on Mac OS 10.7.4; a 'ping 127.0.0.2' does not work
* until I add that alias.
*
* However, after doing so, Mac OS treats these as separate addresses, ie. attempting
* to connect to 127.0.0.4 yields a connection refused.
*
* When using Connect(), the .NET runtime also throws an exception if connecting to
* any of the IP addresses fails. This is different with BeginConnect()/EndConnect()
* which succeeds when it can connect to at least one of the addresses.
*
*/
public void ConnectMultiple ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
listen.Bind (IPAddress.Loopback, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (ips, ep.Port);
Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1");
Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2");
IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectMultiple2 ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// Need at least two addresses.
var ips = Dns.GetHostAddresses ("localhost");
if (ips.Length < 1)
Assert.Ignore ("This test needs at least two IP addresses.");
var allIps = new IPAddress [ips.Length + 1];
allIps [0] = IPAddress.Loopback;
ips.CopyTo (allIps, 1);
/*
* Bind to IPAddress.Any; Connect() will fail unless it can
* connect to all the addresses in allIps.
*/
listen.Bind (IPAddress.Any, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (allIps, ep.Port);
Assert.AreEqual (true, sock.Connected, "ConnectMultiple2 #1");
Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple2 #2");
IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint;
Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple2 #3");
sock.Close ();
listen.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectMultipleNull ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = null;
try {
sock.Connect (ips, port);
Assert.Fail ("ConnectMultipleNull #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectMultipleListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
sock.Bind (IPAddress.Loopback, out IPEndPoint ep);
sock.Listen (1);
try {
sock.Connect (ips, ep.Port);
Assert.Fail ("ConnectMultipleListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(ObjectDisposedException))]
#endif
public void ConnectMultipleClosed ()
{
var port = NetworkHelpers.FindFreePort ();
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress[] ips = new IPAddress[4];
ips[0] = IPAddress.Parse ("127.0.0.4");
ips[1] = IPAddress.Parse ("127.0.0.3");
ips[2] = IPAddress.Parse ("127.0.0.2");
ips[3] = IPAddress.Parse ("127.0.0.1");
sock.Close ();
sock.Connect (ips, port);
}
[Test]
public void ConnectHostPortNull ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.Connect ((string)null, 0);
Assert.Fail ("ConnectHostPort #1");
} catch (ArgumentNullException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectHostPortListen ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
sock.Bind (ip, out IPEndPoint ep);
sock.Listen (1);
try {
sock.Connect ("localhost", ep.Port);
Assert.Fail ("ConnectHostPortListen #1");
} catch (InvalidOperationException) {
} finally {
sock.Close ();
}
}
[Test]
[Category ("NotWorking")] // Need to pick a non-IP AddressFamily that "works" on both mono and ms, this one only works on ms
public void ConnectHostPortNotIP ()
{
Socket sock = new Socket (AddressFamily.NetBios,
SocketType.Seqpacket,
ProtocolType.Unspecified);
try {
sock.Connect ("localhost", 0);
Assert.Fail ("ConnectHostPortNotIP #1");
} catch (NotSupportedException) {
} finally {
sock.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#else
[ExpectedException (typeof(ObjectDisposedException))]
#endif
public void ConnectHostPortClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Close ();
sock.Connect ("localhost", 0);
}
[Test]
[Category ("NotDotNet")] // "Needs XP or later"
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void Disconnect ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Socket listen = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Loopback;
listen.Bind (ip, out IPEndPoint ep);
listen.Listen (1);
sock.Connect (ip, ep.Port);
Assert.AreEqual (true, sock.Connected, "Disconnect #1");
sock.Shutdown (SocketShutdown.Both);
sock.Disconnect (false);
Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3");
sock.Close ();
listen.Close ();
}
[Test]
public void DuplicateAndClose ()
{
}
[Test]
public void IOControl ()
{
}
[Test]
public void TestDefaultsDualMode ()
{
using (var socket = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)){
Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
}
using (var socket = new Socket (SocketType.Stream, ProtocolType.Tcp)){
Assert.AreEqual (AddressFamily.InterNetworkV6, socket.AddressFamily, "When creating sockets of type stream/tcp, the address family should be InterNetworkV6");
Assert.IsTrue (socket.DualMode, "In Mono, DualMode must be true when constructing InterNetworkV6 sockets");
socket.DualMode = false;
Assert.IsFalse (socket.DualMode, "Setting of DualSocket should turn DualSockets off");
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveGeneric ()
{
int i;
Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listensock.Bind (IPAddress.Loopback, out IPEndPoint endpoint);
listensock.Listen(1);
Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sendsock.Connect(endpoint);
Socket clientsock = listensock.Accept();
byte[] sendbuf = new byte[256];
for(i = 0; i < 256; i++) {
sendbuf[i] = (byte)i;
}
for (i = 4; i < 6; i++) {
Assert.AreEqual (sendbuf[i], (byte)i,
"#1/" + i.ToString());
}
SocketError err;
sendsock.Send (sendbuf, 0, 256, SocketFlags.None,
out err);
byte[] recvbuf = new byte[256];
List<ArraySegment<byte>> recvbuflist = new List<ArraySegment<byte>>(2);
recvbuflist.Add(new ArraySegment<byte>(recvbuf, 4, 2));
recvbuflist.Add(new ArraySegment<byte>(recvbuf, 20, 230));
clientsock.Receive (recvbuflist);
/* recvbuf should now hold the first 2 bytes
* of sendbuf from pos 4, and the next 230
* bytes of sendbuf from pos 20
*/
for (i = 0; i < 2; i++) {
Assert.AreEqual (sendbuf[i], recvbuf[i + 4],
"#2/" + i.ToString());
}
for (i = 2; i < 232; i++) {
Assert.AreEqual (sendbuf[i], recvbuf[i + 18],
"#2/" + i.ToString());
}
sendsock.Close ();
clientsock.Close ();
listensock.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SendGeneric ()
{
int i;
Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listensock.Bind (IPAddress.Loopback, out IPEndPoint endpoint);
listensock.Listen(1);
Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sendsock.Connect(endpoint);
Socket clientsock = listensock.Accept();
byte[] sendbuf = new byte[256];
List<ArraySegment<byte>> sendbuflist = new List<ArraySegment<byte>>(2);
sendbuflist.Add(new ArraySegment<byte>(sendbuf, 4, 2));
sendbuflist.Add(new ArraySegment<byte>(sendbuf, 20, 230));
for(i = 0; i < 256; i++) {
sendbuf[i] = (byte)i;
}
for (i = 4; i < 6; i++) {
Assert.AreEqual (sendbuf[i], (byte)i,
"#1/" + i.ToString());
}
SocketError err;
sendsock.Send (sendbuflist, SocketFlags.None, out err);
byte[] recvbuf = new byte[256];
clientsock.Receive (recvbuf);
/* The first 2 bytes of recvbuf should now
* hold 2 bytes of sendbuf from pos 4, and the
* next 230 bytes of recvbuf should be sendbuf
* from pos 20
*/
for (i = 0; i < 2; i++) {
Assert.AreEqual (recvbuf[i], sendbuf[i + 4],
"#2/" + i.ToString());
}
for (i = 2; i < 232; i++) {
Assert.AreEqual (recvbuf[i], sendbuf[i + 18],
"#2/" + i.ToString());
}
sendsock.Close ();
clientsock.Close ();
listensock.Close ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (AggregateException))] // Something catches the PlatformNotSupportedException and re-throws an AggregateException
#endif
public void ConcurrentExceedSocketLimit ()
{
var tasks = new Task[4];
for (int i = 0; i < 4; i++) {
tasks[i] = Task.Factory.StartNew (() => SendGenericExceedBuffer ());
}
Task.WaitAll (tasks);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SendGenericExceedBuffer ()
{
// Create a buffer larger than the default max.
const int BUFFER_SIZE = 65 * 1024;
int i;
Socket listensock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listensock.Bind (IPAddress.Loopback, out IPEndPoint endpoint);
listensock.Listen (1);
Socket sendsock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sendsock.Connect (endpoint);
Socket clientsock = listensock.Accept ();
byte[] sendbuf = new byte[BUFFER_SIZE];
for (i = 0; i < BUFFER_SIZE; i++) {
sendbuf[i] = (byte)i;
}
Task sendTask = Task.Factory.StartNew(() => {
int sent = sendsock.Send (sendbuf);
Assert.AreEqual (BUFFER_SIZE, sent, "#1");
});
byte[] recvbuf = new byte[BUFFER_SIZE];
Task recvTask = Task.Factory.StartNew(() => {
int totalReceived = 0;
byte[] buffer = new byte[256];
while (totalReceived < sendbuf.Length) {
int recvd = clientsock.Receive (buffer, 0, buffer.Length, SocketFlags.None);
Array.Copy (buffer, 0, recvbuf, totalReceived, recvd);
totalReceived += recvd;
}
Assert.AreEqual (BUFFER_SIZE, totalReceived, "#2");
});
Assert.IsTrue (Task.WaitAll (new []{sendTask, recvTask}, 20 * 1000), "#2a");
for (i = 0; i < BUFFER_SIZE; i++) {
Assert.AreEqual (recvbuf[i], sendbuf[i],
"#3/" + i.ToString());
}
sendsock.Close ();
clientsock.Close ();
listensock.Close ();
}
[Test]
public void ListenNotBound ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
try {
sock.Listen (1);
Assert.Fail ("ListenNotBound #1");
} catch (SocketException ex) {
Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2");
} finally {
sock.Close ();
}
}
static Socket CWRSocket;
static bool CWRReceiving = true;
static ManualResetEvent CWRReady = new ManualResetEvent (false);
private static void CWRReceiveThread ()
{
byte[] buf = new byte[256];
try {
CWRSocket.Receive (buf);
} catch (SocketException) {
CWRReceiving = false;
}
CWRReady.Set ();
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void CloseWhileReceiving ()
{
CWRSocket = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
CWRSocket.Bind (IPAddress.Loopback, out int _);
Thread recv_thread = new Thread (new ThreadStart (CWRReceiveThread));
CWRReady.Reset ();
recv_thread.Start ();
Thread.Sleep (250); /* Wait for the thread to be already receiving */
CWRSocket.Close ();
if (CWRReady.WaitOne (1000, false) == false) {
Assert.Fail ("CloseWhileReceiving wait timed out");
}
Assert.IsFalse (CWRReceiving);
}
static bool RRCLastRead = false;
static ManualResetEvent RRCReady = new ManualResetEvent (false);
private static void RRCClientThread (int port)
{
byte[] bytes = new byte[8];
int readbyte;
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Connect (new IPEndPoint (IPAddress.Loopback,
port));
NetworkStream stream = new NetworkStream (sock);
readbyte = stream.ReadByte ();
Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1");
stream.Read (bytes, 0, 0);
readbyte = stream.ReadByte ();
Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2");
stream.Read (bytes, 0, 0);
readbyte = stream.ReadByte ();
Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3");
sock.Close ();
RRCLastRead = true;
RRCReady.Set ();
}
[Test] // Receive (Byte [])
public void Receive1_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((byte []) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (Byte [])
public void Receive1_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((byte []) null);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (Byte [], SocketFlags)
public void Receive2_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((byte []) null, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (Byte [], SocketFlags)
public void Receive2_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((byte []) null, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (Byte [], Int32, SocketFlags)
public void Receive3_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((byte []) null, 0, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (Byte [], Int32, SocketFlags)
public void Receive3_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((byte []) null, 0, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (Byte [], Int32, Int32, SocketFlags)
public void Receive4_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (Byte [], Int32, Int32, SocketFlags)
public void Receive4_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((byte []) null, 0, 0, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
public void Receive5_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
SocketError error;
try {
s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError)
public void Receive5_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
SocketError error;
try {
s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (IList<ArraySegment<Byte>>)
public void Receive6_Buffers_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((IList<ArraySegment<byte>>) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffers", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (IList<ArraySegment<Byte>>)
public void Receive6_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((IList<ArraySegment<byte>>) null);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
public void Receive7_Buffers_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffers", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags)
public void Receive7_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
try {
s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
public void Receive8_Buffers_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
SocketError error;
try {
s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
out error);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffers", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // Receive (IList<ArraySegment<Byte>>, SocketFlags, out SocketError)
public void Receive8_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
SocketError error;
try {
s.Receive ((IList<ArraySegment<byte>>) null, (SocketFlags) 666,
out error);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom1_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], ref EndPoint)
public void ReceiveFrom1_RemoteEP_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
byte [] buffer = new byte [0];
EndPoint remoteEP = null;
try {
s.ReceiveFrom (buffer, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom1_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, ref remoteEP);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom2_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
public void ReceiveFrom2_RemoteEP_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
byte [] buffer = new byte [5];
EndPoint remoteEP = null;
try {
s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom2_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom3_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, 0, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
public void ReceiveFrom3_RemoteEP_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
byte [] buffer = new byte [5];
EndPoint remoteEP = null;
try {
s.ReceiveFrom (buffer, buffer.Length, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom3_Size_OutOfRange ()
{
Socket s;
byte [] buffer = new byte [5];
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
// size negative
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#A1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
Assert.IsNull (ex.InnerException, "#A3");
Assert.IsNotNull (ex.Message, "#A4");
Assert.AreEqual ("size", ex.ParamName, "#A5");
} finally {
s.Close ();
}
// size > buffer length
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#B1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
Assert.IsNull (ex.InnerException, "#B3");
Assert.IsNotNull (ex.Message, "#B4");
Assert.AreEqual ("size", ex.ParamName, "#B5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom3_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom4_Buffer_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
}
}
[Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom4_Offset_OutOfRange ()
{
Socket s;
byte [] buffer = new byte [5];
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
// offset negative
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#A1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
Assert.IsNull (ex.InnerException, "#A3");
Assert.IsNotNull (ex.Message, "#A4");
Assert.AreEqual ("offset", ex.ParamName, "#A5");
} finally {
s.Close ();
}
// offset > buffer length
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#B1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
Assert.IsNull (ex.InnerException, "#B3");
Assert.IsNotNull (ex.Message, "#B4");
Assert.AreEqual ("offset", ex.ParamName, "#B5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint)
public void ReceiveFrom4_RemoteEP_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
byte [] buffer = new byte [5];
EndPoint remoteEP = null;
try {
s.ReceiveFrom (buffer, 0, buffer.Length, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("remoteEP", ex.ParamName, "#5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom4_Size_OutOfRange ()
{
Socket s;
byte [] buffer = new byte [5];
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
// size negative
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, 0, -1, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#A1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
Assert.IsNull (ex.InnerException, "#A3");
Assert.IsNotNull (ex.Message, "#A4");
Assert.AreEqual ("size", ex.ParamName, "#A5");
} finally {
s.Close ();
}
// size > buffer length
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#B1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
Assert.IsNull (ex.InnerException, "#B3");
Assert.IsNotNull (ex.Message, "#B4");
Assert.AreEqual ("size", ex.ParamName, "#B5");
} finally {
s.Close ();
}
// offset + size > buffer length
s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP);
Assert.Fail ("#C1");
} catch (ArgumentOutOfRangeException ex) {
// Specified argument was out of the range of valid values
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
Assert.IsNull (ex.InnerException, "#C3");
Assert.IsNotNull (ex.Message, "#C4");
Assert.AreEqual ("size", ex.ParamName, "#C5");
} finally {
s.Close ();
}
}
[Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveFrom4_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
s.Close ();
byte [] buffer = new byte [5];
EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, NetworkHelpers.FindFreePort ());
try {
s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666,
ref remoteEP);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ReceiveRemoteClosed ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Bind (IPAddress.Loopback, out int port);
sock.Listen (1);
RRCReady.Reset ();
Thread client_thread = new Thread (() => RRCClientThread (port));
client_thread.Start ();
Socket client = sock.Accept ();
NetworkStream stream = new NetworkStream (client);
stream.WriteByte (0x00);
stream.WriteByte (0x00);
client.Close ();
sock.Close ();
RRCReady.WaitOne (1000, false);
Assert.IsTrue (RRCLastRead);
}
//
// Test case for bug #471580
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void UdpDoubleBind ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp))
using (Socket ss = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp)) {
var supportsReuseAddress = true;
try {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
} catch (SocketException e) {
// Exception is thrown when ReuseAddress is not supported
Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
"Expected SocketError.OperationNotSupported");
supportsReuseAddress = false;
}
s.Bind (IPAddress.Any, out IPEndPoint ep);
if (supportsReuseAddress)
ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
try {
ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
if (!supportsReuseAddress)
Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
} catch (SocketException e) {
}
}
}
// Test case for bug #31557
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void TcpDoubleBind ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp))
using (Socket ss = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)) {
var supportsReuseAddress = true;
try {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
} catch (SocketException e) {
// Exception is thrown when ReuseAddress is not supported
Assert.AreEqual ((int) SocketError.OperationNotSupported, e.NativeErrorCode,
"Expected SocketError.OperationNotSupported");
supportsReuseAddress = false;
}
s.Bind (IPAddress.Any, out IPEndPoint ep);
s.Listen(1);
if (supportsReuseAddress)
ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
try {
ss.Bind (new IPEndPoint (IPAddress.Any, ep.Port));
ss.Listen(1);
if (!supportsReuseAddress)
Assert.Fail ("Reusing address is not supported, exception was expected on second bind.");
} catch (SocketException e) {
}
}
}
// Test case for https://bugzilla.novell.com/show_bug.cgi?id=443346
// See also https://bugzilla.xamarin.com/show_bug.cgi?id=52157
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectedProperty ()
{
var listener = NetworkHelpers.CreateAndStartTcpListener (out int port);
var client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect (IPAddress.Loopback, port);
var server = listener.AcceptSocket ();
const int blobSize = 2048;
// Small send/recv buffers so that our send operation will fill them
server.ReceiveBufferSize = server.SendBufferSize = 256;
client.ReceiveBufferSize = client.SendBufferSize = 256;
// Setting this linger state causes shutdown to be a hard close (RST if send data is pending)
server.LingerState = client.LingerState = new LingerOption (true, 0);
// KeepAlive being set introduces another opportunity for a RST according to some documentation
server.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
client.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
try
{
// Fill the send buffer
client.Send (new byte[blobSize]);
// Now shut down the socket. Because of the linger state this will hard close and send RST.
client.Shutdown (SocketShutdown.Both);
client.Close ();
Assert.IsFalse (client.Connected);
Assert.IsTrue (server.Connected);
var isDead = false;
try
{
// On Windows this BeginSend succeeds... it really shouldn't and a sync send fails.
// On Linux this fails with a ConnectionReset.
var ar = server.BeginSend (new byte[blobSize], 0, blobSize, SocketFlags.None, null, null);
// On Mac we get an erroneous WSAESHUTDOWN (10058) here
server.EndSend (ar);
}
catch (SocketException se)
{
isDead = true;
if (
(se.SocketErrorCode != SocketError.ConnectionReset) &&
(se.SocketErrorCode != SocketError.Shutdown)
)
throw;
}
if (!isDead)
{
try
{
// On Windows this second send operation will fail with a ConnectionReset.
var ar = server.BeginSend (new byte[blobSize], 0, blobSize, SocketFlags.None, null, null);
server.EndSend (ar);
}
catch (SocketException se)
{
if (se.SocketErrorCode != SocketError.ConnectionReset)
throw;
}
}
Assert.IsFalse (client.Connected);
Assert.IsFalse (server.Connected);
}
finally
{
listener.Stop ();
client.Close ();
server.Close ();
}
}
[Test] // GetSocketOption (SocketOptionLevel, SocketOptionName)
public void GetSocketOption1_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.GetSocketOption (0, 0);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void GetSocketOption2_OptionValue_Null ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try {
s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
(byte []) null);
Assert.Fail ("#1");
} catch (SocketException ex) {
// The system detected an invalid pointer address in attempting
// to use a pointer argument in a call
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10014, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
}
}
[Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void GetSocketOption2_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.GetSocketOption (0, 0, (byte []) null);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
public void GetSocketOption3_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.GetSocketOption (0, 0, 0);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void SetSocketOption1_DontLinger ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
new byte [] { 0x00 });
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
new byte [] { 0x01 });
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void SetSocketOption1_DontLinger_Null ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.DontLinger, (byte []) null);
Assert.Fail ("#1");
} catch (SocketException ex) {
// The system detected an invalid pointer address in attempting
// to use a pointer argument in a call
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10014, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void SetSocketOption1_Linger_Null ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.DontLinger, (byte []) null);
Assert.Fail ("#1");
} catch (SocketException ex) {
// The system detected an invalid pointer address in attempting
// to use a pointer argument in a call
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10014, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10014, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte [])
public void SetSocketOption1_Socket_Close ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger,
new byte [] { 0x00 });
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
public void SetSocketOption2_DontLinger ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5);
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
[Category ("NotWorking")]
public void SetSocketOption2_Linger ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0);
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5);
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32)
public void SetSocketOption2_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0);
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.Any, 0));
try {
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
new IPv6MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
// The specified value is not a valid 'MulticastOption'
Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
Assert.AreEqual ("optionValue", ex.ParamName, "#6");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_AddMembershipIPv4_MulticastOption ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.Any, 0));
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption (mcast_addr));
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
[Category ("NotWorking")]
public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try {
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (SocketException ex) {
// An invalid argument was supplied
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10022, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
} finally {
s.Close ();
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption ()
{
if (!Socket.OSSupportsIPv6)
Assert.Ignore ("IPv6 not enabled.");
IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.IPv6Any, 0));
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
new IPv6MulticastOption (mcast_addr));
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_AddMembershipIPv6_MulticastOption ()
{
if (!Socket.OSSupportsIPv6)
Assert.Ignore ("IPv6 not enabled.");
IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.IPv6Any, 0));
try {
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
new MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
// The specified value is not a valid 'IPv6MulticastOption'
Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
Assert.AreEqual ("optionValue", ex.ParamName, "#6");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
[Category ("NotWorking")]
public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound ()
{
IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
try {
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
new IPv6MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (SocketException ex) {
// An invalid argument was supplied
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10022, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
} finally {
s.Close ();
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_DontLinger_Boolean ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.DontLinger, (object) false);
Assert.Fail ("#1");
} catch (ArgumentException ex) {
// The specified value is not valid
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_DontLinger_Int32 ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.DontLinger, (object) 0);
Assert.Fail ("#1");
} catch (ArgumentException ex) {
// The specified value is not valid
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_DontLinger_LingerOption ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.DontLinger, new LingerOption (true, 1000));
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
// The specified value is not valid
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_Linger_Boolean ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.Linger, (object) false);
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
// The specified value is not valid
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_Linger_Int32 ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.Linger, (object) 0);
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
// The specified value is not valid
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_Linger_LingerOption ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
new LingerOption (false, 0));
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
new LingerOption (true, 0));
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
new LingerOption (false, 1000));
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
new LingerOption (true, 1000));
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.Any, 0));
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption (mcast_addr));
try {
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
new IPv6MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
// The specified value is not a valid 'MulticastOption'
Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message);
Assert.AreEqual ("optionValue", ex.ParamName, "#6");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_DropMembershipIPv4_MulticastOption ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
MulticastOption option = new MulticastOption (mcast_addr);
s.Bind (new IPEndPoint (IPAddress.Any, 0));
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership,
option);
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
option);
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
[Category ("NotWorking")]
public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound ()
{
IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250");
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try {
s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership,
new MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (SocketException ex) {
// An invalid argument was supplied
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10022, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
} finally {
s.Close ();
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption ()
{
if (!Socket.OSSupportsIPv6)
Assert.Ignore ("IPv6 not enabled.");
using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
IPv6MulticastOption option = new IPv6MulticastOption (
IPAddress.Parse ("ff02::1"));
s.Bind (new IPEndPoint (IPAddress.IPv6Any, 0));
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
option);
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
option);
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void SetSocketOption3_DropMembershipIPv6_MulticastOption ()
{
if (!Socket.OSSupportsIPv6)
Assert.Ignore ("IPv6 not enabled.");
IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) {
s.Bind (new IPEndPoint (IPAddress.IPv6Any, 0));
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership,
new IPv6MulticastOption (mcast_addr));
try {
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
new MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (ArgumentException ex) {
Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
// The specified value is not a valid 'IPv6MulticastOption'
Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message);
Assert.AreEqual ("optionValue", ex.ParamName, "#6");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
[Category ("NotWorking")]
public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound ()
{
IPAddress mcast_addr = IPAddress.Parse ("ff02::1");
Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
try {
s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership,
new IPv6MulticastOption (mcast_addr));
Assert.Fail ("#1");
} catch (SocketException ex) {
// An invalid argument was supplied
Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2");
Assert.AreEqual (10022, ex.ErrorCode, "#3");
Assert.IsNull (ex.InnerException, "#4");
Assert.IsNotNull (ex.Message, "#5");
Assert.AreEqual (10022, ex.NativeErrorCode, "#6");
Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7");
} finally {
s.Close ();
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_OptionValue_Null ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
try {
s.SetSocketOption (SocketOptionLevel.Socket,
SocketOptionName.Linger, (object) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("optionValue", ex.ParamName, "#5");
}
}
}
[Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object)
public void SetSocketOption3_Socket_Closed ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
try {
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger,
new LingerOption (false, 0));
Assert.Fail ("#1");
} catch (ObjectDisposedException ex) {
// Cannot access a disposed object
Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5");
}
}
[Test]
[Category ("RequiresBSDSockets")] // on watchOS device this happens: System.Net.Sockets.SocketException : The requested address is not valid in this context. This situation is too complex to detect and throw a PlatformNotSupportedException, so just ignore it.
public void SetSocketOption_MulticastInterfaceIndex_Any ()
{
IPAddress ip = IPAddress.Parse ("239.255.255.250");
int index = 0;
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
}
}
[Test]
[Category ("RequiresBSDSockets")] // on watchOS device this happens: System.Net.Sockets.SocketException : The requested address is not valid in this context. This situation is too complex to detect and throw a PlatformNotSupportedException, so just ignore it.
public void SetSocketOption_MulticastInterfaceIndex_Loopback ()
{
IPAddress ip = IPAddress.Parse ("239.255.255.250");
int index = 1;
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
}
}
[Test]
public void SetSocketOption_MulticastInterfaceIndex_Invalid ()
{
IPAddress ip = IPAddress.Parse ("239.255.255.250");
int index = 31415;
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
try
{
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(index));
Assert.Fail ("#1");
}
catch
{}
try
{
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, index));
Assert.Fail ("#2");
}
catch
{}
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void Shutdown_NoConnect ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind (new IPEndPoint (IPAddress.Loopback, 0));
s.Listen (1);
try {
s.Shutdown (SocketShutdown.Both);
Assert.Fail ("#1");
} catch (SocketException exc) {
Assert.AreEqual (10057, exc.ErrorCode, "#2");
} finally {
s.Close ();
}
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void ReceiveAsync_Null ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.ReceiveAsync (null);
}
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void ReceiveAsync_Default ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
s.ReceiveAsync (saea);
}
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void ReceiveAsync_NullBuffer ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
saea.SetBuffer (null, 0, 0);
s.ReceiveAsync (null);
}
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void ReceiveAsync_ClosedSocket ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
s.ReceiveAsync (null);
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void SendAsync_Null ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
s.SendAsync (null);
}
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void SendAsync_Default ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
s.SendAsync (saea);
}
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void SendAsync_NullBuffer ()
{
using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
SocketAsyncEventArgs saea = new SocketAsyncEventArgs ();
saea.SetBuffer (null, 0, 0);
s.SendAsync (null);
}
}
[Test]
[ExpectedException (typeof (ObjectDisposedException))]
public void SendAsync_ClosedSocket ()
{
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Close ();
s.SendAsync (null);
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
[Ignore ("https://bugzilla.xamarin.com/show_bug.cgi?id=43172")]
public void SendAsyncFile ()
{
Socket serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
serverSocket.Listen (1);
var mReceived = new ManualResetEvent (false);
serverSocket.BeginAccept (AsyncCall => {
byte[] bytes = new byte [1024];
Socket listener = (Socket)AsyncCall.AsyncState;
Socket client = listener.EndAccept (AsyncCall);
client.Receive (bytes, bytes.Length, 0);
client.Close ();
mReceived.Set ();
}, serverSocket);
Socket clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect (serverSocket.LocalEndPoint);
clientSocket.NoDelay = true;
// Initialize buffer used to create testing file
var buffer = new byte [1024];
for (int i = 0; i < 1024; ++i)
buffer [i] = (byte) (i % 256);
string temp = Path.GetTempFileName ();
try {
// Testing file creation
using (StreamWriter sw = new StreamWriter (temp)) {
sw.Write (buffer);
}
var mSent = new ManualResetEvent (false);
// Async Send File to server
clientSocket.BeginSendFile(temp, (ar) => {
Socket client = (Socket) ar.AsyncState;
client.EndSendFile (ar);
mSent.Set ();
}, clientSocket);
Assert.IsTrue (mSent.WaitOne (5000), "#1");
Assert.IsTrue (mReceived.WaitOne (5000), "#2");
} finally {
if (File.Exists (temp))
File.Delete (temp);
clientSocket.Close ();
serverSocket.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void ConnectToIPV4EndPointUsingDualModelSocket () {
/*
* IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
* anyways in this test to make it more interoparable with .NET where
* IPv6 and DualMode needs to be specified.
*/
using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp)) {
server.DualMode = true;
server.Bind (IPAddress.Loopback, out int _);
/*
* Nothing to Accept the connect - we need a backlog to make sure we don't get
Connection refused.
*/
server.Listen (3);
var ep = server.LocalEndPoint as IPEndPoint;
var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
client.Connect (ep);
client.Disconnect (false);
client.Close ();
client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
client.Connect (IPAddress.Loopback, ep.Port);
client.Disconnect (false);
client.Close ();
client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
client.Connect (new [] { IPAddress.Loopback }, ep.Port);
client.Disconnect (false);
client.Close ();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void BeginConnectToIPV4EndPointUsingDualModelSocket () {
/*
* IPv6 DualMode sockets are defaults in Mono. Explicitly specify that
* anyways in this test to make it more interoparable with .NET where
* IPv6 and DualMode needs to be specified.
*/
using (var server = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp))
{
server.DualMode = true;
server.Bind (IPAddress.Loopback, out int _);
server.Listen (10);
var ep = server.LocalEndPoint as IPEndPoint;
BCCalledBack.Reset ();
var client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
var ar1 = client.BeginConnect (ep, BCCallback, client);
Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#2");
Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#3");
client.Disconnect (false);
client.Close ();
BCCalledBack.Reset ();
client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
Assert.IsTrue (BCCalledBack.WaitOne (10000), "#4");
Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#5");
Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#6");
client.Disconnect (false);
client.Close ();
BCCalledBack.Reset ();
client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
client.DualMode = true;
var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
Assert.IsTrue (BCCalledBack.WaitOne (10000), "#7");
Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#8");
Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#9");
client.Disconnect (false);
client.Close();
}
}
[Test]
#if FEATURE_NO_BSD_SOCKETS
[ExpectedException (typeof (PlatformNotSupportedException))]
#endif
public void UdpMulticasTimeToLive ()
{
/* see https://bugzilla.xamarin.com/show_bug.cgi?id=36941 */
using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) {
socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
socket.Bind (IPAddress.Any, out int _);
socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 19);
}
}
[Test] // Covers 41616
public void ConnectAsyncUnhandledEx ()
{
var mre = new ManualResetEvent (false);
var endPoint = new IPEndPoint(0,0);
var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Unspecified);
var socketArgs = new SocketAsyncEventArgs();
socketArgs.RemoteEndPoint = endPoint;
socketArgs.Completed += (sender, e) => mre.Set ();
if (socket.ConnectAsync (socketArgs))
Assert.IsTrue (mre.WaitOne (1000), "ConnectedAsync timeout");
Assert.AreNotEqual (SocketError.Success, socketArgs.SocketError);
}
[Test] // Covers https://bugzilla.xamarin.com/show_bug.cgi?id=52549
public void SocketMismatchProtocol ()
{
try {
using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Tcp));
Assert.Fail ("#1");
} catch (SocketException e) {
// Only work on OSX
// Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#2");
}
try {
using (Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp));
Assert.Fail ("#3");
} catch (SocketException e) {
// Only work on OSX
// Assert.AreEqual(SocketError.ProtocolType, e.SocketErrorCode, "#4");
}
}
}
}