Υποδοχείς (Sockets) Προγραμματισμός II 1

Σχετικά έγγραφα
Προγραμματισμός με BSD Sockets σε περιβάλλον Linux

Βασικά Θέματα Επικοινωνίας. Κατανεμημένα Συστήματα 1

Εργαστήριο Δικτύων Υπολογιστών

Εργαστήριο Λειτουργικών Συστήματων 8ο εξάμηνο, Ακαδημαϊκή περίοδος

Δίκτυα Επικοινωνιών ΙΙ: Network Programming TCP Sockets

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

Λειτουργικά Συστήματα

Δικτυακός Προγραμματισμός (Sockets Programming) Εργαστήριο Γ Εξάμηνο, Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας

Κ. Στάµος Μηχανικός Η/Υ και Πληροφορικής, Πανεπιστήµιο Πατρών Μηχανικός Έρευνας και Ανάπτυξης, ΕΜ6/ΕΑΙΤΥ

HY-335a Project: microtcp *, μία lightweight TCP βιβλιοθήκη

Δικτυακός προγραμματισμός

Δίκτυα Υπολογιστών Firewalls. Χάρης Μανιφάβας

{ int pipe(int fd[ ]) close

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Επικοινωνία Client/Server Υποδοχές

Αγωγοί/Σωλήνες (Pipes) Προγραμματισμός II 1

Παραδείγµατα δικτυακών τεχνολογιών. Ethernet Internet ATM

Ιόνιο Πανεπιστήµιο Τµήµα Πληροφορικής Συστήµατα Επικοινωνίας. Μοντέλο TCP/IP. Ενότητα E. Πόσοι εµπλέκονται σε ένα Σύστηµα Επικοινωνίας

Δίκτυα Υπολογιστών I

Ιόνιο Πανεπιστήµιο Τµήµα Αρχειονοµίας Βιβλιοθηκονοµίας. Μοντέλο TCP/IP. Ενότητα E. Συστήµατα Επικοινωνίας

Topic 5: Sockets. *Ευχαριστίες στους Jim Kurose, Keith Ross, Τάκη Σταµατόπουλο, Αλέξη ελή, και Αντώνη ελιγιαννάκη

Επίπεδο Μεταφοράς. (ανεβαίνουμε προς τα πάνω) Εργαστήριο Δικτύων Υπολογιστών Τμήμα Μηχανικών Η/Υ και Πληροφορικής

Ζητήματα Σχεδίασης Λογισμικού Πελάτη

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών Δίκτυα υπολογιστών. (και το Διαδίκτυο)

Εγχειρίδιο Συναρτήσεων. Socket *sopen(const int type, const int protocol, const char *host, const char *service)

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

HY-335a Project: microtcp, μία lightweight TCP βιβλιοθήκη. Deadline πρώτης ϕάσης : 19/11/ :59

Εισαγωγή στην επιστήμη των υπολογιστών. Υλικό Υπολογιστών Κεφάλαιο 6ο ίκτυα υπολογιστών

Επαναληπτικές Ασκήσεις Μαθήματος

4 η ιάλεξη: Signals UDP Sockets

Ζητήματα Σχεδίασης Λογισμικού Εξυπηρετητή

Εργαστήριο Δικτύων Υπολογιστών

Τι είναι ένα δίκτυο υπολογιστών; Αρχιτεκτονική επιπέδων πρωτοκόλλων. Δικτυακά πρωτόκολλα

Επικοινωνία με μηνύματα. Κατανεμημένα Συστήματα 1

Ειδικά Θέματα Προγραμματισμού

IPC System V. Προγραμματισμός II 1

Επικοινωνία με μηνύματα. Κατανεμημένα Συστήματα 1

Δίκτυα Υπολογιστών Το επίπεδο μεταφοράς (transport layer)

Προγραμματισμός Διαχείρισης Συστημάτων ΙΙ

Προγραµµατισµός ικτύων Ε-01

Κεφάλαιο 2. Υπολογιστές και Τεχνολογία Επικοινωνιών Παρελθόν - Παρόν - Μέλλον

Δίκτυα Υπολογιστών. Το επίπεδο εφαρμογής (application layer) Κ. Βασιλάκης

Τεχνολογία TCP/IP ΙΑ ΙΚΤΥΩΣΗ- INTERNET. Τεχνολογίες Τηλεκπαίδευσης & Εφαρµογές - Ιούλιος

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

Δίκτυα Υπολογιστών. Το επίπεδο εφαρμογής (application layer) Κ. Βασιλάκης

Μάθημα 4: Πρότυπα, Πρωτόκολλα & Υπηρεσίες

HY335 4ο Φροντιστήριο

Ουρές Μηνυμάτων (Message Queues in System V) Προγραμματισμός II 1

ίκτυα υπολογιστών Στόχοι κεφαλαίου ίκτυα

Δίκτυα Η/Υ στην Επιχείρηση

Άσκηση 2 η Πρωτόκολλο επικοινωνίας TCP/IP

ΗΜΥ 360: Δίκτυα Υπολογιστών. Εισαγωγή

7.2.2 Σχέση OSI και TCP/IP

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. ίκτυα Υπολογιστών Ι. To Μοντέλο OSI. Αναπλ. Καθηγ. Π. εμέστιχας

Εισαγωγή στο διαδίκτυο

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Δίκτυα Υπολογιστών ΙΙ (Ασκήσεις Πράξης)

Επικοινωνία. Χάρης Μανιφάβας Τμήμα Εφ. Πληροφορικής & Πολυμέσων ΤΕΙ Κρήτης. Κατανεμημένα Συστήματα (E) Επικοινωνία 1

Socket Application Programming Interface

1.2.2 Το μοντέλο δικτύωσης TCP/IP 1 / 26

Εισαγωγή στο πως λειτουργεί το διαδίκτυο

Τρίτη Πρόοδος [110 μονάδες] Απαντήσεις

Επικοινωνία Διεργασιών στο Internet με POSIX Sockets

Διδάσκων: Παναγιώτης Ανδρέου

Πρωτόκολλα Επικοινωνίας Πρωτόκολλο IP

ΤΕΧΝΟΛΟΓΙΑ ΔΙΚΤΥΩΝ ΕΠΙΚΟΙΝΩΝΙΩΝ

Επίπεδο δικτύου IP Forwading κτλ

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

Κεφάλαιο 7.3. Πρωτόκολλο TCP

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Λογισμικό Δικτύων Πέτρος Λάμψας 2007

Εισαγωγή Επανάληψη. ΤΕΙ Στερεάς Ελλάδας. ΣT Εξάμηνο, Κατεύθυνση Μηχανικών Δικτύων Τ.Ε. Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Διαδικτυακός Προγραμματισμός

ΔΙΚΤΥΑ Δίκτυα Υπολογιστών Δίκτυα τηλεφωνίας (σταθερής, κινητής) Δίκτυα αισθητήρων

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

ΚΕΦΑΛΑΙΟ 10. Δικτυακός προγραμματισμός Εισαγωγή

Δίκτυα (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Πρωτόκολλα Διαδικτύου

Αξιόπιστη μεταφορά δεδομένων πάνω από αναξιόπιστο δίκτυο. Κατανεμημένα Συστήματα 1

2η Προγραµµατιστική Εργασία

Αξιόπιστη μεταφορά δεδομένων πάνω από αναξιόπιστο δίκτυο. Κατανεμημένα Συστήματα 1

Μάθημα 6: Αρχιτεκτονική TCP/IP

HY-335a Project: microtcp 1, μία lightweight TCP βιβλιοθήκη

Υπολογιστές και ίκτυα Η/Υ.

AEI Πειραιά Τ.Τ. Τμ. Μηχ/κων Αυτοματισμού ΤΕ. Δίκτυα Υπολογιστών. Διάλεξη 1: Εισαγωγή στα δίκτυα υπολογιστών και βασικές αρχές

ΤΕΙ Στερεάς Ελλάδας Τμ. Ηλ.γων Μηχ/κων ΤΕ. Δίκτυα Υπολογιστών. Διάλεξη 1: Εισαγωγή στα δίκτυα υπολογιστών και βασικές αρχές

Ασύρματες Κινητές Επικοινωνίες Ενότητα 2: Το επίπεδο MAC του WiFi

Μάθημα 5: To Μοντέλο Αναφοράς O.S.I.

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Δίκτυα Υπολογιστών Ενότητα 5: User Datagram Protocol - UDP

Ατομική Διπλωματική Εργασία ΥΛΟΠΟΙΗΣΗ ΚΑΤΑΝΕΜΗΜΕΝΟΥ ΣΥΣΤΗΜΑΤΟΣ ΑΡΧΕΙΩΝ ΒΑΣΙΣΜΕΝΟ ΣΕ ΑΛΓΟΡΙΘΜΟΥΣ ΓΡΑΦΗΣ ΚΑΙ ΑΝΑΓΝΩΣΗΣ ΑΤΟΜΙΚΩΝ ΑΝΤΙΚΕΙΜΕΝΩΝ

ΔΙΚΤΥΑ (15-17) Π. Φουληράς

AEI Πειραιά Τ.Τ. Τμ. Μηχ/κων Αυτοματισμού ΤΕ. Δίκτυα Μετάδοσης Δεδομένων. Διάλεξη 1: Εισαγωγή στα δίκτυα υπολογιστών και βασικές αρχές

4.1.1 Πρωτόκολλο TCP - Δομή πακέτου

Δίκτυα Επικοινωνιών ΙΙ: Network Programming Εισαγωγή, TCP, UDP, Ports

Βασικές έννοιες. Κατανεμημένα Συστήματα 1

.1 Βασικές Έννοιες Δικτύωσης. .2 Δίκτυα Άμεσου Συνδέσμου. .3 Δίκτυα Μεταγωγής και Διαδίκτυα. .4 Δικτύωση: συνολική θεώρηση

Transcript:

Υποδοχείς (Sockets) Προγραμματισμός II 1 lalis@inf.uth.gr

Υποδοχείς Ειδικές δομές διαδιεργασιακής επικοινωνίας Προσπελάζονται μέσω περιγραφέων αρχείων μπορεί να χρησιμοποιηθούν οι read, write, close μπορεί να χρησιμοποιηθούν για ανακατεύθυνση Ε/Ε Ο επιθυμητός μηχανισμός / πρωτόκολλο επικοινωνίας καθορίζεται κατά την δημιουργία ενός υποδοχέα Οι περισσότερες λειτουργίες είναι ανεξάρτητες του μηχανισμού επικοινωνίας που χρησιμοποιείται Unix sockets: τοπική επικοινωνία ανάμεσα σε διεργασίες που εκτελούνται στον ίδιο Η/Υ Internet/raw sockets: (δια)δικτυακή επικοινωνία ανάμεσα σε διεργασίες πάνω σε διαφορετικούς Η/Υ Προγραμματισμός II 2 lalis@inf.uth.gr

Δημιουργία υποδοχέα int socket(int domain, int type, int protocol); Για Unix sockets το domain είναι AF_UNIX Για Internet sockets το domain είναι AF_INET Συνηθισμένες τιμές για το type: SOCK_STREAM: αξιόπιστη ροή δύο κατευθύνσεων SOCK_DGRAM: αναξιόπιστη μετάδοση διακριτών μηνυμάτων Το protocol προσδιορίζει ένα κατάλληλο πρωτόκολλο επικοινωνίας για τον συνδυασμό domain+type Προγραμματισμός II 3 lalis@inf.uth.gr

Βασικά είδη υποδοχέων Stream sockets Μετάδοση μιας ροής δεδομένων Αξιόπιστα και με σειρά FIFO στο πνεύμα ενός FIFO pipe Η ροή είναι διπλής κατεύθυνσης (full duplex) Πρέπει να δημιουργηθεί μια σύνδεση ανάμεσα σε δύο υποδοχείς Datagram sockets Μετάδοση διακριτών μηνυμάτων Δεν δίνεται εγγύηση αξιοπιστίας/σειράς παράδοσης Δεν απαιτείται σύνδεση ανάμεσα στους υποδοχείς Προγραμματισμός II 4 lalis@inf.uth.gr

Συσχέτιση υποδοχέα με όνομα/διεύθυνση int bind(int sockfd, struct sockaddr *addr, size_t addrlen) Συσχετίζει έναν υποδοχέα με στοιχεία επικοινωνίας (διεύθυνση), ώστε αυτός να μπορεί να «εντοπιστεί» Τα περιεχόμενα της δομής struct sockaddr εξαρτώνται από το domain του υποδοχέα Κάθε domain μπορεί να εισάγει διαφορετική δομή για τα απαιτούμενα στοιχεία επικοινωνίας Προγραμματισμός II 5 lalis@inf.uth.gr

Διευθύνσεις Unix domain sockets struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ }; Το sun_family πρέπει να είναι ίσο με AF_UNIX Το sun_path περιέχει ένα όνομα/μονοπάτι στον χώρο ονομάτων του συστήματος αρχείων όπως για αρχεία και επώνυμους αγωγούς Μετά την χρήση, το όνομα πρέπει να απομακρυνθεί όπως για αρχεία και επώνυμους αγωγούς Προγραμματισμός II 6 lalis@inf.uth.gr

Datagram sockets Προγραμματισμός II 7 lalis@inf.uth.gr

Λειτουργικότητα Αναξιόπιστη μεταφορά μηνυμάτων Δεν χρειάζεται (απαραίτητα) κάποια «σύνδεση» μεταξύ των υποδοχέων που χρησιμοποιούνται για αυτή την επικοινωνία Ο ίδιος υποδοχέας μπορεί να χρησιμοποιηθεί για την μετάδοση/παραλαβή μηνυμάτων προς/από διαφορετικούς υποδοχείς Κάθε μήνυμα είναι διακριτό από τα υπόλοιπα Προγραμματισμός II 8 lalis@inf.uth.gr

P1 P2 datagram socket P4 P3 Προγραμματισμός II 9 lalis@inf.uth.gr

P1 (αποστολέας) P2 (παραλήπτης) socket socket bind bind sendto recvfrom close close Προγραμματισμός II 10 lalis@inf.uth.gr

Αποστολή μηνύματος ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *addr, socklen_t addrlen); Στέλνει το μήνυμα buf μεγέθους len στην διεύθυνση addr που δίνεται με την ίδια μορφή όπως στην bind Αν ο υποδοχέας «συνδεθεί»(μέσω connect) σε μια συγκεκριμένη διεύθυνση, η addr μπορεί να είναι NULL ή εναλλακτικά να χρησιμοποιηθεί η λειτουργία send (που δεν δέχεται ως παράμετρο κάποια διεύθυνση) Προγραμματισμός II 11 lalis@inf.uth.gr

Παραλαβή μηνύματος ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t *addrlen); Μπλοκάρει μέχρι να παραληφθεί το επόμενο μήνυμα, που αποθηκεύεται στο buf με μέγιστο μέγεθος len Η διεύθυνση του αποστολέα αποθηκεύεται στην addr Αν δεν είναι επιθυμητή η παραλαβή της διεύθυνσης, η addr μπορεί να είναι NULL ή εναλλακτικά να χρησιμοποιηθεί η recv (που δεν επιστρέφει διεύθυνση) Προγραμματισμός II 12 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int s,addrlen; char msg[n]; struct sockaddr_un addr; server } addr.sun_family=af_unix; strcpy(addr.sun_path,argv[1]); addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path); s=socket(af_unix,sock_dgram,0); bind(s,(struct sockaddr *)&addr,addrlen); do { recvfrom(s,msg,n,0,null,null); printf("server received: %s\n",msg); } while (strcmp(msg,"quit")); close(s); unlink(argv[1]); /* free name */ return(0); int main(int argc, char *argv[]) { int s,addrlen,i; struct sockaddr_un addr; client } addr.sun_family=af_unix; strcpy(addr.sun_path,argv[1]); addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path); s=socket(af_unix,sock_dgram,0); for (i=2; i<argc; i++) { sendto(s,argv[i],strlen(argv[i])+1,0, (struct sockaddr *)&addr,addrlen); } close(s); return(0); Προγραμματισμός ΙΙΙ 13 lalis@inf.uth.gr

Stream sockets Προγραμματισμός II 14 lalis@inf.uth.gr

Λειτουργικότητα Αξιόπιστη μεταφορά ροής δεδομένων μπορεί να είναι ταυτόχρονα διπλής κατεύθυνσης (full duplex) Απαιτείται σύνδεση ανάμεσα στους δύο υποδοχείς η μια πλευρά αναμένει/αποδέχεται την σύνδεση η άλλη πλευρά αιτείται/δημιουργεί την σύνδεση Στην πλευρά που αποδέχεται μια νέα σύνδεση δημιουργείται (αυτόματα) ένας νέος υποδοχέας Κάθε σύνδεση είναι ανεξάρτητη από τις υπόλοιπες Ένας συνδεδεμένος υποδοχέας δεν μπορεί να χρησιμοποιηθεί για την μετάδοση/παραλαβή δεδομένων προς/από διαφορετικούς υποδοχείς Προγραμματισμός II 15 lalis@inf.uth.gr

P1 stream socket P2 P4 P3 Προγραμματισμός II 16 lalis@inf.uth.gr

P1 (αποστολέας) P2 (παραλήπτης) socket socket bind bind listen connect accept send/recv recv/send close close Προγραμματισμός II 17 lalis@inf.uth.gr

Διαδικασία σύνδεσης int listen(int sockfd, int backlog); Πρόθεση αποδοχής αιτήσεων για σύνδεση int accept(int sockfd, const struct sockaddr *saddr, size_t *saddrlen) ; Αποδοχή της επόμενης σύνδεσης, και επιστροφή νέου υποδοχέα (και διεύθυνσης) για την σύνδεση αυτή int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); Σύνδεση με μια συγκεκριμένη διεύθυνση Προγραμματισμός II 18 lalis@inf.uth.gr

Αποστολή και παραλαβή δεδομένων Αποστολή: send (write) Παραλαβή: recv (read) Υφίσταται «μόνιμη» σύνδεση ανάμεσα στους δύο υποδοχείς Ο αποστολέας δεν χρειάζεται να προσδιορίζει κάθε φορά (εκ νέου) την διεύθυνση του παραλήπτη Ο παραλήπτης δεν χρειάζεται να παραλαμβάνει κάθε φορά (εκ νέου) την διεύθυνση του αποστολέα Προγραμματισμός II 19 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int s,s2,addrlen; char msg[n]; struct sockaddr_un addr; } int main(int argc, char *argv[]) { int s,addrlen,i; struct sockaddr_un addr; } addr.sun_family=af_unix; strcpy(addr.sun_path,argv[1]); addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path); s2=socket(af_unix,sock_stream,0); bind(s2,(struct sockaddr *)&addr,addrlen); listen(s2,1); do { s=accept(s2,null,null); recv(s,msg,n,0); printf("server received: %s\n",msg); close(s); } while (strcmp(msg,"quit")); close(s2); unlink(argv[1]); /* free name */ return(0); addr.sun_family=af_unix; strcpy(addr.sun_path,argv[1]); addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path); for (i=2; i<argc; i++) { s=socket(af_unix,sock_stream,0); connect(s,(struct sockaddr *)&addr,addrlen); send(s,argv[i],strlen(argv[i])+1,0); close(s); } return(0); Προγραμματισμός ΙΙΙ 20 lalis@inf.uth.gr server client

Επικοινωνία πάνω από δίκτυο με UDP/IP και TCP/IP sockets Προγραμματισμός II 21 lalis@inf.uth.gr

Δίκτυα υπολογιστών Local area networks Σχετικά μικρές αποστάσεις Ethernet, WiFi Metropolitan / wide area networks Μέτριες αποστάσεις (πόλης) FDDI, WiMax Global networks Πλανητική κλίμακα διαδίκτυο (Internet), 4/5G Προγραμματισμός II 22 lalis@inf.uth.gr

Επικοινωνία πάνω από το δίκτυο Οι περισσότερες τεχνολογίες δικτύων υπολογιστών υποστηρίζουν την αποστολή/παραλαβή πακέτων τα πακέτα στέλνονται σε συγκεκριμένες διευθύνσεις κάθε υπολογιστής έχει διαφορετική διεύθυνση (τουλάχιστον, σε επίπεδο τοπικού δικτύου) Τα πακέτα μπορεί να χαθούν προβλήματα μετάδοσης πάνω από το φυσικό μέσο προβλήματα δρομολόγησης (για διαδίκτυα) προβλήματα αποθήκευσης σε λειτουργικό Ένα μήνυμα μπορεί να σπάσει σε πακέτα, και να επανασυναρμολογηθεί αργότερα (στον προορισμό) Προγραμματισμός II 23 lalis@inf.uth.gr

Αφαίρεση P1 P2 P1 P2 Πραγματικότητα Προγραμματισμός II 24 lalis@inf.uth.gr

Στοίβες πρωτοκόλλων Για λόγους δομημένης ανάπτυξης, η λειτουργικότητα επικοινωνίας υλοποιείται συνήθως σε στρώματα Κάθε στρώμα εστιάζει στην επίλυση / διαχείριση συγκεκριμένων προβλημάτων επικοινωνίας με βάση την λειτουργικότητα των πιο χαμηλών στρωμάτων Καθώς το στρώμα Ν βασίζεται στο στρώμα Ν-1 και παρέχει λειτουργικότητα στο στρώμα Ν+1, μιλάμε για μια στοίβα πρωτοκόλλων ISO-OSI, Internet protocols, κτλ Προγραμματισμός II 25 lalis@inf.uth.gr

Η στοίβα του OSI & πρωτοκόλλων Internet Application Presentation Session Transport TCP IP Network Data Link Physical UDP TCP: - port-based local addressing - reliable byte stream - bidirectional data transfer - error checking via checksums - sequencing, flow control, buffering UDP: - port-based local addressing - unreliable messages, up to 64K IP: - machine addressing, routing - unreliable messages, up to 64K - network technology independence - packet fragmentation / re-assembly - protocol (de)multiplexing Προγραμματισμός II 26 lalis@inf.uth.gr

Υποστήριξη UDP/IP και TCP/IP από τα ΛΣ Application Application socket API OS1 IP stack socket API OS2 IP stack Hardware Hardware network Προγραμματισμός II 27 lalis@inf.uth.gr

UDP/IP & TCP/IP sockets Για Internet sockets το domain είναι AF_INET UDP sockets: τύπου SOCK_DGRAM TCP sockets: τύπου SOCK_STREAM Χρησιμοποιούνται «σύνθετες» διευθύνσεις που αποτελούνται από δύο συστατικά IP address: διεύθυνση μηχανήματος στο διαδίκτυο port number: αριθμός θύρας/πόρτας Τα port numbers επιτρέπουν την πολυπλεξία εφαρμογών που χρησιμοποιούν το ίδιο πρωτόκολλο Προγραμματισμός II 28 lalis@inf.uth.gr

Διευθύνσεις UDP/TCP sockets struct sockaddr_in { sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* port number */ struct in_addr sin_addr; /* IP address */ }; struct in_addr { uint32_t s_addr; /* encoded IP address */ }; Το sin_family πρέπει να είναι ίσο με AF_ΙΝΕΤ Το sin_port περιέχει τον αριθμό πόρτας Το sin_addr περιέχει την διεύθυνση στο δίκτυο Τα bytes των αριθμών πόρτας και διεύθυνσης πρέπει να δίνονται σε network byte order Προγραμματισμός II 29 lalis@inf.uth.gr

int main(int argc, char *argv[]) { int s; char msg[n]; struct sockaddr_in addr; } server addr.sin_family=af_inet; addr.sin_addr.s_addr=htonl(inaddr_any); /* all interfaces */ addr.sin_port=htons(atoi(argv[1])); s=socket(af_inet,sock_dgram,0); bind(s,(struct sockaddr *)&addr,sizeof(addr)); do { recvfrom(s,msg,n,0,null,null); printf("server received: %s\n",msg); } while (strcmp(msg,"quit")); close(s); return(0); int main(int argc, char *argv[]) { int s,i; struct sockaddr_in addr; client } addr.sin_family=af_inet; inet_aton(argv[1],&addr.sin_addr); addr.sin_port=htons(atoi(argv[2])); s=socket(af_ινετ,sock_dgram,0); for (i=3; i<argc; i++) { sendto(s,argv[i],strlen(argv[i])+1,0, (struct sockaddr *)&addr, sizeof(addr)); } close(s); return(0); Προγραμματισμός ΙΙΙ 30 lalis@inf.uth.gr