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

 

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

Περίεργη συμπεριφορά Winsock

Îåêßíçóå áðü ôï ìÝëïò Xlomo_prosopo. Τελευταία δημοσίευση από το μέλος Xlomo_prosopo στις 14-07-2006, 23:12. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-07-2006, 19:22 14480

    Περίεργη συμπεριφορά Winsock

    Πια ειναι η διαφορά των συναρτήσεων :

    Private Sub ws_server_DataArrival(index As Integer, ByVal bytesTotal As Long)
    Dim message As String
    Dim i As Integer

    ws_server(index).GetData message

    txt_chat.Text = txt_chat.Text + message + vbNewLine

    For i = 0 To ws - 1
        ws_server(i).SendData message
        txt_log.Text = txt_log.Text + "Sending Message to " + CStr(ws_server(i).RemoteHostIP) + vbNewLine
    Next i

    End Sub

    και
    Private Sub ws_server_DataArrival(index As Integer, ByVal bytesTotal As Long)
    Dim message As String
    Dim i As Integer

    msgbox("Sending message to clients")

    ws_server(index).GetData message

    txt_chat.Text = txt_chat.Text + message + vbNewLine

    For i = 0 To ws - 1
        ws_server(i).SendData message
        txt_log.Text = txt_log.Text + "Sending Message to " + CStr(ws_server(i).RemoteHostIP) + vbNewLine
    Next i

    End Sub

    Η διαφορά στον κώδικα είναι μόνο το msgbox, τa ws_server(index) είναι Winsock και το ws είναι μετριτής τους, κάθε ένα απο τα ws_server είναι συνδεδεμένο με ένα διαφορετικό client μέσω του ίδιου PORT (4444) . Στην πρώτη συνάρτηση το message στέλνεται μόνο στο client που είναι συνδεδεμένο με το ws_server με το μεγαλύτερο index ενώ στη δεύτερη στέλνεται σε όλους ανεξερέτως ! το ίδιο θα συμβεί και αν το msgbox μπει μέσα στο for !!!! Και η ερώτησή μου είναι : Τι διαφορά κάνει το Msgbox ?? και με τι μπορώ να το αντικαταστήσω για να έχω το ίδιο αποτέλεσμα ?
  •  12-07-2006, 11:36 14625 σε απάντηση της 14480

    Απ: Περίεργη συμπεριφορά Winsock

    Θα κάνω μια προσπάθεια να απαντήσω. Διόρθωσέ με αν κάνω κάπου λάθος, γιατί έχω καιρό να ασχοληθώ με winsock.

    Το πρόβλημα που έχεις νομίζω ότι έχει να κάνει με την λήψη στον server και όχι με την αποστολή στους client. Βλέπω ότι ο κώδικας είναι μέσα στο DataArrival του server. Πρόκεται για chat εφαρμογή αν δεν κανω λάθος, όπου κάνεις broadcast ένα μήνυμα που παίρνεις από ένα client προς όλους τους υπόλοιπους;

    Ο τρόπος που δουλεύει το DataArrival είναι λίγο διαφορετικός από ένα απλό event. Ουσιαστικά δεν διασφαλίζεται κάπου ότι το μήνυμά σου θα φτάσει σε ένα event ή σε περισσότερα ή αν το event περιλαμβάνει ένα μήνυμα ή περισσότερα.

    Δώσε μερικά ακόμα στοιχεία για τον κώδικα μήπως και βοηθήσουν.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  12-07-2006, 13:09 14628 σε απάντηση της 14480

    Απ: Περίεργη συμπεριφορά Winsock

    Αυτό ακριβώς προσπαθώ να κάνω. Κάθε client winsock είναι συνδεδεμένο σε ένα από τα server winsock. Κάθε φορά που ένα client στέλνει δεδομένα, αυτά λαμβάνονται μόνο από τον server στον οποίο συνδέθηκε. θέλω κάθε φορά που τα δεδομένα φτάνουν σε κάποιον server όλοι οι server να τα στέλνουν στα client winsock που είναι συνδεδεμένα σε αυτούς. Από ό,τι έχω καταλάβει μέχρι τώρα, αν γίνει αποστολή από ένα server χωρις να ολοκληρωθεί η αποστολή του προιγούμενου τότε η αποστολή του προηγούμενου ακυρώνεται !!! εκτώς αν μπει το MsgBox ίσως γιατί έτσι γίνεται μια καθυστέρηση.

    Το πρόβλημα το έλυσα κάπως με το event SendComplete(index ....) στο οποίο κάνω send τα δεδομένα του winsock (index + 1) , αλλά αυτό μου δημιουργεί άλλες δυσκολίες και κάνει πιο δυσνόητο το πρόγραμμα.

    Αν γίνει το DataArival να σπάει ή να χάνει μυνήματα επειδή έφτασαν πολλά ταυτόχρονα, δεν με έχει απασχολήσει ακόμα. Και απο τις δοκιμές δεν έχω δει κάποιο πρόβλημα αν και δεν το δοκίμασα με πολλους χρήστες ενώ στέλνουν ΤΑΥΤΟΧΡΟΝΑ μυνήματα.
  •  12-07-2006, 13:46 14629 σε απάντηση της 14628

    Απ: Περίεργη συμπεριφορά Winsock

     Xlomo_prosopo wrote:
    Αυτό ακριβώς προσπαθώ να κάνω. Κάθε client winsock είναι συνδεδεμένο σε ένα από τα server winsock. Κάθε φορά που ένα client στέλνει δεδομένα, αυτά λαμβάνονται μόνο από τον server στον οποίο συνδέθηκε. θέλω κάθε φορά που τα δεδομένα φτάνουν σε κάποιον server όλοι οι server να τα στέλνουν στα client winsock που είναι συνδεδεμένα σε αυτούς. Από ό,τι έχω καταλάβει μέχρι τώρα, αν γίνει αποστολή από ένα server χωρις να ολοκληρωθεί η αποστολή του προιγούμενου τότε η αποστολή του προηγούμενου ακυρώνεται !!! εκτώς αν μπει το MsgBox ίσως γιατί έτσι γίνεται μια καθυστέρηση.

    Το πρόβλημα το έλυσα κάπως με το event SendComplete(index ....) στο οποίο κάνω send τα δεδομένα του winsock (index + 1) , αλλά αυτό μου δημιουργεί άλλες δυσκολίες και κάνει πιο δυσνόητο το πρόγραμμα.

    Δοκίμασε να φιάξεις μια κλάση που θα περιέχει ένα winsock και να λαμβάνεις εκεί τα events. Αντί για το control array που έχεις τώρα, θα έχεις ένα collection από κλάσεις. Θα ξεμπερδέψεις λίγο τα πράγματα, μια που το κάθε winsock θα στέλνει τα events του σε διαφορετικό instance.

     Xlomo_prosopo wrote:
    Αν γίνει το DataArival να σπάει ή να χάνει μυνήματα επειδή έφτασαν πολλά ταυτόχρονα, δεν με έχει απασχολήσει ακόμα. Και απο τις δοκιμές δεν έχω δει κάποιο πρόβλημα αν και δεν το δοκίμασα με πολλους χρήστες ενώ στέλνουν ΤΑΥΤΟΧΡΟΝΑ μυνήματα.

    Θα σε απασχολήσει αν προσπαθήσεις να στείλεις μεγάλα μηνύματα που δεν χωράνει στον buffer του winsock ή αν στείλεις πολλά μικρά μηνύματα διαδοχικά. Τότε θα δεις ότι το arrival event μπορεί να τρέχει περισσότερες φορές από όσα send έκανε η άλλη πλευρά. Επίσης αν η άλλη πλευρά στείλει μικρά μηνύματα που χωράνε μαζί στον buffer και τα στείλει πολύ γρήγορα με δυο διαδοχικά send, το arrival event μπορεί να τρέξει μόνο μια φορά!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  12-07-2006, 13:49 14630 σε απάντηση της 14629

    Απ: Περίεργη συμπεριφορά Winsock

    και για να μην σου μπαίνουν ιδέες, ακριβώς έτσι δουλεύει και το winsock στο .NET. Η διαφορά είναι ότι στο .NET υπάρχει και winsock κλάση, οπότε δεν χρειάζεται να έχεις μια φόρμα ως container.
    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  12-07-2006, 20:20 14638 σε απάντηση της 14480

    Απ: Περίεργη συμπεριφορά Winsock

     Xlomo_prosopo wrote:

    Η διαφορά στον κώδικα είναι μόνο το msgbox, τa ws_server(index) είναι Winsock και το ws είναι μετριτής τους, κάθε ένα απο τα ws_server είναι συνδεδεμένο με ένα διαφορετικό client μέσω του ίδιου PORT (4444) . Στην πρώτη συνάρτηση το message στέλνεται μόνο στο client που είναι συνδεδεμένο με το ws_server με το μεγαλύτερο index ενώ στη δεύτερη στέλνεται σε όλους ανεξερέτως ! το ίδιο θα συμβεί και αν το msgbox μπει μέσα στο for !!!! Και η ερώτησή μου είναι : Τι διαφορά κάνει το Msgbox ?? και με τι μπορώ να το αντικαταστήσω για να έχω το ίδιο αποτέλεσμα ?

    Το θέμα είναι ότι είσαι μέσα σε ένα event. Θα πρότεινα να αντικαταστήσεις το MsgBox με ένα DoEvents, να δεις αν θα βελτιώσει την κατάσταση.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  13-07-2006, 14:47 14670 σε απάντηση της 14638

    Απ: Περίεργη συμπεριφορά Winsock

     papadi wrote:

    Δοκίμασε να φιάξεις μια κλάση που θα περιέχει ένα winsock και να λαμβάνεις εκεί τα events. Αντί για το control array που έχεις τώρα, θα έχεις ένα collection από κλάσεις. Θα ξεμπερδέψεις λίγο τα πράγματα, μια που το κάθε winsock θα στέλνει τα events του σε διαφορετικό instance.


    Έχεις να προτείνεις URL που να περιγράφει Collection και Κλάσεις ;


     gcapnias wrote:

    Το θέμα είναι ότι είσαι μέσα σε ένα event. Θα πρότεινα να αντικαταστήσεις το MsgBox με ένα DoEvents, να δεις αν θα βελτιώσει την κατάσταση.


     Που μπορώ να βρω πως λειτουργεί και παραδείγματα χρήσης DoEvents;
  •  13-07-2006, 15:49 14676 σε απάντηση της 14670

    Απ: Περίεργη συμπεριφορά Winsock

    αφού, όπως φαίνεται, δεν έχεις αρκετή εμπειρία στην VB6, θα έλεγα πως δεν αξίζει να ψάχνεις και να διαβάζεις άρθρα γι αυτήν, εκτός και αν σου έχει θέσεις κανείς την VB6 ως προϋπόθεση. Διαφορετικά θα έλεγα να δοκιμάσεις να το κάνεις σε VB7 ή 8 (.NET 1.1 ή .NET 2.0 αντίστοιχα). Θα βρεις πολλά έτοιμα παραδείγματα εφαρμογών chat.


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  13-07-2006, 22:37 14705 σε απάντηση της 14670

    Απ: Περίεργη συμπεριφορά Winsock

     Xlomo_prosopo wrote:
     gcapnias wrote:

    Το θέμα είναι ότι είσαι μέσα σε ένα event. Θα πρότεινα να αντικαταστήσεις το MsgBox με ένα DoEvents, να δεις αν θα βελτιώσει την κατάσταση.


    Που μπορώ να βρω πως λειτουργεί και παραδείγματα χρήσης DoEvents;

    Η DoEvents, ουσιαστικά δεν κάνει τίποτα! Big Smile Απλά μεταφέρει στιγμιαία τον έλεγχο από το πρόγραμμά σου στο λειτουργικό σύστημα, για να μπορέσουν να εκτελεστούν άλλες εργασίες. Είναι απαραίτητο όταν εκτελείς σε βρόγχους εργασίες και δεν αφήνουν τα υπόλοιπα events να δουλέψουν. Η βιογραφία της εντολής και παράδειγμα μπορεί να βρεθεί εδώ...

    Ο κώδικάς σου με την DoEvents θα πρέπει να γίνει κάπως έτσι:

    Private Sub ws_server_DataArrival(index As Integer, ByVal bytesTotal As Long)
    Dim message As String
    Dim i As Integer

    msgbox("Sending message to clients")

    ws_server(index).GetData message

    txt_chat.Text = txt_chat.Text + message + vbNewLine

    For i = 0 To ws - 1
        ws_server(i).SendData message
        DoEvents
        txt_log.Text = txt_log.Text + "Sending Message to " + CStr(ws_server(i).RemoteHostIP) + vbNewLine
    Next i

    End Sub

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  14-07-2006, 23:12 14770 σε απάντηση της 14480

    Απ: Περίεργη συμπεριφορά Winsock

    Χε Χε Χε !!!! Για δες που οι εντολές που δεν κάνουν τίποτα, κάνουν τη διαφορά !!!!

    Μάθαμε κάτι πάλι σήμερα ! Ευχαριστώ gcapnias, papadi για το σεμινάριο !
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems