Schlagwort: Netzwerk

Wake on LAN per C# 👍 👎

Wake on LAN ist ein Standard zum Starten eines deaktivierten Rechners über eine kompatible Netzwerkkarte. Dazu wird lediglich ein bestimmtes Paket im Netzwerk gesendet; mit C# lässt sich das beispielsweise so lösen:
Klasse implementieren
0102030405060708091011121314151617181920212223242526272829
public static class WakeOnLAN {    public static void SendMagicPacket(byte[] macAddress) {        using(UdpClient udpClient = new UdpClient()) {            udpClient.Connect(IPAddress.Broadcast, 9);
byte[] magicPacket = new byte[(6 + (16 * 6))];
for(int i = 0; i < 6; i++) { magicPacket[i] = 0xFF; }
for(int i = 1; i <= 16; i++) { for(int j = 0; j < 6; j++) { magicPacket[((i * 6) + j)] = macAddress[j]; } }
udpClient.Send(magicPacket, magicPacket.Length); } }
public static void SendMagicPacket(string macAddress) { SendMagicPacket(macAddress .Split(':', '-') .Select(m => Byte.Parse(m, NumberStyles.AllowHexSpecifier)) .ToArray() ); }}
Das Paket enthält sechs mal den Wert FF16, gefolgt von der 16-maligen Wiederholung der MAC-Adresse und wird per Broadcast im Netzwerk versendet. Durch die Methodenüberladung wird die Übergabe der MAC-Adresse sowohl per Zeichenkette als auch per Byte-Feld ermöglicht:
Klasse verwenden
01020304050607
WakeOnLAN.SendMagicPacket("11:22:33:44:55:66");
/* – oder – */
WakeOnLAN.SendMagicPacket(new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66});

Ping per C# 👍 👎

Zwar könnte man hier ähnlich wie im Artikel Konsolenausgabe in C# verwenden für traceroute beschrieben vorgehen, jedoch bietet es sich an, die Ping-Klasse des .NET-Frameworks zu verwenden. Diese möchte ich mit diesem Beitrag kurz vorstellen, da sie interessanterweise zu den doch eher unbekannteren Funktionalitäten gehört.
Ping-Klasse verwenden
010203040506
using(Ping ping = new Ping()) {    PingReply reply = ping.Send("coders-online.net");
long time = reply.RoundtripTime; // 19 IPStatus status = reply.Status; // Success}
Es können durch entsprechende Überladungen weiterführende Optionen wie die zu übertragenden Daten festgelegt werden. Durch die seit .NET 4.5 verfügbare Methode SendPingAsync besteht außerdem auch die Möglichkeit, nach dem komfortablen und nicht-blockierenden async/await-Muster vorzugehen.

Kopfzeilen einer Webseite mit C# ermitteln 👍 👎

Ergänzend zu Quelltext einer Webseite mit C# einlesen möchte ich noch zeigen, wie sich die HTTP-Header der Antwort auf eine Anfrage ermitteln lassen. Wir verwenden dazu die bereits bekannte Klasse HttpWebRequest:
Kopfzeilen per HttpWebRequest ermitteln
01020304050607080910111213141516171819
HttpWebRequest request = HttpWebRequest.CreateHttp("http://domain.tld/");
/** * Hier könntet ihr auch eigene Kopfzeilen senden, z. B.: * request.Headers[HttpRequestHeader.Cookie] = "Cookie-Daten";**/
using(WebResponse response = request.GetResponse()) { for(int i = 0; i < response.Headers.Count; i++) { string header = response.Headers.GetKey(i);
foreach(string value in response.Headers.GetValues(i)) { /** * "header" enthält den Titel der Kopfzeile, * "value" enthält einen Wert zu dieser. **/ } }}
Die ebenfalls aus dem vorherigen Beitrag bekannte Klasse WebClient bietet diese Möglichkeit in ähnlicher Form.

Quelltext einer Webseite mit C# einlesen 👍 👎

Manchmal kann es sinnvoll sein, den Quelltext einer Webseite automatisiert abzurufen, beispielsweise um Tests durchzuführen. Dies lässt sich in C# sehr einfach über die HttpWebRequest-Klasse lösen:
Quelltext per HttpWebRequest einlesen
01020304050607
HttpWebRequest request = HttpWebRequest.CreateHttp("http://domain.tld/");
using(WebResponse response = request.GetResponse()) { using(StreamReader streamReader = new StreamReader(response.GetResponseStream())) { string content = streamReader.ReadToEnd(); }}
Noch kompakter lässt sich das Ganze mit Hilfe der Klassen WebClient oder HttpClient lösen:
Quelltext per WebClient oder HttpClient einlesen
010203040506070809101112131415161718
  // WebClientusing(WebClient webClient = new WebClient()) {      // blockierend    string content = webClient.DownloadString("http://domain.tld/");
// nicht blockierend webClient.DownloadStringCompleted += (sender, e) => { string content = e.Result; };
webClient.DownloadStringAsync(new Uri("http://domain.tld/"));}

// HttpClientusing(HttpClient httpClient = new HttpClient()) { string content = await httpClient.GetStringAsync("http://domain.tld/");}
Abschließend sei bemerkt, dass diese Möglichkeit nicht für fragliche Aktionen genutzt werden sollte – dazu gehört im Übrigen auch schlicht unnötiger Traffic. Smiley: winking

eMail mit C# versenden 👍 👎

Weil mich diese Frage recht häufig erreicht, möchte ich hier einmal festhalten, wie man eine einfache eMail mit C# versenden kann. PHP-Entwickler verweisen dabei gerne auf die kompakte mail(…)-Funktion.

Da das auch in C# sehr einfach ist, präsentiere ich direkt den Quelltext und setze verstärkt auf Auflistungsinitialisierer, womit sich die relevanten Stellen quasi von selbst kommentieren:
eMail mit C# versenden
0102030405060708091011121314151617181920
  // SMTP-Client zum MailserverSmtpClient client = new SmtpClient("mail.domain.tld") {      // Authentifizierungsdaten setzen    Credentials = new NetworkCredential() {        UserName = "Benutzername",        Password = "Passwort"    }};
// Nachricht erstellenMailMessage message = new MailMessage() { From = new MailAddress("absender@domain.tld", "Absender"), Subject = "Test", Body = "Text"};
message.To.Add(new MailAddress("empfänger@domain.tld", "Empfänger"));
// Nachricht versendenclient.Send(message);
Wer keine weiteren Ansprüche wie HTML-Inhalt, Datei-Anhänge etc. hat, kann das eigentliche Senden durchaus auch mit einem Einzeiler – ähnlich wie in PHP – ohne das Erzeugen einer MailMessage bewerkstelligen:
eMail mit C# versenden (ohne MailMessage)
0102
  // Nachricht versendenclient.Send("absender@domain.tld", "empfänger@domain.tld", "Test", "Text");
Für weitere Informationen zum Thema sollte man sich hauptsächlich den Namensraum System.Net.Mail im MSDN näher ansehen. An dieser Stelle auch noch einmal der Hinweis darauf, Ressourcen wieder freizugeben, worauf ich bei meinen Beispielen für gewöhnlich verzichte, um den Fokus auf das konkrete Beispiel zu legen.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche