Die .NET Klasse TcpClient() kann scheinbar nur IPv4 oder IPv6 – nicht beides. Und wenn man nichts dazu sagt wird defaultmäßig IPv4 genommen. Sitzt man aber auf einem DirectAccess Client werden die Unternehmensresourcen auf IPv6 Adressen aufgelöst und das was im Unternehmen einwandfrei pfeift (weil IPv4) funktioniert von außen (DirectAccess) überhaupt nicht, TcpClient.Connect() wirft eine nette Exception:
System.Net.Sockets.SocketException (0x80004005): A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
Der richtige Weg (zumindestens funktioniert er) ist sich je nach Sachlage anzupassen:
IPHostEntry oHost = null;
TcpClient oClient = null;
string sHost = "host.company.com";
int nPort = 4711;
oHost = Dns.GetHostEntry(sHost);
if (oHost == null || oHost.AddressList == null || oHost.AddressList.Length == 0)
throw new Exception("DNS resolution for '" + sHost + "' failed");
oClient = new TcpClient(oHost.AddressList[0].AddressFamily);
oClient.Connect(oHost.AddressList[0], nPort);