Ζητήματα Σχεδίασης Λογισμικού Πελάτη Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 1
Αναγνώριση Τοποθεσίας Εξυπηρετητή Για την αναγνώριση της διεύθυνσης και της θύρας ενός εξυπηρετητή ο πελάτης μπορεί να ακολουθήσει μία από τις παρακάτω μεθόδους: Ο πελάτης διαθέτει το domain name ή τη διεύθυνση IP του εξυπηρετητή ορισμένη ως σταθερά. Ο πελάτης μπορεί να απαιτήσει από το χρήση να προσδιορίσει τον εξυπηρετητή κατά την κλήση Ο πελάτης μπορεί να αποκτήσει πληροφορίες για τον εξυπηρετητή π.χ. από ένα αρχείο Ο πελάτης μπορεί να χρησιμοποιεί ένα ξεχωριστό πρωτόκολλο για να βρει τον εξυπηρετητή π.χ. χρήση multicast ή broadcast μηνυμάτων Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 2
Ανάλυση Ορίσματος Διεύθυνσης Ο χρήστης παρέχει είτε το όνομα περιοχής που βρίσκεται ο εξυπηρετητής: merlin.cs.purdue.edu Ή μια IP διεύθυνση : 128.10.2.3 Μπορεί επίσης να συνδυάσει και τον προσδιορισμό της θύρας του πρωτοκόλλου σε ένα όρισμα merlin.cs.purdue.edu:smtp Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 3
Αναζήτηση Ονόματος Περιοχής #include <netdb.h> 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] Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 4
Η δομή hostent Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 5
Αναζήτηση Ονόματος Περιοχής (2) 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; Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 6
Αναζήτηση Προκαθορισμένης Θύρας #include <netdb.h> 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 <netdb.h> struct servent *getservbyport(int port, const char *protoname); Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 7
Αναζήτηση Προκαθορισμένης Θύρας (2) 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; Η χρήση συναρτήσεων όπως οι παραπάνω, οδηγεί σε μεγαλύτερη μεταφερσιμότητα, λειτουργικότητα και γενικότητα στην πλευρά του πελάτη, αφού είναι εφικτό το πέρασμα παραμέτρων Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 8
Αναζήτηση Πρωτοκόλλου με το όνομα 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 now in pptr ->p_proto */ } else { /* error occurred - handle it */ } Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 9
Μερικό Κλείσιμο Σύνδεσης #include <sys/socket.h> errcode=shutdown(s,direction); Δυνατές τιμές για την παράμετρο direction: 0 : δεν επιτρέπεται καμιά περαιτέρω είσοδος 1 : δεν επιτρέπεται καμιά περαιτέρω έξοδος 2 : τερματισμός και ως προς τις δύο κατευθύνσεις Η συνάρτηση shutdown αναφέρει τον τερματισμό στο απομακρυσμένο μηχάνημα μόνο στο TCP Διαδικτυακός και Ταυτόχρονος Προγραμματισμός 11
Βιβλιοθήκη Διαδικασιών για Προγράμματα Πελατών /* 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
Βιβλιοθήκη Διαδικασιών για Προγράμματα Πελατών (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