Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

WriteFile & ReadFile αλληλομπλοκαρονται σε Non-overlapped I/O

Îåêßíçóå áðü ôï ìÝëïò mixio. Τελευταία δημοσίευση από το μέλος mixio στις 02-03-2009, 18:20. Υπάρχουν 18 απαντήσεις.
Σελίδα 2 από 2 (19 εγγραφές)   < 1 2
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-02-2009, 00:00 48770 σε απάντηση της 48756

    Απ: WriteFile & Threads

    Markos:

    OK. Απλά μου πέρασε από το μυαλό μήπως ορίζει κάποιες static μεταβλητές που του δημιουργούν πρόβλημα. Γι' αυτό του είπα να τα βάλει σε μία κλάση. Βλέπεις, δε δίνει όλο τον κώδικα.



    Ο timer ειναι στατικ αφου ειναι και η main και αρχικοποιειται μεσα σ'αυτην. Παιζει ρολο;

    Sleep-deprived psychotic hacker

  •  27-02-2009, 00:17 48771 σε απάντηση της 48770

    Απ: WriteFile & Threads

    Όχι. Απλά μου πέρασε από το μυαλό μήπως στις κλήσεις των μεθόδων γινόταν κάποιο μπλέξιμο με τις μεταβλητές. Μάλλον ψάξου προς την κατεύθυνση που λέει ο Παναγιώτης.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  27-02-2009, 21:59 48789 σε απάντηση της 48771

    Απ: WriteFile & Threads

    Κατι νεο που βρηκα απο το http://gmitweb.gmit.ie/pdunne/opsys/labs/lab12/SerialCommsinWin32-Microsoft.pdf

    Nonoverlapped I/O

    If one thread is blocked waiting for its I/O operation to complete, all other threads that
    subsequently call a communications API will be blocked until the original operation completes.
    For instance, if one thread were waiting for a ReadFile function to return, any other thread that issued a WriteFile function
    would be blocked.

    Οι δυο τελευταιες σειρες ειναι ακριβως αυτο που συμβαινει σε μενα. Περιμενω την ReadFile() να τελιωσει. Επειτα ξεκιναει ο timer να εκτελει τις WriteLine().
    Oση ωρα δεν υπαρχει κατι νεο να διαβαστει οι WriteLine() μπλοκαρονται. Μολις υπαρξει κατι για διαβασμα ( δηλαδη να τελιωσει η ReadFile() ) αμεσως τρεχουν και οι υπολοιπες WriteLine που κληθηκαν απο το αλλο thread. Οποτε δεν ειναι θεμα των διαφορετικων thread που γραφουν στο ιδιο handle. Ειναι οτι χρησιμοποιω Nonoverlapped I/O το οποιο ετσι ειναι φτιαγμενο.

    Παραθετω το κομματι κωδικα. O write_timer ειναι αυτος που θα καλεσει τις WriteLine. Μολις τελιωσει ενα ReadLine θα ξεκινησουν τα WriteLine αλλα επειδη αμεσως θα κληθει ξανα η ReadLine θα μπλοκαρουν οι WriteLine μεχρι να γινει κατι και ερθουν data για διαβασμα.


    while (true)
    {
    if (Kernel32.ReadFile(tun.getTunHandle(), BufBytes, BufBytes.Length, out BytesRead, IntPtr.Zero))
    {
    write_timer.Stop();

    // Before we copy the actual IP Datagram to OutBytes
    // we have to add the linux TUN header [0x0 0x0 0x8 0x0]
    byte[] OutBytes = new byte[BytesRead + 4];
    OutBytes[0] = 0x0;
    OutBytes[1] = 0x0;
    OutBytes[2] = 0x8;
    OutBytes[3] = 0x0;

    // Copy the actual IP Datagram to OutBytes
    Array.Copy(BufBytes, 0, OutBytes, 4, BytesRead);

    // Send it for dns manipulation
    ManipulateTunPacket(OutBytes);

    write_timer.Start();
    }

    }

    Επειδη δεν θελω να παω σε Οverlapped I/O εχει κανεις καμια ιδεα για το πως αλλιως θα μπορουσα να το κανω;
    Δηλαδη πως θα μπορουσα να ξεμπλοκαρω την ReadLine. Θα μου πεις στειλε λιγα data για διαβασμα... Ε, ειναι λιγο τσομπανικο.
    Sleep-deprived psychotic hacker

  •  02-03-2009, 18:20 48814 σε απάντηση της 48789

    Απ: WriteFile & Threads

    Λυθηκε με Overlapped I/O.

    Βεβαια τωρα ανοιξαν αλλα θεματα.
    Οταν ειναι να περασει ενα IP πακετο με μεγεθος μεγαλυτερου απο το MTU της συσκευης συμβαινει IP fragmentation. Ετσι το wireshark θα δειξει δυο ip packets/fragments.
    Το προβλημα ειναι οτι η εφαρμογη μου διαβαζει μονο το 1ο frag. Το 2ο το χανει αλλα ξερω οτι υπηρξε αφου το βλεπω στο wireshark.
    Sleep-deprived psychotic hacker

Σελίδα 2 από 2 (19 εγγραφές)   < 1 2
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems