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

 

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

UDP Socket Exception

Îåêßíçóå áðü ôï ìÝëïò dtakis. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 15-10-2008, 18:24. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-10-2008, 17:43 45429

    UDP Socket Exception

    Με while loop του παρακάτω κώδικα (while (processWorking == true)...)

    private const int listenPort = 514;

    class UdpState
    {
    public UdpClient u;
    public IPEndPoint e;
    }

    public static void ReceiveCallback(IAsyncResult ar)
    {
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;


    Byte[] receiveBytes = u.EndReceive(ar, ref e);
    string receiveString = Encoding.ASCII.GetString(receiveBytes);
    LogMessageToFile(receiveString);
    Console.WriteLine("Received:" + receiveString);
    ProcessSocketData(receiveString);

    //Console.WriteLine("Received: {0}", receiveString);
    messageReceived = true;


    }

    private static void StartListener()
    {

    bool processWorking = true;

    IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort);
    UdpClient u = new UdpClient(e);
    UdpState s = new UdpState();

    s.e = e;

    s.u = u;

    while (processWorking == true)
    {
    try
    {
    u.BeginReceive(new AsyncCallback(ReceiveCallback), s);
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception:" + ex);
    }


    Console.Write(".");

    Thread.Sleep(100);
    }


    }

    void main(){

    StartListener();

    }

    έχουμε exception:

    an operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

     

    Πως μπορούμε να αποφύγουμε να γεμίσει το buffer;

  •  13-10-2008, 19:45 45432 σε απάντηση της 45429

    Απ: UDP Socket Exception

    Χωρίς να είμαι απόλυτα σίγουρος για αυτό που λέω - δεν είμαι μπροστά σε dev. μηχάνημα - νομίζω ότι η χρήση του ασύγχρονου API,  σε συνδιασμό με το while (true) είναι που γεμίζει τους buffers σου; Η υπόθεσή μου είναι ότι το .BeginReceive στο συγκεκριμένο loop καλείται απλώς συνέχεια, γιατί δεν περιμένει να κάνει όντως ένα receive, βγαίνει κατευθείαν απο την κλήση και λόγω του while .. την ξανακάνει άπειρες φορές;

    Γιατί θες να χρησιμοποιήσεις το ασύγχρονο API ( καλά ... ανατριχιάζω κι ο ίδιος με αυτό που λέω τώρα, την εποχή που θέλουμε να γυρνάμε σε ασύγχρονη επεξεργασία όσο μπορούμε Big Smile ... ) ντε και καλά;

    Angel
    O:]
  •  13-10-2008, 21:12 45435 σε απάντηση της 45432

    Απ: UDP Socket Exception

    Και εγώ αυτο έχω καταλάβει φίλε μου αλλά θέλω να ακούω συνεχώς για incoming messages από UDP (syslog) οπότε το γυρίζω σε σύγχρονη λήψη και βλέπουμε (τι χάνουμε κτλ).

    Πάντως δεν μπορεί να μην υπάρχει ένας τρόπος να ακούει συνεχώς ασύγχρονα μηνύματα...

  •  14-10-2008, 15:43 45454 σε απάντηση της 45435

    Re: Απ: UDP Socket Exception

    Κάποια στιγμή που είχα μπλέξει σε ένα σχετικό εγχείρημα, είχα δει φως με αυτό, το οποίο δουλεύει αποδεδειγμένα πολύ ωραία σε non blocking mode επικοινωνία. Δυστυχώς δεν το χρησιμοποιήσαμε στην τελική λύση (για άσχετους λόγους) οπότε δεν μπορώ να πω 100% ότι δουλεύει χωρίς σφάλματα σε πραγματικό περιβάλλον, αλλά αν είναι τόσο σημαντικό να κερδίσεις performance overhead αξίζει να του ρίξεις μια ματιά.

     


    The people of the straight land have really got it made, a warm friendly sleep from the craddle to the grave
  •  15-10-2008, 18:24 45491 σε απάντηση της 45435

    Απ: UDP Socket Exception

    Ο Άγγελος έχει δίκιο. Αντί για το while (true) θα πρέπει να καλείς μέσα στην EndReceive ξανά την BeginReceive. Έτσι αρχίζεις να ξανακούς αμέσως μόλις λάβεις κάτι. Το while (true) έχει ως αποτέλεσμα να δημιουργούνται συνέχεια listeners με αποτέλεσμα να φτάσεις σχεδόν αμέσως στο όριο των πόσων listeners μπορείς να σηκώσεις. Πέρα από αυτό, ακόμα και αν δεν έσκαγε το πρόγραμμα μέχρι να λάβεις κάτι, θα προσπαθούσαν όλοι οι listeners μαζί να το επεξεργαστούν. Χάος.

    Την τεχνική του BeginReceive μέσα στο EndReceive την περιγράφει κάποιο άρθρο στο MSDN, απλά όχι αυτό που σου είχα πει νωρίτερα. Το άρθρο ήταν λίγο δύστροπο γιατί .... έδειχνε και Begin/EndReceive και Begin/EndRead μέσα στην Receive με αποτέλεσμα να είναι ... ελαφρώς περίπλοκο.

     

    Όσον αφορά το IP*Works που πρότεινε ο oldgeorge, είναι όντως μία πολύ καλή σουίτα ... αν θέλεις μία σουίτα από networking components. Θα σε γλυτώσει από τη φασαρία να μάθεις να δουλεύεις με ασύγχρονες κλήσεις και σου δίνει πολύ περισσότερα από απλά ένα εύκολο τρόπο να μιλήσεις με UDP. Από την άλλη, κάποια στιγμή θα πρέπει να μάθεις να δουλεύεις και με τον ασύγχρονο τρόπο ενώ τα $300 του IP*Works είναι πολλά αν το μόνο που σε ενδιαφέρει είναι να φτιάξεις ένα utilitάκι.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems