Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω τον παρακατω κωδικα απο το 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();  }   }



			
		
Δημοσ.

Εξασφαλίζει πως μόλις τελειώσει το πάρε δώσε με κάποιον client ο server θα ετοιμαστεί να εξυπηρετήσει τον επόμενο (ο οποίος μπορεί π.χ. ήδη να περιμένει να συνδεθεί στο συγκεκριμένο παράδειγμα).

 

Η επανάληψή του δεν τελειώνει ποτέ εκτός αν κάπου στο ενδιάμεσο πεταχτεί κάποιου είδους exception.

Δημοσ.

Ενα παράδειγμα είναι αυτό, δεν είναι πλήρης 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 πρέπει να το χειρίζεσαι σε νέο νήμα

Δημοσ.

Ενα παράδειγμα είναι αυτό, δεν είναι πλήρης server με την ένοια ότι δεν δημιουργεί νήματα για τα child sockets, οπότε τα επεξεργάζεται σειριακά.

 

Στην ουσία κάθε νέο incoming connection πρέπει να το χειρίζεσαι σε νέο νήμα

 

Η προσέγγιση αυτή είναι ΟΚ για εκμάθηση αλλά στην πράξη κανένας απολύτως σοβαρός (πλήρης που λες) server δεν το κάνει αυτό. It does not scale. Αυτό που κάνουν είναι να χρησιμοποιούν ασύγχρονες τεχνικές προγραμματισμού (πράγμα που γίνεται και με τον TcpListener) ώστε να εξυπηρετούν χιλιάδες και βάλε clients από ένα server thread. Κλασικό παράδειγμα ο nginx για τον οποίο μπορείς να βρεις όσες πληροφορίες τραβάει η ψυχή σου στο internet (παράδειγμα).

  • Like 1
Δημοσ.


Για να μην ανοιγω νεο θεμα, φτιαχνω ενα 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);

Δημοσ.

Τι εννοείς "να δουλέψει στο internet"?

 

Εχω φτιαξει 2 εφαρμογες. Μια ChatClient και μια ChatServer. Θελω να ανοιξω την εφαρμογη ChatServer και να δωσω την wan ip μου στον αλλο που ειναι αυστραλια και τρεχει την εφαρμογη ChatClient και να συνδεθει και να μιλαμε. Ποια ip πρεπει να δωσω στο localAddr μεσα στον κωδικα για να δουλεψει. Τωρα που το δοκιμαζω σε lan βαζω την τοπικη ip που εχει ο server στο τοπικο δικτυο και δουλευει.




			
		
Δημοσ.

Τη wan ip αλλά πρέπει επίσης να ρυθμίσεις κατάλληλα το router σου γιατί κατά 99% ο υπολογιστής σου είναι πίσω από NAT.

 

Οι "τοπικές" IPs δεν γίνονται routed από κανένα δίκτυο οπότε εκτός και αν ελέγχεις όλους τους routers ανάμεσα σε σένα και τον άλλο ποτέ δεν υπάρχει περίπτωση να συνδεθείς μ' αυτές.

Δημοσ.

Οσον αφορα τον κωδικα για τον 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.

 

Δημοσ.

Τη wan ip αλλά πρέπει επίσης να ρυθμίσεις κατάλληλα το router σου γιατί κατά 99% ο υπολογιστής σου είναι πίσω από NAT.

 

Οι "τοπικές" IPs δεν γίνονται routed από κανένα δίκτυο οπότε εκτός και αν ελέγχεις όλους τους routers ανάμεσα σε σένα και τον άλλο ποτέ δεν υπάρχει περίπτωση να συνδεθείς μ' αυτές.

Γιατι τα λες τοσο πολυπλοκα;

 

1) Ο server μενει ως εχει.

2) Ο client θα κανει connect στην εξωτερικη ip του router σου ή καλυτερα στο domain που σου εχει (αν) δωσει ο παροχος. (whatsmyip.org)

3) Θα κανεις portforward την πορτα που εχει ο server σου (13000 στη περιπτωση σου), στην ip του υπολογιστη σου (εκει που ειναι ο σερβερ)

Δημοσ.

3) Θα κανεις portforward την πορτα που εχει ο server σου (13000 στη περιπτωση σου), στην ip του υπολογιστη σου (εκει που ειναι ο σερβερ)

 

Σε ποια ip; wan ή lan;

 

Τωρα που ξαναβλεπω το site απ'το οποιο πηρα τον κωδικα μαλλον εννοει την local ip.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...