Socket *sopen(const int type, const int protocol, const char *host, const char *service) Στην περίπτωση ενός client, δημιουργεί μια νέα σύνδεση και κατασκευάζει μια δομή Socket που σχετίζεται με αυτή Σε έναν server κατασκευάζει αυτό που ονομάζεται listening socket δηλαδή ένα socket που περιμένει συνδέσεις από άλλους. type protocol host service Καθορίζει αν πρόκειται για εξυπηρετούμενο (client) ή εξυπηρέτη (server) και μπορεί να πάρει τις τιμές: TYPE_CLIENT ή TYPE_SERVER Καθορίζει το πρωτόκολλο και μπορεί να πάρει τις τιμές: PROTO_TCP_IP PROTO_UDP_IP PROTO_TCP_IPV4 PROTO_UDP_IPV4 PROTO_TCP_IPV6 PROTO_UDP_IPV6 PROTO_ANY_IP PROTO_STREAM_UNIX PROTO_DGRAM_UNIX Όπου δεν ορίζονται ρητά τα IPv4 ή IPv6 γίνεται χρήση αυτού που είναι διαθέσιμο. Η τιμή PROTO_ANY_IP δηλώνει οποιοδήποτε πρωτόκολλο διαδικτύου υποστηρίζεται από τον host που θέλουμε να επικοινωνήσουμε και χρησιμοποιείται μόνο από τους client. Στην περίπτωση ενός client, περιέχει την ονομασία ή την διεύθυνση του server που θέλουμε να συνδεθούμε, για παράδειγμα: www.google.com ή 209.85.148.99 ή 5f1b:df00:ce3e:e200:20:800:2b37:6426 (:διεύθυνση IPv6) ή /tmp/server (:unix domain). Σε έναν server η παράμετρος αυτή αγνοείται. Φανερώνει την υπηρεσία ή την πόρτα που θέλουμε να συνδεθούμε πχ: ftp ή 21 Έναν δείκτη σε ένα νέο αντικείμενο τύπου Socket το οποίο χρησιμοποιείται σαν παράμετρος στις υπόλοιπες συναρτήσεις ή NULL δεν μπορεί να δεσμευτεί μνήμη για την κατασκευή ενός Socket
int sclose(socket *sock) Τερματίζει μια σύνδεση και απελευθερώνει την μνήμη που έχει δεσμευτεί. 0 αν είναι επιτυχής ή EOF αν συμβεί κάποιο λάθος Socket *sock; sock=sopen(type_client, PROTO_TCP_IP, "127.0.0.1", "9877"); /* * use Socket... */ sclose(sock);
size_t sread(void *ptr, size_t size, Socket *sock) Διαβάζει δεδομένα από μια σύνδεση και τα τοποθετεί στον πίνακα που δείχνει ο ptr. Καλείται μόνο για Socket τύπου client. ptr Δείκτης στη θέση μνήμης που θα τοποθετηθούν τα δεδομένα προς ανάγνωση. size Το μέγεθος του πίνακα. Τον αριθμό των bytes που έγιναν πραγματικά ανάγνωση ή 0 αν συμβεί κάποιο λάθος. Σε περίπτωση πρωτοκόλλων με σύνδεση, όπως το TCP η επιστροφή 0 σημαίνει ότι ο αντίπερα υπολογιστής έχει τερματίσει την σύνδεση. Η διάκριση ανάμεσα στο λάθος και τον τερματισμό της σύνδεσης γίνεται με την ρουτίνα serror() #define MAX_DATA 1024 Socket *sock; char data[max_data]; size_t n; sock=sopen(type_client, PROTO_TCP_IP, "127.0.0.1", "9877"); n=sread(data, sizeof(data), sock); /* * do something with data */ sclose(sock);
size_t swrite(const void *ptr, size_t size, Socket *sock) Εγγράφει δεδομένα σε μια σύνδεση από τον πίνακα που δείχνει ο ptr. Καλείται μόνο για Socket τύπου client. ptr Δείκτης στη θέση μνήμης που υπάρχουν τα δεδομένα προς εγγραφή. size Το πλήθος των δεδομένων σε byte. 0 αν συμβεί κάποιο λάθος ή τον αριθμό των bytes που έγιναν εγγραφή δηλαδή size. Socket *sock; char data[]= a message ; sock=sopen(type_client, PROTO_TCP_IP, "127.0.0.1", "9877"); swrite(data, sizeof(data), sock);... sclose(sock);
Socket *saccept(socket *sock) Καλείται μόνο από τους servers και κάνει αποδοχή μιας αίτησης για σύνδεση. Σε πρωτόκολλα τύπου stream, όπως το TCP, δημιουργεί μια πραγματική σύνδεση ανάμεσα σε client και server, ενώ σε πρωτόκολλα τύπου datagram, όπως το UDP, απλά κάνει αναμονή μέχρι να φτάσει το πρώτο πακέτο από κάποιον client. sock Δείκτης σε δομή τύπου Socket. Θα πρέπει φυσικά να είναι TYPE_SERVER Έναν δείκτη σε ένα νέο αντικείμενο τύπου Socket το οποίο χρησιμοποιείται σαν παράμετρος στις υπόλοιπες συναρτήσεις ή NULL αν συμβεί κάποιο λάθος. Το νέο Socket είναι TYPE_CLIENT και περιέχει τα στοιχεία (διεύθυνση, πόρτα κτλ) του υπολογιστή που ζήτησε τη σύνδεση. #define MAX_DATA 1024 Socket *srv, *cli; char data[max_data]; size_t n; srv=sopen(type_server, PROTO_TCP_IPV4, NULL, "9877"); while (!<terminate condition> ) { cli=saccept(srv); n=sread(data, sizeof(data), cli); /* * do something with data */ sclose(cli); sclose(srv);
int serror(const Socket *sock) Κάνει έλεγχο αν έχει συμβεί λάθος κατά την εκτέλεση της προηγούμενης συνάρτησης. 0 δεν έχει συμβεί λάθος ή μια μη μηδενική τιμή στην αντίθετη περίπτωση. Στην πραγματικότητα η τιμή αυτή ισούται με την errno της C.
void sclearerr(socket *sock) Καθαρίζει την κατάσταση λαθών ενός Socket Τίποτα
const char *sstrerror(const Socket *sock) ένα μήνυμα που φανερώνει τον τύπο του λάθους που έχει συμβεί σε ένα Socket Ένα αλφαριθμητικό μήνυμα ή κενό εάν δεν υπάρχει κατάσταση λάθους. #include <stdio.h> Socket *sock; char data[]= a message ; sock=sopen(type_client, PROTO_TCP_IP, "127.0.0.1", "9877"); if ( serror(sock) ) { printf( Could not connect: %s\n, sstrerror(sock)); return 1; swrite(data, sizeof(data), sock); if ( serror(sock) ) { printf( Error writing data: %s\n, sstrerror(sock)); return 1;... sclose(sock);
char *sgetaddress(const Socket *sock) την διεύθυνση του αντίπερα υπολογιστή σε μορφή string Ένα αλφαριθμητικό ή κενό αν συμβεί λάθος.
unsigned short sgetport(const Socket *sock) την πόρτα του αντίπερα υπολογιστή σε μια σύνδεση. Ένα νούμερο έως 0xFFFF ή 0 αν συμβεί κάποιο λάθος. #include <stdio.h> Socket *srv, *cli; srv=sopen(type_server, PROTO_TCP_IPV4, NULL, "9877"); while (!<terminate condition> ) { cli=saccept(srv); printf( Connection accepted from: %s, port: %s\n,sgetaddress(cli), sgetport(cli)); /* * serve the client */ sclose(cli); sclose(srv);