theoamd Δημοσιεύτηκε Μάϊος 31, 2012 #1 Κοινοποίηση Δημοσιεύτηκε Μάϊος 31, 2012 Είναι δυνατή η παρακάτω υλοποίηση με τη χρήση threads(se C)? Χρειάζομαι αρκετό βοηθητικό υλικό,γιατί πρώτη φορά έρχομαι αντιμέτωπος με κάτι τέτοιο και πέρα από μια σελίδα δεν έχω βρει κάτι παραπάνω : Θέλω να προγραμματίσω σε (POSIX) μια απλοποιημένη διεργασία webserver, η οποία θα δημιουργεί έναν αριθμό από threads τα οποία είναι worker threads. Όταν έρθει μια αίτηση στην θύρα 80, τότε το master thread να διαλέγει ένα thread για να προωθήσει το request το οποίο στέλνει ότι αρχεία του έχουν ζητηθεί(πχ αν γίνει το request "GET INDEX.HTML" τότε θα στέλνει το αρχείο INDEX.HTML). Συγκεκριμένα,απ'όσο νομίζω, πρέπει τα worker threads να έχουν μια στοιχειώδη κατανόηση του προτοκόλου HTTP (ουσιαστικά για αρχικό επίπεδο θα ήθελα μόνο GET) ώστε να μπορώ να συνδεθώ με κάποιο Browser και να δω μια σελίδα. Οποιαδήποτε βοήθεια ευπρόσδεκτη Link to comment Share on other sites More sharing options...
nucleus Μάϊος 31, 2012 #2 Κοινοποίηση Μάϊος 31, 2012 Θέλω να προγραμματίσω σε (POSIX) μια απλοποιημένη διεργασία webserver, η οποία θα δημιουργεί έναν αριθμό από threads τα οποία είναι worker threads. Όταν έρθει μια αίτηση στην θύρα 80, τότε το master thread να διαλέγει ένα thread για να προωθήσει το request το οποίο στέλνει ότι αρχεία του έχουν ζητηθεί(πχ αν γίνει το request "GET INDEX.HTML" τότε θα στέλνει το αρχείο INDEX.HTML). Δεν δουλεύει έτσι.Θα φτιάξεις ένα master thread ή αλλιώς parent που το μόνο που θα κάνει είναι να κάνει bind σε ένα socket και να "ακούει" για requests.Κάθε request = ένα νέο thread που θα εξυπηρετεί το request. Link to comment Share on other sites More sharing options...
theoamd Μάϊος 31, 2012 Author #3 Κοινοποίηση Μάϊος 31, 2012 Σαν να έχεις δίκιο(τουλάχιστον αυτή την εκδοχή την κατάλαβα πολύ περισσότερο από αυτή που παρέθεσα).Σε λίγες μέρες θα ξεκινήσει το όλο project εκτιμώ. Link to comment Share on other sites More sharing options...
nucleus Μάϊος 31, 2012 #4 Κοινοποίηση Μάϊος 31, 2012 Θες και κώδικα τώρα ή σκελετό κώδικα? :S Link to comment Share on other sites More sharing options...
theoamd Μάϊος 31, 2012 Author #5 Κοινοποίηση Μάϊος 31, 2012 Χαχ. Ότι σου είναι πιο εύκολο(με μία μικρή κλίση προς τον κώδικα, γιατί πέρα από αυτή τη βοήθεια, δεν βρήκα κάτι άλλο... network programming - Creating a web server in pure C - Stack Overflow ) Link to comment Share on other sites More sharing options...
nucleus Μάϊος 31, 2012 #6 Κοινοποίηση Μάϊος 31, 2012 Wall of text incomingint main(int argc, char **argv){ int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr,servaddr; int SERV_PORT; int MAXCHILD; struct config conf; char *clientip; conf=read_conf(); SERV_PORT=conf.port; MAXCHILD=conf.maxchild; take_args(argc, argv, &conf); SERV_PORT=conf.port; listenfd=socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(SERV_PORT); bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, MAXCHILD); signal(SIGCHLD, sig_chld); for(;{ clilen=sizeof(cliaddr); if((connfd=accept(listenfd, (struct sockaddr *)&cliaddr, &clilen))<0){ if(errno==EINTR) continue; else printf("accept error"); } childpid=fork() close(listenfd); serve_cli(connfd); exit(0); close(connfd); }}Note είναι σε unix και είναι σε κώδικας της προηγούμενης χιλιετίας.conf=read_conf(); SERV_PORT=conf.port; MAXCHILD=conf.maxchild; take_args(argc, argv, &conf); SERV_PORT=conf.port;διαβάζει το configuration από αρχείο.SERV_PORT που θα ακούει.MAXCHILD μεγιστος αριθμός παιδιών που θα δημιουργεί.take_args αν δεχεται ορίσματα από γραμμή εντολών. Link to comment Share on other sites More sharing options...
theoamd Μάϊος 31, 2012 Author #7 Κοινοποίηση Μάϊος 31, 2012 Αυτό ήταν όλο? Link to comment Share on other sites More sharing options...
nucleus Μάϊος 31, 2012 #8 Κοινοποίηση Μάϊος 31, 2012 Φυσικά δεν έφτιαξα την serve_cli(connfd) που εξυπηρετεί τα clients αυτό στο αφήνω σε εσένα.Εξάλλου o κώδικας αυτός δεν ήταν για webserver αλλά για p2p. Link to comment Share on other sites More sharing options...
Jaco Μάϊος 31, 2012 #9 Κοινοποίηση Μάϊος 31, 2012 Αν δεν είναι εργασία που πρέπει να χρησιμοποιήσεις υποχρεωτικά threads, τότε για web server σου προτείνω να κάνεις forking για κάθε request, ώστε να μην έχεις race conditions και να δουλεύεις σε sandboxed memory space... Αν δεν κάνω λάθος και ο apache με fork είναι υλοποιημένος, γι' αυτό ακριβώς το λόγο... Link to comment Share on other sites More sharing options...
theoamd Μάϊος 31, 2012 Author #10 Κοινοποίηση Μάϊος 31, 2012 Όχι [MENTION=5249]Jaco[/MENTION], πρέπει να γίνει χρήση threads. Anyway, 9enx και στους 2, εκτιμώ ότι το όλο project θα ξεκινήσει σε κάνα μηνά(όπου και θα έχω ξεμπερδέψει με εξεταστική), οπότε απλώς αναμένουμε για νεότερα :baby: Link to comment Share on other sites More sharing options...
nucleus Μάϊος 31, 2012 #11 Κοινοποίηση Μάϊος 31, 2012 threads?ermmm major problem ο κώδικας κάνει fork ακα process.Ooops!<pthread.h> Link to comment Share on other sites More sharing options...
theoamd Μάϊος 31, 2012 Author #12 Κοινοποίηση Μάϊος 31, 2012 (ναι, το ξέρω ότι αυτό το καλοκαίρι θα είμαι πιο κοντά από κάθε άλλο στο να σπάσω το PC μου,αλλά αφού μπήκαμε στο χορό...αναγκαστικά θα χορέψουμε :baby: ) Link to comment Share on other sites More sharing options...
Jaco Ιούνιος 1, 2012 #13 Κοινοποίηση Ιούνιος 1, 2012 Αυτό που θα αλλάξει για σένα με τα threads είναι πως θα πρέπει να ασφαλίζεις με mutexes και locks την shared memory (στο heap κυρίως)... Επειδή είναι web server δεν θες πολλά mutexes, γιατί είναι ουσιαστικά one night stand σχέση client-server, οπότε απλά θα πρέπει να διασφαλίζεις κυρίως τα arrays σου που κρατάς τους pointers από τα threads και να κάνεις ασφαλές socket management (που θα δεις θα είναι και το πιο δύσκολο στην εφαρμογή σου)...Αν έχεις 1-2 πράγματα στο μυαλό σου, δεν είναι κάτι δύσκολο... Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.