Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Socket API (σε γλώσσα C) Σύντομη Εισαγωγή Παναγιώτης Φουληράς.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Socket API (σε γλώσσα C) Σύντομη Εισαγωγή Παναγιώτης Φουληράς."— Μεταγράφημα παρουσίασης:

1 Socket API (σε γλώσσα C) Σύντομη Εισαγωγή Παναγιώτης Φουληράς

2 2 Εισαγωγή Κάθε Η/Υ έχει μοναδική ταυτότητα στο Διαδίκτυο (IP αριθμός) –IP Πρωτόκολλο Κάθε Διεργασία σε Η/Υ διακρίνεται από τον αριθμό θύρας (port number) στο Πρωτόκολλο Μεταφοράς (Transport) –TCP, UDP

3 Παναγιώτης Φουληράς3 Υπηρεσίες, Εξυπηρέτες, Πελάτες Μοντέλο Πελάτη-Εξυπηρέτη (Client-Server) TCP/UDP IP Data Link Πελάτης TCP/UDP Data Link Εξυπηρέτης Διαδίκτυο Πραγματική Κίνηση

4 Παναγιώτης Φουληράς4 Οι διάφορες Υπηρεσίες προσφέρονται από τους Εξυπηρέτες (Servers) –Διεργασίες με προκαθορισμένο Αριθμό Θύρας και πρωτόκολλο μεταφοράς –Ένας εξυπηρέτης μπορεί να εξυπηρετεί ταυτόχρονα πολλούς πελάτες Ταυτοχρονισμός (Concurrency) Υπηρεσίες, Εξυπηρέτες, Πελάτες

5 Παναγιώτης Φουληράς5 Αντίγραφα Εξυπηρέτη Για να γίνει ταυτόχρονη εξυπηρέτηση Ν πελατών πρέπει να δημιουργηθούν, είτε: –Ν αντίγραφα διεργασιών του εξυπηρέτη Ν για εξυπηρέτηση και 1 για παραλαβή νέου αιτήματος –Είτε Ν νήματα στην ίδια διεργασία εξυπηρέτη N+1 νήματα συνολικά

6 Παναγιώτης Φουληράς6 API - Γενικά Διασύνδεση Προγραμματισμού Εφαρμογών –Application Program Interface –Καθορίζει σύνολο λειτουργιών από μία εφαρμογή όταν αλληλεπιδρά με το λογισμικό πρωτοκόλλων – Προσοχή στην Διαφορά! –API Υποδοχών (Socket API) η πλέον διαδεδομένη

7 Παναγιώτης Φουληράς7 Socket API – Γενικά Δεν εξαρτάται από το Λειτουργικό Σύστημα Είναι ξεχωριστό από το Λ/Σ Αποτελεί την «Πόρτα» μέσω της οποίας μία εφαρμογή «συνομιλεί» με το λογισμικό πρωτοκόλλων Ουσιαστικά μία βιβλιοθήκη συναρτήσεων κάνοντας τις βασικές λειτουργίες να μοιάζουν με εκείνες σε αρχεία –Open, file descriptor/handle, read, write, κλπ

8 Παναγιώτης Φουληράς8 Βασικές Συναρτήσεις – 1 socket –Δημιουργεί socket και επιστρέφει έναν ακέραιο περιγραφέα (sd = socket descriptor) sd = socket (protocol_family, type, protocol) –Αρνητικό αποτέλεσμα δηλώνει αποτυχία 1o: PF_INET 2o: SOCK_STREAM ή SOCK_DGRAM 3o: Κωδικός Πρωτοκόλλου (συχνότερα για TCP ή UDP)

9 Παναγιώτης Φουληράς9 Βασικές Συναρτήσεις – 2 close ( closesocket στα Windows) –Τερματίζει την χρήση μίας socket αφού κλείσει την σύνδεση (αν υπάρχει – π.χ. TCP) close(sd) 1o: sd (= socket descriptor)

10 Παναγιώτης Φουληράς10 Βασικές Συναρτήσεις – 3α bind –Διασυνδέει socket με συγκεκριμένο αριθμό θύρας πρωτοκόλλου (χρήσιμο για servers) int bind (sd, local_addr, addrlen) 1o: socket descriptor 2o: δομή διεύθυνσης (μαζί με port number)  Δες επόμενη διαφάνεια για λεπτομέρειες 3o: μήκος δομής διεύθυνσης σε byte

11 Παναγιώτης Φουληράς11 Βασικές Συναρτήσεις – 3β 2ο η δομή είναι η sockaddr struct sockaddr { u_charsa_len;Μήκος διεύθυνσης u_charsa_family;Οικογένεια διεύθυνσης charsa_data[14];Η ίδια η διεύθυνση };

12 Παναγιώτης Φουληράς12 Βασικές Συναρτήσεις – 3γ Ειδικά για την περίπτωση ορισμένων πρωτοκόλλων όπως το TCP υπάρχει η πιο εξειδικευμένη δομή-παραλλαγή: struct socaddr_in { u_charsin_len;Μήκος διεύθυνσης u_charsin_family;Οικογένεια διεύθυνσης u_shortsin_port;Port number struct in_addr sin_addr;IP address του Η/Υ charsin_zero[8];Μηδενίζεται (δεν χρησιμοποιείται), για συμπλήρωση 14 byte από sa_data[14] };

13 Παναγιώτης Φουληράς13 Βασικές Συναρτήσεις – 3δ Σε περίπτωση Πολυεστιακού (Multihomed) Η/Υ, ως IP διεύθυνση προβλέπεται εκείνη της συμβολικής σταθεράς: INADDR_ANY –Τώρα ο server δέχεται αιτήσεις σε όλες τις IP διευθύνσεις του Η/Υ και όχι μόνον σε μία από αυτές

14 Παναγιώτης Φουληράς14 Βασικές Συναρτήσεις – 4 listen –Μόνον για servers –Θέτει την socket σε παθητική κατάσταση, ώστε να περιμένει να λάβει αιτήσεις από πελάτες –Ισχύει μόνον για αξιόπιστη λήψη sd = socket (sd, qlength) –Αρνητικό αποτέλεσμα δηλώνει αποτυχία 1o: socket descriptor 2o: Μήκος Ουράς για αποθήκευση εισερχομένων αιτήσεων

15 Παναγιώτης Φουληράς15 Βασικές Συναρτήσεις – 5 accept –Μόνον για servers –Μπλοκάρει έως ότου υπάρξει μία αίτηση στην ουρά –Δημιουργεί νέα socket για περαιτέρω επικοινωνία με πελάτη και μπορεί να παραλάβει νέες αιτήσεις ταυτόχρονα new_sd = accept (sd, cl_addr, cl_addr_length) 1o: socket descriptor 2o: Διεύθυνση Πελάτη (δείκτης σε δομή) 3ο: Μήκος Διεύθυνσης Πελάτη (δείκτης σε ακέραιο)

16 Παναγιώτης Φουληράς16 Βασικές Συναρτήσεις – 6 connect –Μόνον για clients και connection-oriented συνδέσεις (TCP) –Χρήση σε ασυνδεσμική επικοινωνία απλά οδηγεί σε καταγραφή της socket ως connected και της διεύθυνσης του server connect (sd, s_addr, s_addr_length) –Αρνητική αποτέλεσμα δηλώνει αποτυχία 1o: socket descriptor 2o: Διεύθυνση Εξυπηρέτη (δείκτης σε δομή) 3ο: Μήκος Διεύθυνσης Εξυπηρέτη (δείκτης σε ακέραιο)

17 Παναγιώτης Φουληράς17 Βασικές Συναρτήσεις – 7 send –Μόνον για connection-oriented συνδέσεις (TCP) send (sd, buff, buff_len, flags) 1o: socket descriptor 2o: Buffer Δεδομένων 3ο: Πλήθος byte σε buffer 4o: Σημαίες για επιλογές – συνήθως μηδέν

18 Παναγιώτης Φουληράς18 Βασικές Συναρτήσεις – 8 sendto –Μόνον για connectionless συνδέσεις (UDP) sendto (sd, buff, buff_len, flags, dest_addr, dest_addr_length) 1o: socket descriptor 2o: Buffer Δεδομένων 3ο: Πλήθος byte σε buffer 4o: Σημαίες για επιλογές – συνήθως μηδέν 5o: Διεύθυνση Προορισμού 6ο: Μήκος Διεύθυνσης Προορισμού

19 Παναγιώτης Φουληράς19 Βασικές Συναρτήσεις – 9 sendmsg –Ίδιο με sendto, αλλά με λιγότερες παραμέτρους sendto (sd, msgstruct, flags) 1o: socket descriptor 3o: Σημαίες για επιλογές – συνήθως μηδέν 2o: struct msgstruct { structsockaddr *m_saddr;Δνση προορισμού structdatavec *m_dvec;Μήνυμα (διάνυσμα) int m_dvlength;Πλήθος στοιχείων διανύσματος structaccess *m_rights;Λίστα δικαιωμάτων πρόσβασης int m_alength;Πλήθος στοιχείων λίστας }

20 Παναγιώτης Φουληράς20 Βασικές Συναρτήσεις – 10 recv –Για λήψη δεδομένων από connection-oriented socket recv (sd, buffer, buff_length, flags) 1o: socket descriptor 2o: buffer για προσωρινή αποθήκευση μηνυμάτων 3ο: Μήκος buffer 4o: Σημαίες για επιλογές – συνήθως μηδέν

21 Παναγιώτης Φουληράς21 Βασικές Συναρτήσεις – 11 recvfrom –Για λήψη δεδομένων από connectionless socket recvfrom (sd, buffer, buff_length, flags, sender_addr, sender_addr_length) 1o: socket descriptor 2o: buffer για προσωρινή αποθήκευση μηνυμάτων 3ο: Μήκος buffer 4o: Σημαίες για επιλογές – συνήθως μηδέν 5o: Διεύθυνση Αποστολέα 6ο: Μήκος Διεύθυνσης Αποστολέα

22 Παναγιώτης Φουληράς22 Βασικές Συναρτήσεις – 12 recvmsg –Ίδιο με recvfrom, αλλά με λιγότερες παραμέτρους recvmsg (sd, msgstruct, flags) 1o: socket descriptor 3o: Σημαίες για επιλογές – συνήθως μηδέν 2o: struct msgstruct { structsockaddr *m_saddr;Δνση προέλευσης structdatavec *m_dvec;Μήνυμα (διάνυσμα) int m_dvlength;Πλήθος στοιχείων διανύσματος structaccess *m_rights;Λίστα δικαιωμάτων πρόσβασης int m_alength;Πλήθος στοιχείων λίστας }

23 Παναγιώτης Φουληράς23 Βοηθητικές Συναρτήσεις – 1 getpeername –Επιστρέφει την διεύθυνση του απομακρυσμένου ομότιμου σημείου getpeername (sd, dest_addr, addr_len) 1o: socket descriptor 2o: Δείκτης σε δομή sockaddr για τοποθέτηση δνσης που θα παραληφθεί 3o: Μήκος Δνσης

24 Παναγιώτης Φουληράς24 Βοηθητικές Συναρτήσεις – 2 getsockname –Επιστρέφει την διεύθυνση της τοπικής υποδοχής getsockname (sd, local_addr, addr_len) 1o: socket descriptor 2o: Δείκτης σε δομή sockaddr για τοποθέτηση δνσης που θα παραληφθεί 3o: Μήκος Δνσης

25 Παναγιώτης Φουληράς25 Βοηθητικές Συναρτήσεις – 3 getsockopt –Διαβάζει τις επιλογές της τοπικής υποδοχής getsockopt (sd, level, option_id, option_val, length) 1o: socket descriptor 2o: Επίπεδο πρωτοκόλλου (transport ή χαμηλότερα) 3o: Ταυτότητα επιλογής 4ο: Δνση buffer για τοποθέτηση τιμής επιλογών 5ο: Μήκος buffer

26 Παναγιώτης Φουληράς26 Βοηθητικές Συναρτήσεις – 4 setsockopt –Θέτει τις επιλογές της τοπικής υποδοχής setsockopt (sd, level, option_id, option_val, length) 1o: socket descriptor 2o: Επίπεδο πρωτοκόλλου (transport ή χαμηλότερα) 3o: Ταυτότητα επιλογής 4ο: Δνση buffer για ανάθεση τιμής επιλογών 5ο: Μήκος buffer

27 Παναγιώτης Φουληράς27 Βοηθητικές Συναρτήσεις – 5 setsockopt –Θέτει τις επιλογές της τοπικής υποδοχής setsockopt (sd, level, option_id, option_val, length) 1o: socket descriptor 2o: Επίπεδο πρωτοκόλλου (transport ή χαμηλότερα) 3o: Ταυτότητα επιλογής 4ο: Δ/νση buffer για ανάθεση τιμής επιλογών 5ο: Μήκος buffer

28 Παναγιώτης Φουληράς28 Βοηθητικές Συναρτήσεις – 6 getprotobyname –Με δεδομένο το όνομα ενός πρωτοκόλλου, επιστρέφει δείκτη σε δομή με τον κωδικό του, κλπ ptrp = getprotobyname (name) 1o: Πίνακας με το όνομα του πρωτοκόλλου –Παράδειγμα if ( ((int) (ptrp = getprotobyname (“tcp”))) == 0) { fprintf (stderr, “could not find tcp code”); exit(1); } sd = socket (PF_INET, SOCK_STREAM, ptrp->p_proto);

29 Παναγιώτης Φουληράς29 Βοηθητικές Συναρτήσεις – 7 htons –Μετατρέπει έναν short integer σε διάταξη byte δικτύου 16-bit. Χρήσιμη για τα port numbers htons (local_short) 1o: short integer –Παράδειγμα sad.sin_port = htons ((u_short ) port);

30 Παναγιώτης Φουληράς30 Ακολουθία Κλήσεων Συναρτήσεων Υποδοχών Πελάτης Εξυπηρέτης getprotobyname socket bind listen gethostbyname accept

31 Παναγιώτης Φουληράς31 Ακολουθία Κλήσεων Συναρτήσεων Υποδοχών Πελάτης Εξυπηρέτης gethostbyname getprotobyname socket connect accept

32 Παναγιώτης Φουληράς32 Ακολουθία Κλήσεων Συναρτήσεων Υποδοχών Πελάτης Εξυπηρέτης recv send close


Κατέβασμα ppt "Socket API (σε γλώσσα C) Σύντομη Εισαγωγή Παναγιώτης Φουληράς."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google