Winsock data loss

Συζητήσεις για τις γλώσσες του dot Net και για του Visual Studio της Microsoft

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
papas2
Δημοσιεύσεις: 59
Εγγραφή: 15 Μάιος 2004 18:16

Winsock data loss

Δημοσίευση από papas2 » 17 Μάιος 2010 23:02

Θελω να φτιαξω δυο προγραμματα client/server οπου client ζητα δεδομενα απο μια βαση δεδομενων που βλεπει ο server.Ο server αφου παρει την αιτηση απο τον client υπολογιζει τα δεδομενα και του τα επιστρεφει.Οταν ομως του τα επιστρεφει,με τη χρηση του winsock control,μερος των δεδομενων χανωνται χωρις να παρει χαμπαρει κανεις.Τελικα παρατηρησα οτι φταιει η ταχυτητα χρονισμου των δυο συστηματων και εβαλα μια καθυστερηση κατα την αποστολη.Ετσι ομως η επιστροφη των δεδομενων καθισταται αρκετα αργη π.χ:1000 εγραφες Χ 500ms για καθε εγραφη=500 sec!.Καμια ιδεα πως κα ξεπερασω το προβλημα?.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Winsock data loss

Δημοσίευση από nbc » 17 Μάιος 2010 23:21

Μήπως χρησιμοποιείς UDP αντί TCP?

papas2
Δημοσιεύσεις: 59
Εγγραφή: 15 Μάιος 2004 18:16

Winsock data loss

Δημοσίευση από papas2 » 18 Μάιος 2010 10:06

Οχι TCP χρησιμοποιω.Δες και εδω:
http://www.dreamincode.net/forums/topic ... p-winsock/
http://www.vbforums.com/showthread.php?t=173866

Νομιζω οτι το προβλημα οφειλεται σε αυτο:
http://tangentsoft.net/wskfaq/intermedi ... lly-window

Υπαρχει ενναλακτικος τροπος επικοινωνιας για μια client server εφαρμογη?.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Winsock data loss

Δημοσίευση από nbc » 18 Μάιος 2010 10:58

Δεν έχω εμπειρία από το control και περιβάλλον που χρησιμοποιείς, συνεπώς δεν μπορώ να είμαι συγκεκριμένος. Δουλεύω, όμως, sockets (σε C++) 15 χρόνια και μπορώ να σε διαβεβαιώσω πως δεν τίθεται θέμα απώλειας δεδομένων (σε TCP) ούτε κάποιου τεχνητού delay στην επικοινωνία. Έχω servers που ελέγχουν χιλιάδες PCs σε LANs, VPNs και WANs. Αν ήθελα delay για το καθένα καταλαβαίνεις ότι αυτό θα ήταν αδύνατο. Πέραν αυτού, σκέψου τους web/email servers ανά τον πλανήτη!

Αν ο server σου γράφει όπως πρέπει και ο client διαβάζει όπως πρέπει, τότε τα υπόλοιπα τα αναλαμβάνει το stack (winsock). Ειδικά τα 500ms που αναφέρεις είναι εξωφρενική τιμή. Είμαι βέβαιος ότι κάτι άλλο γίνεται στον κώδικά σου, δηλαδή στα loop εγγραφής / ανάγνωσης. Πρέπει να ελέγχεις τι σου επιστρέφουν οι send και recv και σε περίπτωση SOCKET_ERROR να καλείς το αντίστοιχο api για να δεις τι συμβαίνει. Τώρα, αν έχεις πέσει σε ελατωματικό component, τι να πω...

Κατ' αρχάς, δες αν τα socket σου είναι σε blocking ή non-blocking (asynchronous) state. Ξεκίνα με blocking καθώς είναι πολύ πιο απλή και κατανοητή διαδικασία και μπορείς να κάνεις debugging απείρως ευκολότερα. Χρησιμοποίησε logging τόσο στο server όσο και στον client. Δηλαδή, κάθε πακέτο που στέλνεις/λαμβάνεις μαζί με το return code, τύπωνέ το σε ένα αρχειάκι και μελέτα το.


Για τις εναλλακτικές μεθόδους που ρωτάς, στα Windows υπάρχουν αρκετές κάτω από το όνομα IPC. Σου συνιστώ να παραμείνεις στα sockets καθώς είναι η μόνη universal μέθοδος. Ειδικότερα όσον αφορά τα blocking sockets, οι εντολές είναι κοινές σε Windows και Unix/Linux (βασίζονται στα BSD sockets). Αν θες να δοκιμάσεις κάτι άλλο, τότε η επόμενη επιλογή είναι τα named pipes. Είναι ευκολότερα και έχουν τις ίδιες δυνατότητες.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Winsock data loss

Δημοσίευση από nbc » 18 Μάιος 2010 11:14

Κάτι άλλο που μπορεί να βοηθήσει (αν και μάλλον το γνωρίζεις):

Τα data δεν πάνε στον client με το ρυθμό που τα στέλνει ο server. Δηλαδή, αν ο server στείλει 16KB με μία εγγραφή, αυτό δε σημαίνει πως ο client θα μπορέσει να τα διαβάσει με μία ανάγνωση. Μπορεί να χρειαστεί 2 των 8KB, κοκ. Να θυμάσαι πως μεταξύ του server και client μεσολαβεί το stack που έχει δικό του buffer και διαδικασίες εγγραφής/ανάγνωσης.

Απάντηση

Επιστροφή στο “dot Net και Visual Studio”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης