jojor Δημοσ. 20 Δεκεμβρίου 2014 Δημοσ. 20 Δεκεμβρίου 2014 Κατά την υλοποίηση μιας εφαρμογής synchronous tcp server/client έχω ένα θέμα στο κομμάτι του client. Όταν ο ο client προσπαθεί να συνδεθεί στον server και ο server δεν τρέχει, όπως είναι φυσικό μου κολλάει στο σημείο try { tcpClient.Connect(serverIp, port); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.ConnectionRefused || ex.SocketErrorCode == SocketError.TimedOut) { Console.WriteLine("Probably the server is not running ... will try to reconnect in 3 seconds"); } } catch (Exception e) { Console.WriteLine("Exception caught : {0}", e.ToString()); } περιμένοντας μέχρι να τρέξει ο server. Επειδή δεν θέλω να πάω σε ασύγχρονες μεθόδους, δοκίμασα να κάνω ένα έλεγχο πριν την προσπάθεια σύνδεσης ως εξής private bool ServerIsConnected(IPAddress address, int port) { bool result = false; Ping p = new Ping(); PingReply reply = p.Send(address, port); if (reply.Status == IPStatus.Success) return true; return result; } ανεπιτυχώς διότι ακόμα και όταν δεν τρέχει ο server μου επιστρέφει true. Να σημειώσω ότι και κατά την υλοποίηση του server είχα θέμα σε 2 σημεία if (!tcpListener.Pending()) { Thread.Sleep(100); continue; } tcpClient[cln.Count] = tcpListener.AcceptTcpClient(); όπου λύθηκε με τον έλεγχο που φαίνεται στο if. Δηλαδή και εδώ ο tcpListener κολλούσε μέχρι να συνδεθεί ο πρώτος πελάτης. Και στο σημείο παραλαβής δεδομένων από τον server if(!ns.DataAvailable) { Thread.Sleep(10); continue; } ns.Read(rec, 0, 14); όπου ns NetworkStream. Δηλαδή έλεγχα εάν δεν υπάρχουν δεδομένα στο stream πριν να κάνω ανάγνωση. Παρακαλώ την βοήθειά σας σε έναν αρχάριο χομπίστα προγραμματιστή.
Papakaliati Δημοσ. 20 Δεκεμβρίου 2014 Δημοσ. 20 Δεκεμβρίου 2014 Δεν υπαρχει κανενας λογος να το πας σύγχρονα. Αμα δε και καλα θελεις να χρησιμοποιησεις το σύγχρονο tcpClient.Connect, τρεξτο σε αλλο thread ωστε να μην κολλαει τo main thread σου. Η αλλιως βαλε timeout στο connect, που και παει θα ειναι κολλημενο το ui οσο θελει για το timeout. Και γιατι θελεις δε και καλα να κανεις αναποδα κατι που πρεπει να γινει asynchronous? Σαν χομπιστας προγραμματιστης θα ητανε καλο να μαθεις να χρησιμοποιεις asynchronous programming και περισσοτερα απο το main threads. 1
nilosgr Δημοσ. 20 Δεκεμβρίου 2014 Δημοσ. 20 Δεκεμβρίου 2014 Δες εδω http://stackoverflow.com/questions/17118632/how-to-set-the-timeout-for-a-tcpclient 1
geo1st487 Δημοσ. 22 Δεκεμβρίου 2014 Δημοσ. 22 Δεκεμβρίου 2014 Για να μην ανοιγω αλλο θεμα χρησιμοποιησα σε WinForms το σύγχρονο tcpClient.Connect, σε αλλο thread και δεν κολαει. Το προβλημα τωρα ειναι οτι οταν πατησω connect χωρις να τρεξει ο server και μετα αμεσως κλεισω την εφαρμογη, το παραθυρο κλεινει αλλα παραμενει στη μνημη (το ειδα στον task manager) μεχρι το timeout, οπου θα πεταξει ενα messagebox με το exception (εχω βαλει try). Μετα το timeout φυσικα κλεινει. Πως θα γινει να κλεινει αμεσα με το κλεισιμο της εφαρμογης; Στην ουσια να ακυρωνει το connect και να μη περιμενει μεχρι να ληξει ο χρονος.
albNik Δημοσ. 22 Δεκεμβρίου 2014 Δημοσ. 22 Δεκεμβρίου 2014 Βαλε IsBackground=true στο thread του connect και θα τερματιστεί μολις κλεισει το παραθυρο.
geo1st487 Δημοσ. 22 Δεκεμβρίου 2014 Δημοσ. 22 Δεκεμβρίου 2014 Βαλε IsBackground=true στο thread του connect και θα τερματιστεί μολις κλεισει το παραθυρο. Αυτο ηταν! Thanks!
geo1st487 Δημοσ. 25 Δεκεμβρίου 2014 Δημοσ. 25 Δεκεμβρίου 2014 Βαλε -1 Τι γραφω; Και μια απορια ακομα. Με το synchronous tcp server/client μπορει να στελνει δεδομενα ταυτοχρονα ο client στον server και αντιστροφα ή αυτο γινεται μονο ασυγχρονα;
albNik Δημοσ. 25 Δεκεμβρίου 2014 Δημοσ. 25 Δεκεμβρίου 2014 Στο ReceiveTimeout ή SendTimeout του socket. Αφου η Stream.Read() μπλοκαρει μερχι να λαβεις κατι σημαινει ότι η συναρτηση δεν προχωράει πιο κατω ωστε να εκτελεσεις καποια Write (εκτός και αν γραφεις από αλλο thread). H BeginRead επιστρεφει αμεσως και καλειται το callback μόνο οταν εχεις κατι να διαβασεις. Εν τω μεταξυ μπορεις να γραφεις.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα