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



Σχετικά έγγραφα
ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΙΟΙΚΗΣΗΣ ΟΙΚΟΝΟΜΙΑΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

Με την ασφάλιση αυτή καλύπτεται ζηµία στα ασφαλισµένα αντικείµενα αµέσως προερχόµενη από πρόσκρουση

ΒΑΣΙΚΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΔΟΜΕΣ ΣΕ ΨΕΥΔΟΚΩΔΙΚΑ ΚΑΙ ΣΕ ΔΡΠ

ΑΝΑΚΟΙΝΩΣΗ ΥΠ ΑΡΙΘΜ. ΣΟΧ 3/2015. Για την πρόσληψη Πτυχιούχων Φυσικής Αγωγής. με σύμβαση εργασίας Ιδιωτικού Δικαίου Ορισμένου Χρόνου (Ι.Δ.Ο.Χ.

: Aύξηση φόρου εισοδήµατος, και µείωση µισθών

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

/νση: ΧΑΡΑΚΟΠΟΥΛΟΣ ΧΡΗΣΤΟΣ Μ. Αλεξάνδρου 49, 66100, ράµα Τηλ&φαξ: , κιν.: info@akademia.

186(Ι)/2014 ΝΟΜΟΣ ΠΟΥ ΤΡΟΠΟΠΟΙΕΙ ΤΟΝ ΠΕΡΙ ΠΟΙΝΙΚΗΣ ΔΙΚΟΝΟΜΙΑΣ ΝΟΜΟ

Από τη διδασκαλία της περίληψης στη διδασκαλία της έκθεσης Η διδασκόμενη θεωρία στην πράξη Εισηγήτρια: Μαρία Κάππου

ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ ΗΛΕΚΤΡΟΝΙΚΟΥ ΣΥΣΤΗΜΑΤΟΣ ΑΙΤΗΣΕΩΝ ΜΕΤΑΤΑΞΕΩΝ ΕΚΠΑΙΔΕΥΤΙΚΩΝ. ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Υπουργείο Παιδείας και Θρησκευμάτων

5. Χρηματοδότηση Σ.Α.

ΙΕΘΝΗΣ ΣΥΜΒΑΣΗ ΕΡΓΑΣΙΑΣ 183 «για την αναθεώρηση της (αναθεωρηµένης) σύµβασης για την προστασία της µητρότητας,»

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΠΕΡΙΦΕΡΕΙΑ ΘΕΣΣΑΛΙΑΣ ΟΙΚΟΝΟΜΙΚΗ ΕΠΙΤΡΟΠΗ ΠΡΑΚΤΙΚΟ 9 ο / ΑΠΟΦΑΣΗ 234/2012

ΕΓΚΥΚΛΙΟΣ ΓΙΑ ΤΗΝ ΕΦΑΡΜΟΓΗ ΤΟΥ Ν. 3481/2006

ΑΔΑ: Β4ΜΒΝ-ΖΜ1. Πίνακας περιεχομένων

ΓΙΑΤΙ Η ΡΩΣΙΑ ΕΝ ΕΙΝΑΙ ΣΟΣΙΑΛΙΣΤΙΚΗ

Βασικές Έννοιες και Μέθοδοι της Οικονομικής Επιστήμης - Οικονομία (< οίκος + νέμω): Διαχείριση των Υποθέσεων ενός Νοικοκυριού - Γενικός Ορισμός: Μια

Σηµειώσεις στο ταξινοµούµε

Αναλυτικό Πρόγραµµα Σπουδών του Μαθήµατος. Α Τάξη 1 ου Κύκλου Τ.Ε.Ε. 3 ώρες /εβδοµάδα. Αθήνα, Απρίλιος 2001

ΦΥΣΙΚΟΣ ΑΕΡΙΣΜΟΣ - ΡΟΣΙΣΜΟΣ

169(Ι)/2012 ΝΟΜΟΣ ΠΟΥ ΤΡΟΠΟΠΟΙΕΙ ΤΟΥΣ ΠΕΡΙ ΦΟΡΩΝ ΚΑΤΑΝΑΛΩΣΗΣ ΝΟΜΟΥΣ ΤΟΥ 2004 ΕΩΣ Η Βουλή των Αντιπροσώπων ψηφίζει ως ακολούθως:

Α Ι Τ Η Σ Η ΥΠΕΥΘΥΝΗ ΗΛΩΣΗ

Έρευνα Καταναλωτικής Εμπιστοσύνης

ΑΣΦΑΛΕΙΑ ΕΡΓΑΣΙΑΣ ΣΤΗ ΓΕΦΥΡΑ Γ3 ΤΗΣ ΕΓΝΑΤΙΑΣ Ο ΟΥ, ΤΟΠΟΘΕΣΙΑ ΚΗΠΟΥΡΙΟ ΓΡΕΒΕΝΩΝ

7. ΠΡΟΓΡΑΜΜΑ ΣΠΟΥΔΩΝ ΕΛΛΗΝΙΚΗΣ ΝΟΗΜΑΤΙΚΗΣ ΓΛΩΣΣΑΣ ΤΗΣ ΠΡΩΤΗΣ ΤΑΞΗΣ ΤΟΥ ΔΗΜΟΤΙΚΟΥ ΣΧΟΛΕΙΟΥ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΝΑΥΠΗΓΩΝ ΜΗΧ/ΓΩΝ ΜΗΧΑΝΙΚΩΝ. ΘΕΜΑ: Προστασία µε επιµεταλλώσεις. Σκαβάρας Παναγιώτης

KATATAΞH APΘPΩN. 6. Αρχές της προσφοράς και προμήθειας, ανθρώπινων ιστών και/ ή κυττάρων

Αυτός που δεν μπορεί να δει τα μικρά πράγματα είναι τυφλός και για τα μεγαλύτερα. (Κομφούκιος, πχ)

Θεµατικές ενότητες: παρεµβάσεις και ενδεικτικές υποθέσεις. 1. Οικονοµική πολιτική. Παρεµβάσεις οικονοµικού χαρακτήρα

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

Κωδικός: ΕΜΦ2 Αρ. Έκδοσης: 1 Ημ/νία: Σελ. 1 από 15

ΣΥΣΤΗΜΑ ΔΙΑΓΝΩΣΗΣ ΑΝΑΓΚΩΝ ΑΓΟΡΑΣ ΕΡΓΑΣΙΑΣ ΔΙΑΓΝΩΣΗ ΑΝΑΓΚΩΝ ΣΕ ΠΕΡΙΦΕΡΕΙΑΚΟ ΕΠΙΠΕΔΟ

Ταχ. /νση: Ερµού ΠΡΟΣ: Ως Πίνακας Αποδεκτών Ταχ. Κώδικας: Αθήνα Τηλέφωνο:

ΣΩΜΑ ΠΡΟΣΚΟΠΩΝ ΚΥΠΡΟΥ

Σε ποιες κατηγορίες μειώνεται η σύνταξη από 1/1/2009 (σε εφαρμογή του Ν.3655/2008)

Βασικά σημεία διάλεξης

03-00: Βιομάζα για παραγωγή ενέργειας Γενικά ζητήματα εφοδιαστικών αλυσίδων

Α. ΠΕΡΙΓΡΑΦΗ ΜΙΚΡΟΣΚΟΠΙΟΥ Ένα απλό σχολικό µικροσκόπιο αποτελείται από τρία βασικά συστήµατα, το οπτικό, το µηχανικό και το φωτιστικό.

Η Κεντρική Τράπεζα της Κύπρου στο δρόµο για την υιοθέτηση του ευρώ. Παρουσιάσεις στους µαθητές Γυµνασίων / Λυκείων

ΕΓΧΕΙΡΙ ΙΟ Ο ΗΓΙΩΝ. Ηλεκτρονική Υποβολή Α.Π.. Κοινών Επιχειρήσεων

5. ΤΙΜΟΛΟΓΙΟ ΜΑΡΤΙΟΣ K:\A61500\Design\tenders\2013_6151_drills_5243\Tefhi\Timologio_5243.DOC

Η ΕΞΕΤΑΣΗ ΜΑΡΤΥΡΩΝ ΚΑΙ Η ΠΑΡΟΥΣΙΑΣΗ ΥΠΟΘΕΣΕΩΝ ΕΝΩΠΙΩΝ ΔΙΚΑΣΤΗΡΙΟΥ

ΣΑΥ - ΦΑΥ ΕΡΓΟΥ. ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΠΕΡΙΦΕΡΕΙΑ ΚΡΗΤΗΣ ΠΕΡΙΦΕΡΕΙΑΚΗ ΕΝΟΤΗΤΑ ΗΡΑΚΛΕΙΟΥ ΗΜΟΣ ΜΙΝΩΑ ΠΕ ΙΑ ΑΣ /νση Τεχνικών Υπηρεσιών.

ΝΕΟΕΛΛΗΝΙΚΗ ΓΛΩΣΣΑ Γ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ

Η ΦΙΛΙΑ..!!! Η ΑΞΙΑ ΤΗΣ ΦΙΛΙΑΣ

Ενότητα 2. Γενικά Οργάνωση Ελέγχου (ΙΙ) Φύλλα Εργασίας Εκθέσεις Ελέγχων

ΚΑΝΟΝΙΣΜΟΣ ΤΗΛΕΘΕΡΜΑΝΣΗΣ. Άρθ. 1. ΟΡΙΣΜΟΣ

ΣΥΣΤΗΜΑ ΔΙΑΓΝΩΣΗΣ ΑΝΑΓΚΩΝ ΑΓΟΡΑΣ ΕΡΓΑΣΙΑΣ ΠΑΡΑΔΟΤΕΟ ΕΘΝΙΚΟΥ ΜΗΧΑΝΙΣΜΟΥ

ΚΕΦΑΛΑΙΟ 8 ΣΥΜΠΕΡΑΣΜΑΤΑ

Ε.Ε. Π α ρ.ι(i), Α ρ.4290, 29/7/2011

Αναλυτικό Πρόγραµµα Σπουδών του Μαθήµατος. Α Τάξη 1 ου Κύκλου Τ.Ε.Ε. 2 ώρες /εβδοµάδα. Αθήνα, Απρίλιος 2001

Ειδικότητα: Ύφασµα Ένδυση

ΕΘΝΙΚΟ ΠΛΑΙΣΙΟ ΠΕΡΙΒΑΛΛΟΝΤΙΚΩΝ ΔΡΑΣΕΩΝ

ΗΜΟΣ ΛΕΜΕΣΟΥ ΟΙΚΟΝΟΜΙΚΟ ΤΜΗΜΑ ΟΡΟΙ ΙΑΓΩΝΙΣΜΟΥ ΓΙΑ ΤΗΝ ΕΠΙΛΟΓΗ ΑΝΑ ΟΧΟΥ ΜΕ ΣΥΝΟΠΤΙΚΕΣ ΙΑ ΙΚΑΣΙΕΣ ΚΑΙ ΚΡΙΤΗΡΙΟ ΕΠΙΛΟΓΗΣ ΤΗΝ ΧΑΜΗΛΟΤΕΡΗ ΠΡΟΣΦΟΡΑ

ΕΛΤΙΟ Ε ΟΜΕΝΩΝ ΑΣΦΑΛΕΙΑΣ

ΕΘΙΜΑ ΤΟΥ ΚΟΣΜΟΥ. Αγγελική Περιστέρη Α 2

[Σηµ: Ο ένας αστερίσκος σηµειώνει τα άρθρα που αναθεωρήθηκαν το 1986 και οι δύο, αυτά που αναθεωρήθηκαν το 2001]

ΕΝΗΜΕΡΩΤΙΚΟ ΈΓΓΡΑΦΟ Σ.Ε.Ε.Δ.Δ.Ε. ΟΙ ΕΠΙΒΑΡΥΝΣΕΙΣ ΤΟΥ ΝΕΟΥ ΦΟΡΟΛΟΓΙΚΟΥ

Επίσηµη Εφηµερίδα αριθ. C 372 της 09/12/1997 σ

Χρηματοδότηση των Συλλόγων στην εποχή της κρίσης

ΣΧΕΔΙΟ. ΝΟΜΟΣ. Δηµόσιες υπεραστικές οδικές µεταφορές επιβατών. Κεφ. Α - ΓΕΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ. Άρθρο 1 Σκοπός πεδίο εφαρµογής

ΚΕΦΑΛΑΙΟ 3 ο ΤΟ ΜΕΛΛΟΝ ΤΗΣ ΕΥΡΩΠΑΪΚΗΣ ΕΝΩΣΗΣ. 3.1 Εισαγωγή

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

ΕΡΩΤΗΣΕΙΣ - ΑΠΑΝΤΗΣΕΙΣ ΓΙΑ ΤΗΝ ΕΠΟΧΙΚΗ ΓΡΙΠΗ

ΘΕΜΑΤΑ ΚΑΝΟΝΙΣΜΩΝ ΒΙΒΛΙΟ ΠΕΡΙΠΤΩΣΕΩΝ ΠΕΡΙΕΧΟΜΕΝΑ

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΑΝΑΛΥΣΗ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΩΝ ΚΑΤΑΣΤΑΣΕΩΝ

ΙΑΧΕΙΡΙΣΗ ΙΣΤΟΤΟΠΟΥ (Οδηγίες χρήσης και λειτουργιών) Έκδοση /10/2008

ΝΕΑ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΑ ΠΡΟΪΟΝΤΑ- ΕΦΑΡΜΟΓΗ ΣΕ ΑΣΦΑΛΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΗ

ΤΕΛΙΚΗ ΕΚΘΕΣΗ Τεύχος 9: Θεµατική Χαρτογράφηση

Α. ΟΡΓΑΝΑ ΣΧΕΔΙΑΣΜΟΥ ΚΑΙ ΕΦΑΡΜΟΓΗΣ

ΕΘΝΙΚΗ ΣΧΟΛΗ ΗΜΟΣΙΑΣ ΙΟΙΚΗΣΗΣ ΜΑΘΗΜΑ: ΟΡΓΑΝΩΣΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΤΟΥ ΚΡΑΤΟΥΣ (ΣΥΝΤΑΓΜΑΤΙΚΟ ΙΚΑΙΟ)

ΙΑΚΗΡΥΞΗ. Αριθµός-Α/Α Συστήµατος : 13142

ΔΕΛΤΙΟ ΤΥΠΟΥ. Ελλείψεις στο φορολογικό νομοσχέδιο. Σοβαρές ελλείψεις στη νέα μορφή του φορολογικού νομοσχεδίου

Ε.Ε. Π α ρ.ι(i), Α ρ.3646, 25/10/2002. ΤΗΣ ΕΠΙΣΗΜΗΣ ΕΦΗΜΕΡΙΔΑΣ ΤΗΣ ΔΗΜΟΚΡΑΤΙΑΣ Αρ της 25ης ΟΚΤΩΒΡΙΟΥ 2002

ΠΡΑΚΤΙΚΟ ΣΥΝΕΔΡΙΑΣΕΩΣ ΕΠΙΤΡΟΠΗΣ ΜΕΤΕΓΓΡΑΦΩΝ ΤΗΣ ΕΛΛΗΝΙΚΗΣ ΙΣΤΙΟΠΛΟΪΚΗΣ ΟΜΟΣΠΟΝΔΙΑΣ ΕΤΟΥΣ 2014

ΤΕΙ ΚΕΝΤΡΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΚΑΙ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΗΣ

Έχοντας υπόψη: τη συνθήκη για την ίδρυση της Ευρωπαϊκής Κοινότητας, και ιδίως το άρθρο 175 παράγραφος 1, την πρόταση της Επιτροπής ( 1 ),

(Πράξη κατάθεσης Υπουργείου Απασχόλησης και Κοινωνικής Προστασίας:ΠΚ 69/ )

ΑΠΟΚΑΤΑΣΤΑΣΗ ΚΑΙ ΕΠΑΝΑΧΡΗΣΗ ΤΟΥ ΧΩΡΟΥ ΤΟΥ ΧΑΝΙΟΥ ΤΟΥ ΙΜΠΡΑΗΜ ΚΩΔΙΚΟΣ ΔΙΑΓΩΝΙΖΟΜΕΝΟΥ: 12234

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Πρώτες βοήθειες και αντιλήψεις του πληθυσμού στους Νομούς Χανίων, Ηρακλείου, Λασιθίου και Μεσσηνίας

ΑΙΤΗΣΗ ΓΙΑ ΤΟ ΠΑΚΕΤΟ ΣΤΟΧΕΥΜΕΝΩΝ ΜΕΤΡΩΝ ΚΡΑΤΙΚΗΣ ΦΟΙΤΗΤΙΚΗΣ ΠΡΟΝΟΙΑΣ ΓΙΑ ΤΟ ΑΚΑ ΗΜΑΪΚΟ ΕΤΟΣ 2014/2015

ΟΡΓΑΝΩΣΗ ΠΟΥ ΕΚΠΡΟΣΩΠΕΙΤΕ: ΟΜΟΣΠΟΝ ΙΑ ΕΡΓΟ ΟΤΙΚΩΝ ΕΝΩΣΕΩN ΕΠΙΣΕΙΡΗΣΕΩΝ ΝΑΥΠΗΓΗΣΗΣ ΚΑΙ ΕΠΙΣΚΕΥΗΣ ΠΛΟΙΩΝ ΠΕΙΡΑΙΑ.

Τοποθέτηση Δημάρχου Γ. Πατούλη. για τεχνικό πρόγραμμα 2010

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

109(Ι)/2014 ΝΟΜΟΣ ΠΟΥ ΠΡΟΝΟΕΙ ΓΙΑ ΤΟ ΕΛΑΧΙΣΤΟ ΕΓΓΥΗΜΕΝΟ ΕΙΣΟΔΗΜΑ ΚΑΙ ΓΕΝΙΚΟΤΕΡΑ ΠΕΡΙ ΚΟΙΝΩΝΙΚΩΝ ΠΑΡΟΧΩΝ ΤΟΥ 2014 ΚΑΤΑΤΑΞΗ ΑΡΘΡΩΝ

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Ο ΚΛΑΔΟΣ ΖΩΗΣ ΑΠΟ ΤΗΝ ΙΔΙΩΤΙΚΗ ΑΣΦΑΛΙΣΗ ΤΕΙ ΚΑΛΑΜΑΤΑΣ ΣΧΟΛΗ :ΣΑΟ ΤΜΗΜΑ:Α.Μ.Υ.Π.

ΠΟΛΙΤΙΚΉ ΠΑΙΔΕΙΑ. Α Γενικού Λυκείου και ΕΠΑ.Λ. Καζάκου Γεωργία, ΠΕ09 Οικονομολόγος

ΠΑΝΕΠΙΣΤΗΜΙΟ FREDERICK


ΕΛΑΦΡΙΕΣ ΜΕΤΑΛΛΙΚΕΣ ΚΑΤΑΣΚΕΥΕΣ ΣΥΝΤΑΚΤΗΣ: ΝΑΝΣΥ ΣΑΚΚΑ

Πρακτικό εργαλείο. για την ταυτοποίηση πρώτου επιπέδου των θυμάτων παράνομης διακίνησης και εμπορίας. τη σεξουαλική εκμετάλλευση

ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

Ασυντήρητες και επικίνδυνες οικοδομές

ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΕΠΙΤΡΟΠΗ ΑΝΤΑΓΩΝΙΣΜΟΥ Αθήνα, 13 Νοεµβρίου 2012 ΕΛΤΙΟ ΤΥΠΟΥ

Πρακτικό 6/2012 της συνεδρίασης της Επιτροπής Ποιότητας Ζωής, του Δήμου Λήμνου, της 4ης Μαΐου 2012.

ΟΡΓΑΝΩΣΗ ΕΝΟΤΗΤΩΝ Α ΤΑΞΗΣ ΕΝΟΤΗΤΑ 3

ΕΡΩΤΗΣΕΙΣ ΓΙΑ ΤΟ ΜΑΘΗΜΑ ΑΡΧΕΣ Ι ΙΩΤΙΚΟΥ ΑΣΤΙΚΟΥ ΙΚΑΙΟΥ

Θεματική Ενότητα: ΠΑΙΔΕΙΑ ΠΟΛΙΤΙΣΜΟΣ - ΑΘΛΗΤΙΣΜΟΣ

ΕΡΕΥΝΑ ΚΑΤΑΝΑΛΩΤΗ ΑΡΩΜΑΤΙΚΩΝ & ΦΑΡΜΑΚΕΥΤΙΚΩΝ ΒΙΟΚΑΥΣΙΜΩΝ

Transcript:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΗΜΙΟΥΡΓΙΑ ΔΙΕΡΓΑΣΙΑΣ WEB-SERVER ΜΕ ΝΗΜΑΤΑ (THREADS) ΣΕ LINUX ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 4190 ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 4086 ΔΗΜΟΚΡΙΤΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΡΑΚΗΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΞΑΝΘΗΣ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ

ΣΚΟΠΟΣ ΤΗΣ ΕΡΓΑΣΙΑΣ Να προγραµµατίσετε σε περιβάλλον linux µια απλοποιηµένη διεργασία webserver. Αυτή η διεργασία θα δηµιουργεί έναν αριθµό από threads τα οποία είναι worker threads. Όταν έρθει µια αίτηση στην θύρα 80, τότε το master thread διαλέγει ένα thread για να προωθήσει το request το οποίο στέλνει ότι αρχεία του έχουν ζητηθεί. Π.χ. Αν γίνει το request "GET INDEX.HTML" τότε θα στέλνει το αρχείο INDEX.HTML. Τα worker threads θα πρέπει να έχουν µια στοιχειώδη κατανόηση του πρωτοκόλλου HTTP (να αγνοούνται επιλογές ή εντολές εκτός από GET) ώστε να µπορεί να συνδεθούµε µε κάποιο Browser και να δούµε µια σελίδα. Ο ΚΩΔΙΚΑΣ ΠΟΥ ΧΡΗΣΙΜΟΠΟΙΗΘΗΚΕ /* (c) Copyright OS-Project_2007 Sventzouris Konstantinos - Kalopitas Konstantinos Dimokritous University Of Thrace!!! :-) Web-Server µε νήµατα */ #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/time.h> #include <errno.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #ifndef PG_HELPER_H #define PG_HELPER_H void Error_Quit(char const * msg); ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 2 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

int Trim (char * buffer); int StrUpper (char * buffer); void CleanURL (char * buffer); ssize_t Readline (int sockd, void *vptr, size_t maxlen); ssize_t Writeline (int sockd, const void *vptr, size_t n); #define LISTENQ (1024) #endif #ifndef PG_SERVREQ_H #define PG_SERVREQ_H int Service_Request(int conn); #endif #ifndef PG_REQHEAD_H #define PG_REQHEAD_H /* Μέθοδοι τις οποίες χρειάζεται ο χρήστης */ enum Req_Method { GET, HEAD, UNSUPPORTED ; enum Req_Type { SIMPLE, FULL ; struct ReqInfo { enum Req_Method method; enum Req_Type type; char *referer; char *useragent; char *resource; int status; ; #define MAX_REQ_LINE (1024) int Parse_HTTP_Header(char * buffer, struct ReqInfo * reqinfo); int Get_Request (int conn, struct ReqInfo * reqinfo); void InitReqInfo (struct ReqInfo * reqinfo); void FreeReqInfo (struct ReqInfo * reqinfo); #endif #ifndef PG_RESOURCE_H ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 3 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

#define PG_RESOURCE_H int Return_Resource (int conn, int resource, struct ReqInfo * reqinfo); int Check_Resource (struct ReqInfo * reqinfo); int Return_Error_Msg(int conn, struct ReqInfo * reqinfo); #endif #ifndef PG_RESPHEAD_H #define PG_RESPHEAD_H int Output_HTTP_Headers(int conn, struct ReqInfo * reqinfo); #endif /* Μήνυµα λάθους πριν την έξοδο */ void Error_Quit(char const * msg) { fprintf(stderr, "WEBSERV: %s\n", msg); exit(exit_failure); /* ιαβάζει µια γραµµή */ ssize_t Readline(int sockd, void *vptr, size_t maxlen) { ssize_t n, rc; char c, *buffer; buffer = vptr; for ( n = 1; n < maxlen; n++ ) { if ( (rc = read(sockd, &c, 1)) == 1 ) { *buffer++ = c; if ( c == '\n' ) break; else if ( rc == 0 ) { if ( n == 1 ) else break; else { if ( errno == EINTR ) ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 4 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

continue; Error_Quit("Error in Readline()"); *buffer = 0; return n; /* Γράφει µια γραµµή */ ssize_t Writeline(int sockd, const void *vptr, size_t n) { size_t nleft; ssize_t nwritten; const char *buffer; buffer = vptr; nleft = n; while ( nleft > 0 ) { if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) { if ( errno == EINTR ) nwritten = 0; else Error_Quit("Error in Writeline()"); nleft -= nwritten; buffer += nwritten; return n; /* Αφαιρεί τα κενά */ int Trim(char * buffer) { int n = strlen(buffer) - 1; while (!isalnum(buffer[n]) && n >= 0 ) buffer[n--] = '\0'; /* Μετατροπή ενός string σε κεφαλαία */ int StrUpper(char * buffer) { while ( *buffer ) { ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 5 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

*buffer = toupper(*buffer); ++buffer; /* Αφαίρεση κωδικοποιηµένων διευθύνσεων από το string */ void CleanURL(char * buffer) { char asciinum[3] = {0; int i = 0, c; while ( buffer[i] ) { if ( buffer[i] == '+' ) buffer[i] = ' '; else if ( buffer[i] == '%' ) { asciinum[0] = buffer[i+1]; asciinum[1] = buffer[i+2]; buffer[i] = strtol(asciinum, NULL, 16); c = i+1; do { buffer[c] = buffer[c+2]; while ( buffer[2+(c++)] ); ++i; int Parse_HTTP_Header(char * buffer, struct ReqInfo * reqinfo) { static int first_header = 1; char *temp; char *endptr; int len; if ( first_header == 1 ) { /* Αν το first_header είναι 0, είναι η πρώτη γραµµή της HTTP κλήσης */ /* Απάντηση σε κλήσεις GET και HEAD */ if (!strncmp(buffer, "GET ", 4) ) { reqinfo->method = GET; buffer += 4; else if (!strncmp(buffer, "HEAD ", 5) ) { ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 6 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

reqinfo->method = HEAD; buffer += 5; else { reqinfo->method = UNSUPPORTED; reqinfo->status = 501; return -1; while ( *buffer && isspace(*buffer) ) buffer++; endptr = strchr(buffer, ' '); if ( endptr == NULL ) len = strlen(buffer); else len = endptr - buffer; if ( len == 0 ) { reqinfo->status = 400; return -1; reqinfo->resource = calloc(len + 1, sizeof(char)); strncpy(reqinfo->resource, buffer, len); /* οκιµή αν υπάρχει πληροφορία της έκδοσης του HTTP */ if ( strstr(buffer, "HTTP/") ) reqinfo->type = FULL; else reqinfo->type = SIMPLE; first_header = 0; endptr = strchr(buffer, ':'); if ( endptr == NULL ) { reqinfo->status = 400; return -1; temp = calloc( (endptr - buffer) + 1, sizeof(char) ); strncpy(temp, buffer, (endptr - buffer)); StrUpper(temp); /* Αύξηση του buffer για να δείχνει στη νέα τιµή και επιστροφή αν είναι 0 */ buffer = endptr + 1; ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 7 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

while ( *buffer && isspace(*buffer) ) ++buffer; if ( *buffer == '\0' ) if (!strcmp(temp, "USER-AGENT") ) { reqinfo->useragent = malloc( strlen(buffer) + 1 ); strcpy(reqinfo->useragent, buffer); else if (!strcmp(temp, "REFERER") ) { reqinfo->referer = malloc( strlen(buffer) + 1 ); strcpy(reqinfo->referer, buffer); free(temp); int Get_Request(int conn, struct ReqInfo * reqinfo) { char buffer[max_req_line] = {0; int rval; fd_set fds; struct timeval tv; /* Θέτουµε το timeout ίσο µε 5 sec */ tv.tv_sec = 5; tv.tv_usec = 0; do { FD_ZERO(&fds); FD_SET (conn, &fds); /* Περιµένει µέχρι το timeout για να δει αν η είσοδος είναι έτοιµη */ rval = select(conn + 1, &fds, NULL, NULL, &tv); if ( rval < 0 ) { Error_Quit("Error calling select() in get_request()"); else if ( rval == 0 ) { /* Η είσοδος δεν είναι έτοιµη µετά το timeout αρά επιστροφή λάθους */ return -1; else { ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 8 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

/* Έχουµε µια γραµµή σε αναµονή και αρά τη διαβάζουµε */ Readline(conn, buffer, MAX_REQ_LINE - 1); Trim(buffer); if ( buffer[0] == '\0' ) break; if ( Parse_HTTP_Header(buffer, reqinfo) ) break; while ( reqinfo->type!= SIMPLE ); void InitReqInfo(struct ReqInfo * reqinfo) { reqinfo->useragent = NULL; reqinfo->referer = NULL; reqinfo->resource = NULL; reqinfo->method = UNSUPPORTED; reqinfo->status = 200; /* Ελευθερώνει µνήµη */ void FreeReqInfo(struct ReqInfo * reqinfo) { if ( reqinfo->useragent ) free(reqinfo->useragent); if ( reqinfo->referer ) free(reqinfo->referer); if ( reqinfo->resource ) free(reqinfo->resource); /* Καθορισµός του ριζικού καταλόγου που χρησιµοποιεί ο Server Στην περίπτωση µας χρησιµοποιήσαµε αυτόν τον κατάλογο : "/home/osproject/web-server" */ static char server_root[1000] = "/home/os-project/web-server"; int Return_Resource(int conn, int resource, struct ReqInfo * reqinfo) { char c; int i; while ( (i = read(resource, &c, 1)) ) { if ( i < 0 ) Error_Quit("Error reading from file."); ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 9 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

if ( write(conn, &c, 1) < 1 ) Error_Quit("Error sending file."); int Check_Resource(struct ReqInfo * reqinfo) { CleanURL(reqinfo->resource); strcat(server_root, reqinfo->resource); return open(server_root, O_RDONLY); /* Επιστροφή µηνύµατος λάθους */ int Return_Error_Msg(int conn, struct ReqInfo * reqinfo) { char buffer[100]; sprintf(buffer, "<HTML>\n<HEAD>\n<TITLE>Server Error %d</title>\n" "</HEAD>\n\n", reqinfo->status); Writeline(conn, buffer, strlen(buffer)); sprintf(buffer, "<BODY>\n<H1>Server Error %d</h1>\n", reqinfo->status); Writeline(conn, buffer, strlen(buffer)); sprintf(buffer, "<P>The request could not be completed.</p>\n" "</BODY>\n</HTML>\n"); Writeline(conn, buffer, strlen(buffer)); int Output_HTTP_Headers(int conn, struct ReqInfo * reqinfo) { char buffer[100]; sprintf(buffer, "HTTP/1.0 %d OK\r\n", reqinfo->status); Writeline(conn, buffer, strlen(buffer)); Writeline(conn, "Server: PGWebServ v0.1\r\n", 24); Writeline(conn, "Content-Type: text/html\r\n", 25); Writeline(conn, "\r\n", 2); ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 10 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

int Service_Request(int conn) { struct ReqInfo reqinfo; int resource = 0; InitReqInfo(&reqinfo); if ( Get_Request(conn, &reqinfo) < 0 ) return -1; if ( reqinfo.status == 200 ) if ( (resource = Check_Resource(&reqinfo)) < 0 ) { if ( errno == EACCES ) reqinfo.status = 401; else reqinfo.status = 404; if ( reqinfo.type == FULL ) Output_HTTP_Headers(conn, &reqinfo); if ( reqinfo.status == 200 ) { if ( Return_Resource(conn, resource, &reqinfo) ) Error_Quit("Something wrong returning resource."); else Return_Error_Msg(conn, &reqinfo); if ( resource > 0 ) if ( close(resource) < 0 ) Error_Quit("Error closing resource."); FreeReqInfo(&reqinfo); /* Καθορίζουµε το port που να ακούει ο Server */ #define SERVER_PORT (80) int main(int argc, char *argv[]) { int listener, conn; pid_t pid; ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 11 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

struct sockaddr_in servaddr; /* ηµιουργία Thread */ if ( (listener = socket(af_inet, SOCK_STREAM, 0)) < 0 ) Error_Quit("Couldn't create listening socket."); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(inaddr_any); servaddr.sin_port = htons(server_port); /* έσµευση του thread */ if ( bind(listener, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) Error_Quit("Couldn't bind listening thread."); /* Κάνουµε ένα Thread να είναι Listening Thread */ if ( listen(listener, LISTENQ) < 0 ) Error_Quit("Call to listen failed."); /* Επανάληψη της αποδοχής των συνδέσεων */ while ( 1 ) { /* Αναµονή για µια σύνδεση */ if ( (conn = accept(listener, NULL, NULL)) < 0 ) Error_Quit("Error calling accept()"); /* ηµιουργία ενός Worker Thread για την εξυπηρέτηση της Σύνδεσης */ if ( (pid = fork()) == 0 ) { if ( close(listener) < 0 ) Error_Quit("Error closing listening Thread."); Service_Request(conn); if ( close(conn) < 0 ) Error_Quit("Error closing connection Thread."); exit(exit_success); if ( close(conn) < 0 ) Error_Quit("Error closing connection Thread."); waitpid(-1, NULL, WNOHANG); ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 12 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

return EXIT_FAILURE; /* ΛΑΘΟΣ */ ΤΡΟΠΟΣ ΕΓΚΑΤΑΣΤΑΣΗΣ ΕΚΤΕΛΕΣΗΣ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΗΜΙΟΥΡΓΙΑ ΤΩΝ ΕΠΙΘΥΜΗΤΩΝ ΚΑΤΑΛΟΓΩΝ ΓΙΑ ΤΗ ΣΩΣΤΗ ΛΕΙΤΟΥΡΓΙΑ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΠΡΟΣΘΗΚΗ ΤΟΥ ΑΡΧΕΙΟΥ ΜΕ ΤΟΝ ΠΗΓΑΙΟ ΚΩ ΙΚΑ (WEBSERVER.C) ΣΤΟΝ ΑΝΤΙΣΤΟΙΧΟ ΚΑΤΑΛΟΓΟ ΕΚΤΕΛΕΣΗ ΤΟΥ COMPILER (gcc) ΜΕ ΕΞΟ Ο ΤΟ ΕΠΙΘΥΜΗΤΟ ΑΠΟΤΕΛΕΣΜΑ ΕΚΤΕΛΕΣΗ ΤΟΥ ΕΚΤΕΛΕΣΙΜΟΥ ΑΡΧΕΙΟΥ OUR_WEB_SERVER ΕΠΙΒΕΒΑΙΩΣΗ ΛΕΙΤΟΥΡΓΙΑΣ ΤΟΥ SERVER ΜΕΣΩ ΤΟΥ BROWSER ΑΠΟ ΤΟ Ι ΙΟ ΜΗΧΑΝΗΜΑ (localhost) ΚΑΙ ΕΠΙΣΗΣ ΣΕ ΠΡΑΓΜΑΤΙΚΕΣ ΣΥΝΘΗΚΕΣ ΙΚΤΥΟΥ (ΜΕΣΩ LAN - IP : 192.168.7.202:80). O SERVER ΣΤΗΝ ΚΛΗΣΗ ΤΗΣ GET INDEX.HTML Η ΟΠΟΙΑ ΕΧΕΙ ΤΟΝ ΕΞΗΣ ΚΩ ΙΚΑ : <HTML> <TITLE> ERGASIA STA LEITOURGIKA SYSTHMATA </TITLE> <BODY> ERGASIA ME THEMA :<BR> ENAS APLOS WEB-SERVER POU "AKOUEI" STIN PORT 80<BR> <BR><BR> <BR><HR> KALOPITAS KONSTANTINOS<BR> SVENTZOURIS KONSTANTINOS<BR> <BR> PARADEIGMA EKTYPWSIS TIS GET INDEX.HTML<BR> <BR> </BODY> </HTML> ΕΠΕΣΤΡΕΨΕ ΤΟ ΕΠΙΘΥΜΗΤΟ ΑΠΟΤΕΛΕΣΜΑ ΠΟΥ ΕΙΝΑΙ Η ΣΕΛΙ Α INDEX.HTML ΜΕΣΩ ΤΟΥ BROWSER. ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 13 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

ΑΚΟΛΟΥΘΟΥΝ ΤΑ ΑΝΑΛΟΓΑ ΣΤΙΓΜΙΟΤΥΠΑ ΟΘΟΝΗΣ : ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 14 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 15 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 16 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ

ΒΙΒΛΙΟΓΡΑΦΙΑ 1. MODERN OPERATING SYSTEM 2 ND by ANDREW S. TANENBAUM 2. INTRODUCTION TO SOCKET PROGRAMMING USING C 3. INTERNET - GOOGLE ΣΒΕΝΤΖΟΥΡΗΣ ΚΩΝΣΤΑΝΤΙΝΟΣ - 17 - ΚΑΛΟΠΗΤΑΣ ΚΩΝΣΤΑΝΤΙΝΟΣ