EulerHobeln:NET-Architektur: Unterschied zwischen den Versionen
Pegro (Diskussion | Beiträge) |
|||
Zeile 21: | Zeile 21: | ||
=== asynchron === | === asynchron === | ||
+ | |||
+ | [[Kategorie:EulerHobeln]] |
Aktuelle Version vom 2. April 2006, 17:09 Uhr
.NET-Architektur
Wie jede Komponente dieses Projekts, egal in welcher Sprache, basieren die Endpoints auf dem TCP Protokoll. Dementsprechend werden in .NET Sockets konfiguriert, die auf die Adressfamilie (System.Net.AddressFamily) des TCP (Net.ProtocolType.Tcp) Protokolls abgestimmt sind. Da TCP auf dem Gedanken des "Verbindung herstellen, Daten senden, Daten empfangen, Verbindung schließen"-Konzepts basiert, gilt es dieses zu umgehen. Das wird u. a. im folgenden beschrieben.
Server
Der Server arbeitet sowohl synchron als auch asynchron: Für Verbindungsherstellungsanfragen läuft der Server im synchronen Modus, für bereits hergestellte Verbindung läuft er asynchron.
synchron
Der Main-Thread des Server kümmert sich ausschließlich um Verbindungsherstellungsanfragen. Geht solch eine Anfrage beim Server ein, wird ein Socket aktiv, welches im Listen-Modus läuft, um Anfragen anzunehmen. Der Mainthread sendet erst noch einen MOINMOIN Befehl (gemäß O2Mega-Protokoll) an den Requester. Anschließend wird durch Socket.Accept() ein neues Socket erzeugt, welches sich für die Zukunft ausschließlich dieser einen neuen Verbindung widmet. Dieses Socket wird außerdem in einer Liste gespeichert als Type gespeichert: Da es sich bei .NET um den Gedanken des managed Code handelt, ist es nicht möglichen - wie in vielen Sprachen üblich - einen Pointer auf den erzeugten Thread zu setzen und den Pointer zu speichern. Es gibt zwar eine Wrapper-Klasse für Pointer, diese kann aber nicht verwendet werden, da sie von der CLR nicht unterstützt wird, was widerum auswirkungen auf die Verwendbarkeit der Software im Compact Framework hätte - der Server würde nicht laufen. Also wird dementsprechend ein .NET Pendant verwendet: Den MakePointerType() aus dem System.Type Namensraum. Das ganze ist am Ende halt wieder ein Type. Damit bleit man aber CLR-kompatibel. Der wirkliche Pointer hat - da er zum unmanaged Code gehört - noch einen weiteren Nachteil: er benötigt erweiterte Sicherheitsfreigaben im System.Security Namensraum.
Zurück zum erzeugten Socket für die eingegangene Verbindung: Dieser Socket läuft ab sofort in einem eigenen Thread und damit asynchron zum Server. Dieser Thread wird mittels Threading.ThreadPool.QueueWorkerItem() im Mainthread zur Verfügung gestellt.