Neujahr 👍 👎

Ich bedanke mich für das bisherige Interesse und wünsche ein glückliches und erfolgreiches neues Jahr 2019.

Ich würde mich natürlich sehr darüber freuen, dich auch im nächsten Jahr wieder hier begrüßen zu dürfen.

CCC-Fahrplan aktualisiert 👍 👎

Meine Variante des CCC-Fahrplans wurde erneut aktualisiert und enthält nun auch Informationen zum 35c3.

Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.

Interpolierte Zeichenfolgen mit C# 👍 👎

Im früheren Beitrag String.Format per Objekt-Eigenschaften hatte ich eine kleine Erweiterungsmethode vorgestellt, um eine etwas besser lesbare Variante der String.Format-Methodengruppe vorzustellen. Selbstverständlich wird C# aber beständig weiterentwickelt und so gibt es seit C# 6.0 (.NET 4.6) eine entsprechende Möglichkeit, ohne jedoch – wie in meinem kleinen Beispiel – auf die umfangreichen Formatierungsoptionen verzichten zu müssen:
Beispiele für interpolierte Zeichenfolgen
010203040506070809101112131415
// Einfache Verwendung und Methodenaufrufconst string firstName = "Holger";const string lastName = "Stehle";
string formatted = $"{lastName.ToUpper()}, {firstName}"; // "STEHLE, Holger"
// Basis für Zahlenconst int num1 = 42;

formatted = $"dec: {num1}, hex: {num1:X3}"; // "dec: 42, hex: 02A"
// Dezimalstellen für Zahlenconst double num2 = 13.37;

formatted = $"{num2:N3} / {num2:N4}"; // "13,370 / 13,3700" [DE]
Die wesentliche Syntax-Erweiterung ist dementsprechend "$" zur Einleitung derartiger Zeichenketten.

Dateityp mit C# ermitteln 👍 👎

Das ermitteln eines Dateityps nur durch Prüfen von Rohdaten kann aufwendig und fehlerträchtig sein; praktischerweise steht jedoch die native Funktion FindMimeFromData zur Verfügung, welche wir nutzen werden:
Wrapper für native Funktionalität bereitstellen
01020304050607080910111213141516171819202122232425
public static class DataUtility {    public static string GetMimeType(byte[] data) {        DataUtility.FindMimeFromData(0, null, data, (uint) data.Length, null, 0, out uint address, 0);
// Daten kopieren und Speicher freigeben IntPtr ptr = new IntPtr(address); string mimeType = Marshal.PtrToStringAuto(ptr); Marshal.FreeCoTaskMem(ptr);
return mimeType; }

[DllImport("urlmon")] private static extern uint FindMimeFromData( uint pBC, string pwzUrl, byte[] pBuffer, uint cbSize, string pwzMimeProposed, uint dwMimeFlags, out uint ppwzMimeOut, uint dwReserverd );}
Die Verwendung gestaltet sich nun sehr intuitiv:
Wrapper für native Funktionalität verwenden
0102
string mimeType = DataUtility.GetMimeType(File.ReadAllBytes("Avatar.gif")); // "image/gif"mimeType = DataUtility.GetMimeType(File.ReadAllBytes("Impressum.htm"));     // "text/html"
Beachtet jedoch bitte, dass auch diese Funktion u. U. nur begrenzt aussagekräftige Ergebnisse liefern kann und wie üblich verzichtet die Implementierung auf umfangreiche Fehlerbehandlung. Darüber hinaus bietet die native Funktion weitere Möglichkeiten, so beispielsweise das Übergeben eines Dateinamens bzw. einer URL.

Traceroute per C# 👍 👎

In früheren Beiträgen hatte ich bereits erläutert, wie man per C# auf eine Konsolenausgabe zugreifen und programmatisch einen Ping durchführen kann. Dieser Beitrag soll nun ein einfaches Tracerouting per C# nachbilden. Dazu implementieren wir im Folgenden eine einfache (und wie üblich auf das Wesentliche reduzierte) Klasse, welche die Funktionalität durch sukzessive Erhöhung des TTL-Wertes für schlichte Ping-Pakete umsetzt.
Klasse implementieren
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();}
Die Verwendung gestaltet sich nun sehr einfach:
Klasse verwenden (exkl. Namensauflösung)
0102030405
using(Traceroute traceroute = new Traceroute()) {    foreach(PingReply pingReply in traceroute.Send("coders-online.net")) {        Console.WriteLine(pingReply.Address);    }}
Um die entsprechenden Hostnamen zu den jeweiligen IP-Adressen zu ermitteln, kann beispielsweise die Methode Dns.GetHostEntry(…) dienen:
Klasse verwenden (inkl. Namensauflösung)
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);    }}

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche