Κωνσταντίνος Αντωνής © 2014Διαδικτυακός και Ταυτόχρονος Προγραμματισμός Ζητήματα Σχεδίασης Λογισμικού Πελάτη 1
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναγνώριση Τοποθεσίας Εξυπηρετητή Για την αναγνώριση της διεύθυνσης και της θύρας ενός εξυπηρετητή ο πελάτης μπορεί να ακολουθήσει μία από τις παρακάτω μεθόδους: Ο πελάτης διαθέτει το domain name ή τη διεύθυνση IP του εξυπηρετητή ορισμένη ως σταθερά. Ο πελάτης μπορεί να απαιτήσει από το χρήση να προσδιορίσει τον εξυπηρετητή κατά την κλήση Ο πελάτης μπορεί να αποκτήσει πληροφορίες για τον εξυπηρετητή π.χ. από ένα αρχείο Ο πελάτης μπορεί να χρησιμοποιεί ένα ξεχωριστό πρωτόκολλο για να βρει τον εξυπηρετητή π.χ. χρήση multicast ή broadcast μηνυμάτων 2
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Ανάλυση Ορίσματος Διεύθυνσης Ο χρήστης παρέχει είτε το όνομα περιοχής που βρίσκεται ο εξυπηρετητής: merlin.cs.purdue.edu Ή μια IP διεύθυνση : Μπορεί επίσης να συνδυάσει και τον προσδιορισμό της θύρας του πρωτοκόλλου σε ένα όρισμα merlin.cs.purdue.edu:smtp 3
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναζήτηση Ονόματος Περιοχής 4 #include struct hostent *gethostbyname(const char *hostname); struct hostent { char *h_name;/*official host name */ char **h_aliases;/*other aliases */ int h_addrtype;/*address type */ int h_length;/*address length */ char **h_addr_list;/*list of addresses */ }; #define h_addr h_addr_list[0]
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © Η δομή hostent
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναζήτηση Ονόματος Περιοχής (2) 6 struct hostent *hptr; struct sockaddr_in peeraddr; char *examplenam = "merlin.cs.purdue.edu"; //ή char *examplenam = argv[1]; if (hptr = gethostbyname (examplenam )) { /* IP address is now in hptr ->h_addr */ } else { /* error in name - handle it */ } peeraddr.sin_family = AF_INET; peeraddr.sin_addr.s_addr = ((struct in_addr *) (hptr->h_addr))->s_addr;
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναζήτηση Προκαθορισμένης Θύρας 7 #include struct servent *getservbyname(const char *servname, const char *protoname); struct servent { char *s_name; /*official service name */ char **s_aliases; /*other aliases */ int s_port; /*port for this service */ char *s_proto; /*protocol to use */ }; #include struct servent *getservbyport(int port, const char *protoname);
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναζήτηση Προκαθορισμένης Θύρας (2) 8 struct servent *sptr; if (sptr = getservbyname ("smtp","tcp" )) { /* port number is now in sptr ->s_port */ } else { /* error occurred - handle it */ } peeraddr.sin_port = sptr->s_port; Η χρήση συναρτήσεων όπως οι παραπάνω, οδηγεί σε μεγαλύτερη μεταφερσιμότητα, λειτουργικότητα και γενικότητα στην πλευρά του πελάτη, αφού είναι εφικτό το πέρασμα παραμέτρων
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αναζήτηση Πρωτοκόλλου με το όνομα 9 struct protoent { char *p_name; /*official protocol name */ char **p_aliases; /*list of aliases allowed*/ int p_proto; /* official protocol number */ }; struct protoent *pptr; if (pptr = getprotobyname (“udp” )) { /* official protocol number is is now in pptr ->p_proto */ } else { /* error occurred - handle it */ }
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αλγόριθμος Πελάτη TCP 1.Βρες τη διεύθυνση IP και τη θύρα πρωτοκόλλου του εξυπηρετητή 2.Απόκτησε ένα socket 3.Προσδιόρισε ότι η σύνδεση απαιτεί μια αυθαίρετη, αχρησιμοποίητη θύρα πρωτοκόλλου στο τοπικό μηχάνημα, και επέτρεψε στο TCP να διαλέξει μία 4.Σύνδεσε το socket στον εξυπηρετητή 5.Επικοινώνησε με τον εξυπηρετητή χρησιμοποιώντας το πρωτόκολλο επιπέδου εφαρμογής 6.Τερμάτισε τη σύνδεση 10
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Μερικό Κλείσιμο Σύνδεσης 11 #include errcode=shutdown(s,direction); Δυνατές τιμές για την παράμετρο direction: 0 : δεν επιτρέπεται καμιά περαιτέρω είσοδος 1 : δεν επιτρέπεται καμιά περαιτέρω έξοδος 2 : τερματισμός και ως προς τις δύο κατευθύνσεις Η συνάρτηση shutdown αναφέρει τον τερματισμό στο απομακρυσμένο μηχάνημα μόνο στο TCP
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Αλγόριθμος Πελάτη UDP 1.Βρες τη διεύθυνση IP και τη θύρα πρωτοκόλλου του εξυπηρετητή 2.Απόκτησε ένα socket 3.Προσδιόρισε ότι η σύνδεση απαιτεί μια αυθαίρετη, αχρησιμοποίητη θύρα πρωτοκόλλου στο τοπικό μηχάνημα, και επέτρεψε στο UDP να διαλέξει μία 4.Καθόρισε τον εξυπηρετητή στον οποίο πρέπει να σταλούν τα μηνύματα 5.Επικοινώνησε με τον εξυπηρετητή χρησιμοποιώντας το πρωτόκολλο επιπέδου εφαρμογής 6.Κλείσε το socket 12
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Βιβλιοθήκη Διαδικασιών για Προγράμματα Πελατών /* connectTCP.c - connectTCP */ int connectsock(const char *host, const char *service,const char *transport); /* *connectTCP - connect to a specified TCP service on a specified host * */ int connectTCP (const char *host, const char *service ) /* * Arguments: * host - name of host to which connection is desired service - service associated with the desired port*/ {return connectsock( host, service, "tcp");} 13
Διαδικτυακός και Ταυτόχρονος ΠρογραμματισμόςΚωνσταντίνος Αντωνής © 2014 Βιβλιοθήκη Διαδικασιών για Προγράμματα Πελατών (2) /* connectUDP.c - connectUDP */ int connectsock(const char *host, const char *service,const char *transport); /* *connectUDP - connect to a specified UDP service on a specified host * */ int connectUDP (const char *host, const char *service ) /* * Arguments: * host - name of host to which connection is desired service - service associated with the desired port*/ {return connectsock( host, service, “udp”);} 14