Traceroute per C#
01020304050607080910111213141516171819202122232425
public class Traceroute : IDisposable { private static readonly byte[] buffer = new byte[] { 0x01, 0x03, 0x03, 0x07 }; // Daten zur Übertragung
private readonly Ping ping = new Ping();
public IEnumerable<PingReply> Send(string hostNameOrAddress, int timeout = 3000) { // Paket mit TTL=1 initialisieren PingOptions pingOptions = new PingOptions(1, false);
PingReply pingReply = null;
do { pingReply = this.ping.Send(hostNameOrAddress, timeout, Traceroute.buffer, pingOptions);
// TTL für nächsten Schritt inkrementieren pingOptions.Ttl++;
yield return pingReply; } while(pingReply.Status != IPStatus.Success); }
public void Dispose() => this.ping.Dispose();}
0102030405
using(Traceroute traceroute = new Traceroute()) { foreach(PingReply pingReply in traceroute.Send("coders-online.net")) { Console.WriteLine(pingReply.Address); }}
Dns.GetHostEntry(…)
dienen:
0102030405060708091011
using(Traceroute traceroute = new Traceroute()) { foreach(string hostNameOrAddress in traceroute.Send("coders-online.net").Select(pR => { try { return Dns.GetHostEntry(pR.Address).HostName; } catch { return pR.Address.ToString(); } })) { Console.WriteLine(hostNameOrAddress); }}
Syslog-Nachrichten mit C# versenden
In einem früheren Beitrag hatte ich bereits mein NAS von Synology erwähnt. Sofern ihr ebenfalls ein solches besitzt, könnt ihr dieses sehr einfach als Server einrichten und somit direkt für die Beispiele (und mehr) nutzen.
Syslog
-Klasse implementieren
010203040506070809101112131415161718192021222324252627282930313233343536
public class Syslog : IDisposable { private const int Facility = 1; // user-level messages private const int FacilityFactor = 8;
private readonly UdpClient udpClient;
public Syslog(string hostname = "localhost", int port = 514) { this.udpClient = new UdpClient(hostname, port); }
public void Send(Severity severity, string message, [CallerMemberName] string caller = null) { byte[] data = Encoding.UTF8.GetBytes(String.Format("<{0}>{1} {2} {3}", ((Syslog.Facility * Syslog.FacilityFactor) + (int) severity), DateTime.Now.ToString("MMM dd HH:mm:ss"), Dns.GetHostName(), ((!String.IsNullOrWhiteSpace(caller)) ? (caller + " ") : (String.Empty)) + message ));
this.udpClient.Send(data, data.Length); }
public void Dispose() => this.udpClient?.Dispose();
public enum Severity { Emergency, // [0] system is unusable Alert, // [1] action must be taken immediately Critical, // [2] critical conditions Error, // [3] error conditions Warning, // [4] warning conditions Notice, // [5] normal but significant condition Informational, // [6] informational messages Debug, // [7] debug-level messages } // https://tools.ietf.org/html/rfc3164}
PHP-Funktionen in C# (noch nicht) als Programmbibliothek
Aus technischer Sicht wäre das tatsächlich kein Problem und grundsätzlich sogar mit überschaubarem Aufwand automatisierbar. Ich habe daher auch selbst schon einmal mit dem Gedanken der Veröffentlichung als Paket gespielt, dennoch möchte ich erst einmal Abstand davon nehmen und zwar vor allem aus folgenden Gründen:
-
Design
Die Umsetzung der Methoden (Bezeichner, Datentypen, Parameter) ist stark an PHP angelehnt, sprich ist soweit möglich identisch zu den gleichnamigen PHP-Funktionen. Diese Umsetzung widerspricht jedoch in nahezu allen Fällen in vielerlei Hinsicht den .NET-Guidelines für Programmbibliotheken und auch die Datentypen entsprechen oftmals nicht den bei C# für den jeweiligen Einsatzzweck üblichen.
-
Qualität
Die Umsetzungen sollen einen Ansatz bzw. Tipps liefern, entsprechen jedoch in einigen Fällen nicht einer Qualität, die einen sofortigen und ungeprüften Einsatz in Produktionsumgebungen ermöglicht. Dies wäre für eine tatsächliche Veröffentlichung jedoch zwingend erforderlich. Darüber hinaus wären an einigen Stellen Optimierungen für den effizienten Einsatz in echten Projekten durchaus sinnvoll.
Zertifikat einer Adresse mit C# ermitteln
010203040506070809
public static X509Certificate2 GetCertificate(string hostName, int port = 443) { using(TcpClient client = new TcpClient(hostName, port)) { using(SslStream stream = new SslStream(client.GetStream())) { stream.AuthenticateAsClient(hostName);
return new X509Certificate2(stream.RemoteCertificate); } }}
TcpClient
, SslStream
und X509Certificate2
im MSDN.Nun stehen uns diverse Informationen zur Verfügung; einige Beispiele zur Ausgabe auf der Konsole:
010203040506
X509Certificate2 certificate = GetCertificate("coders-online.net");
Console.WriteLine(certificate.Subject); // "CN=coders-online.net"
Console.WriteLine(certificate.NotBefore); // 30.04.2017 08:01:00Console.WriteLine(certificate.NotAfter); // 29.07.2017 08:01:00
RemoteCertificateValidationCallback
hingewiesen, mit welchem sich das Verhalten bei Zertifizierungsfehlern beeinflussen lässt. HTTP-Statuscode einer Webseite mit C# ermitteln
01020304050607
public static HttpStatusCode GetHttpStatusCode(Uri uri) { HttpWebRequest httpWebRequest = WebRequest.CreateHttp(uri);
using(HttpWebResponse webResponse = (HttpWebResponse) httpWebRequest.GetResponse()) { return webResponse.StatusCode; }}
010203040506070809101112131415
public static HttpStatusCode GetHttpStatusCode( Uri uri, bool allowAutoRedirect = false, RequestCacheLevel requestCacheLevel = RequestCacheLevel.NoCacheNoStore) { HttpWebRequest httpWebRequest = WebRequest.CreateHttp(uri); { httpWebRequest.AllowAutoRedirect = allowAutoRedirect; httpWebRequest.CachePolicy = new RequestCachePolicy(requestCacheLevel); }
using(HttpWebResponse webResponse = (HttpWebResponse) httpWebRequest.GetResponse()) { return webResponse.StatusCode; }}
01020304
Uri uri = new Uri("https://ccc.coders-online.net/");
HttpStatusCode statusCode = GetHttpStatusCode(uri); // Found (302)statusCode = GetHttpStatusCode(uri, true); // OK (200)
HttpStatusCode
-Aufzählung zu int
konvertiert erhaltet ihr im Übrigen den entsprechenden numerischen Wert nach Definition des HTTP-Protokolls. Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)