Σιγουρα δεν εχω καταλαβει κατι αλλιως τωρα θα ειχα τελιωσει τα παντα μονος μου.

Κατσε να σε εξηγησω πως δουλευει το μοντελο αυτο.
Το UI thread ξεκιναει τον backgroundWorker ο οποιος ξεκιναει ενα αλλο thread μεσα στο οποιο τρεχει το παρακατω:
(Ξεκιναω αυτο το 2ο thread για να μην παγωνει το UI που συνεχως ανανεωνεται.)
while (true)
{
IAsyncResult asyncResult = this.TunStream.BeginRead(ReadBuffer, 0, ReadBuffer.Length, asyncCallback, null);
bytesRead = this.TunStream.EndRead(asyncResult);
}
Eρωτηση. Πρεπει να γεμισει ολο το ReadBuffer για να τελιωσει η BeginRead;
Η ουσία είναι ότι ή θα κάνεις ReadAsync εκτός του BackgroundWorker ή sync read εντός του BackgroundWorker.
Η while πρεπει να διαβαζει συνεχεια την virtual device η οποια περιεχει IP packets. Πρεπει να περιμενει μεχρι να διαβασει ενα πακετο.
Θα μου πεις κανε sync read αφου ειναι να περιμενεις. Το προβλημα ειναι οτι παραλληλα με τις BeginRead τρεχει ενας timer που κανει καθε sec ενα BeginWrite.
Αν εκανα sync read τοτε θα μπλοκαρε ο timer και δεν θα γινονταν τα write παρα μονο οταν τελιωνε το read.
(Στο DNS οταν στελνεις ενα query περιμενεις ενα response. Αν ο nameserver εχει και αλλη πληροφορια να σου μεταδωσει πρεπει να εσυ να τον κανεις trigger.
Αυτος ο timer κανει trigger τον nameserver και οτι επιπλεον πληροφορια του στελνει την κανει write στο virtual device.
Ετσι αν στο dns tunneling περιμενω να λαβω ενα IP packet αυτο θα ερθει σε κομματια που χωρανε σε Χ dns messages.
Το πρωτο κομματι θα μου ερθει κανονικα λογω του query που εστειλα αρχικα. Αλλα για τα υπολοιπα κομματια πρεπει να κανω trigger τον nameserver.)
Ετσι κανω τα BeginWrite και BeginRead για να μην μπλοκαρει καποιο Read η Write.
Και αμα κανω ReadAsync εκτός του BackgroundWorker ειπαμε θα παγωσει το GUI.
Νομιζω αν δεις τον κωδικα θα μπορεσεις να καταλαβεις καλυτερα τι γινεται.
Θα τον ανεβασω σημερα.
Sleep-deprived psychotic hacker