geo1st487 Δημοσ. 17 Δεκεμβρίου 2014 Δημοσ. 17 Δεκεμβρίου 2014 Εχω τον παρακατω κωδικα απο το site της microsoft. Δεν μπορω να καταλαβω τι κανει το εξωτερικο while και ποτε τελειωνει η επαναληψη του. using System;using System.IO;using System.Net;using System.Net.Sockets;using System.Text;class MyTcpListener{ public static void Main() { TcpListener server=null; try { // Set the TcpListener on port 13000. Int32 port = 13000; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // TcpListener server = new TcpListener(port); server = new TcpListener(localAddr, port); // Start listening for client requests. server.Start(); // Buffer for reading data Byte[] bytes = new Byte[256]; String data = null; // Enter the listening loop. while(true) { Console.Write("Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also user server.AcceptSocket() here. TcpClient client = server.AcceptTcpClient(); Console.WriteLine("Connected!"); data = null; // Get a stream object for reading and writing NetworkStream stream = client.GetStream(); int i; // Loop to receive all the data sent by the client. while((i = stream.Read(bytes, 0, bytes.Length))!=0) { // Translate data bytes to a ASCII string. data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); Console.WriteLine("Received: {0}", data); // Process the data sent by the client. data = data.ToUpper(); byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); // Send back a response. stream.Write(msg, 0, msg.Length); Console.WriteLine("Sent: {0}", data); } // Shutdown and end connection client.Close(); } } catch(SocketException e) { Console.WriteLine("SocketException: {0}", e); } finally { // Stop listening for new clients. server.Stop(); } Console.WriteLine("\nHit enter to continue..."); Console.Read(); } }
defacer Δημοσ. 17 Δεκεμβρίου 2014 Δημοσ. 17 Δεκεμβρίου 2014 Εξασφαλίζει πως μόλις τελειώσει το πάρε δώσε με κάποιον client ο server θα ετοιμαστεί να εξυπηρετήσει τον επόμενο (ο οποίος μπορεί π.χ. ήδη να περιμένει να συνδεθεί στο συγκεκριμένο παράδειγμα). Η επανάληψή του δεν τελειώνει ποτέ εκτός αν κάπου στο ενδιάμεσο πεταχτεί κάποιου είδους exception.
takeda Δημοσ. 18 Δεκεμβρίου 2014 Δημοσ. 18 Δεκεμβρίου 2014 Ενα παράδειγμα είναι αυτό, δεν είναι πλήρης server με την ένοια ότι δεν δημιουργεί νήματα για τα child sockets, οπότε τα επεξεργάζεται σειριακά. Το while(true) σωστό είναι, δηλαδή ο server ακούει για πάντα, εκτός και αν τον κάνεις interrupt όπου θα εκτελεστεί το final block. Απο μόνο του μπορεί να λήξει με SocketException. Το documentation λεει Use the Start method to begin listening for incoming connection requests. Start will queue incoming connections until you either call the Stop method or it has queued MaxConnections. Use either AcceptSocket or AcceptTcpClient to pull a connection from the incoming connection request queue. These two methods will block. If you want to avoid blocking, you can use the Pending method first to determine if connection requests are available in the queue. οπότε υποθέτω ότι η blocking μέθοδος στην όλη υπόθεση είναι η AcceptSocket. Στην ουσία κάθε νέο incoming connection πρέπει να το χειρίζεσαι σε νέο νήμα
defacer Δημοσ. 18 Δεκεμβρίου 2014 Δημοσ. 18 Δεκεμβρίου 2014 Ενα παράδειγμα είναι αυτό, δεν είναι πλήρης server με την ένοια ότι δεν δημιουργεί νήματα για τα child sockets, οπότε τα επεξεργάζεται σειριακά. Στην ουσία κάθε νέο incoming connection πρέπει να το χειρίζεσαι σε νέο νήμα Η προσέγγιση αυτή είναι ΟΚ για εκμάθηση αλλά στην πράξη κανένας απολύτως σοβαρός (πλήρης που λες) server δεν το κάνει αυτό. It does not scale. Αυτό που κάνουν είναι να χρησιμοποιούν ασύγχρονες τεχνικές προγραμματισμού (πράγμα που γίνεται και με τον TcpListener) ώστε να εξυπηρετούν χιλιάδες και βάλε clients από ένα server thread. Κλασικό παράδειγμα ο nginx για τον οποίο μπορείς να βρεις όσες πληροφορίες τραβάει η ψυχή σου στο internet (παράδειγμα). 1
geo1st487 Δημοσ. 18 Δεκεμβρίου 2014 Μέλος Δημοσ. 18 Δεκεμβρίου 2014 Για να μην ανοιγω νεο θεμα, φτιαχνω ενα chat σε winforms με βαση τον παραπανω κωδικα και τον αντιστοιχο κωδικα για client και δουλευει σε LAN. Για να δουλεψει στο internet στον παρακατω κωδικα πρεπει να δωσω την wan ip ή την lan ip; // Set the TcpListener on port 13000. Int32 port = 13000; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // TcpListener server = new TcpListener(port); server = new TcpListener(localAddr, port);
geo1st487 Δημοσ. 18 Δεκεμβρίου 2014 Μέλος Δημοσ. 18 Δεκεμβρίου 2014 Τι εννοείς "να δουλέψει στο internet"? Εχω φτιαξει 2 εφαρμογες. Μια ChatClient και μια ChatServer. Θελω να ανοιξω την εφαρμογη ChatServer και να δωσω την wan ip μου στον αλλο που ειναι αυστραλια και τρεχει την εφαρμογη ChatClient και να συνδεθει και να μιλαμε. Ποια ip πρεπει να δωσω στο localAddr μεσα στον κωδικα για να δουλεψει. Τωρα που το δοκιμαζω σε lan βαζω την τοπικη ip που εχει ο server στο τοπικο δικτυο και δουλευει.
defacer Δημοσ. 18 Δεκεμβρίου 2014 Δημοσ. 18 Δεκεμβρίου 2014 Τη wan ip αλλά πρέπει επίσης να ρυθμίσεις κατάλληλα το router σου γιατί κατά 99% ο υπολογιστής σου είναι πίσω από NAT. Οι "τοπικές" IPs δεν γίνονται routed από κανένα δίκτυο οπότε εκτός και αν ελέγχεις όλους τους routers ανάμεσα σε σένα και τον άλλο ποτέ δεν υπάρχει περίπτωση να συνδεθείς μ' αυτές.
geo1st487 Δημοσ. 19 Δεκεμβρίου 2014 Μέλος Δημοσ. 19 Δεκεμβρίου 2014 Οσον αφορα τον κωδικα για τον server με προβληματισε ποια ip θα επρεπε να παρει το localAddr γιατι σκεφτηκα το εξης: O client κανει κληση στη wan ip του server και ο server κατευθυνει σε ποια local ip θα συνδεθει απο την αποψη οτι στην wan ip μπορει να αντιστοιχουν περισσοτερα απο 1 pc (αν ειναι στο ρουτερ περισσοτερα απο 1 pc συνδεμενα). Γιαυτο σκεφτηκα μηπως το localAddr θα πρεπει να παρει την local ip. Στις ρυθμισεις του router ειναι ενεργοποιημενο το ΝΑΤ. Θα πρεπει να το απενεργοποιησω για να μπορεσει να συνδεθει; Παλια ειχα κανει ενα παιχνιδι το SOS σε VB6 (το γνωστο που παιζεται στο χαρτι ή στον πινακα) το οποιο ειχε και chat. Θυμαμαι τοτε ενω επαιζε σε lan δεν επαιζε στο internet. Τοτε ειχα αλλο ρουτερ και δεν θυμαμαι αν ηταν ενεργοποιημεντο το ΝΑΤ. Αυτο που εκανα τελικα και δουλεψε ηταν που ενεργοποιησα το DMZ απο τις ρυθμισεις του ρουτερ. Στις ρυθμισεις του ρουτερ που εχω τωρα αναφερει για το ΝΑΤ το παρακατω οποτε υποθετω οτι αν απενεργοποιηθει θα δουλεψει ισως και χωρις να ενεργοποιησω το DMZ. Απλα δεν συνισταται να το εχω μονιμα απενεργοποιημενο λογω των cyberattacks. "By default NAT does not respond to unsolicited incoming requests on any port, thereby making your LAN invisible to Internet cyberattackers." Επισης για το DMZ γραφει το εξης: DMZ means 'Demilitarised Zone'. DMZ allows computers behind the router firewall to be accessible to Internet traffic. Typically, your DMZ would contain Web servers, FTP servers, and others. The DMZ (Demilitarized Zone) option lets you set a single computer on your network outside of the router. If you have a computer that cannot run Internet applications successfully from behind the router, then you can place the computer into the DMZ for unrestricted Internet access. Note: Putting a computer in the DMZ may expose that computer to a variety of security risks. Use of this option is only recommended as a last resort.
παπι Δημοσ. 19 Δεκεμβρίου 2014 Δημοσ. 19 Δεκεμβρίου 2014 Τη wan ip αλλά πρέπει επίσης να ρυθμίσεις κατάλληλα το router σου γιατί κατά 99% ο υπολογιστής σου είναι πίσω από NAT. Οι "τοπικές" IPs δεν γίνονται routed από κανένα δίκτυο οπότε εκτός και αν ελέγχεις όλους τους routers ανάμεσα σε σένα και τον άλλο ποτέ δεν υπάρχει περίπτωση να συνδεθείς μ' αυτές. Γιατι τα λες τοσο πολυπλοκα; 1) Ο server μενει ως εχει. 2) Ο client θα κανει connect στην εξωτερικη ip του router σου ή καλυτερα στο domain που σου εχει (αν) δωσει ο παροχος. (whatsmyip.org) 3) Θα κανεις portforward την πορτα που εχει ο server σου (13000 στη περιπτωση σου), στην ip του υπολογιστη σου (εκει που ειναι ο σερβερ)
geo1st487 Δημοσ. 19 Δεκεμβρίου 2014 Μέλος Δημοσ. 19 Δεκεμβρίου 2014 3) Θα κανεις portforward την πορτα που εχει ο server σου (13000 στη περιπτωση σου), στην ip του υπολογιστη σου (εκει που ειναι ο σερβερ) Σε ποια ip; wan ή lan; Τωρα που ξαναβλεπω το site απ'το οποιο πηρα τον κωδικα μαλλον εννοει την local ip.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα