Jump to content



POSIX THREADS


theoamd

Recommended Posts

Δημοσιεύτηκε

Είναι δυνατή η παρακάτω υλοποίηση με τη χρήση threads(se C)?

Χρειάζομαι αρκετό βοηθητικό υλικό,γιατί πρώτη φορά έρχομαι αντιμέτωπος με κάτι τέτοιο και πέρα από μια σελίδα δεν έχω βρει κάτι παραπάνω :

Θέλω να προγραμματίσω σε (POSIX) μια απλοποιημένη διεργασία webserver, η οποία θα δημιουργεί έναν αριθμό από threads τα οποία είναι worker threads. Όταν έρθει μια αίτηση στην θύρα 80, τότε το master thread να διαλέγει ένα thread για να προωθήσει το request το οποίο στέλνει ότι αρχεία του έχουν ζητηθεί(πχ αν γίνει το request "GET INDEX.HTML" τότε θα στέλνει το αρχείο INDEX.HTML).

Συγκεκριμένα,απ'όσο νομίζω, πρέπει τα worker threads να έχουν μια στοιχειώδη κατανόηση του προτοκόλου HTTP (ουσιαστικά για αρχικό επίπεδο θα ήθελα μόνο GET) ώστε να μπορώ να συνδεθώ με κάποιο Browser και να δω μια σελίδα.

Οποιαδήποτε βοήθεια ευπρόσδεκτη :dots:

Θέλω να προγραμματίσω σε (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.

Σαν να έχεις δίκιο(τουλάχιστον αυτή την εκδοχή την κατάλαβα πολύ περισσότερο από αυτή που παρέθεσα).

Σε λίγες μέρες θα ξεκινήσει το όλο project εκτιμώ.

Wall of text incoming

int 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 αν δεχεται ορίσματα από γραμμή εντολών.

Φυσικά δεν έφτιαξα την serve_cli(connfd) που εξυπηρετεί τα clients αυτό στο αφήνω σε εσένα.Εξάλλου o κώδικας αυτός δεν ήταν για webserver αλλά για p2p.

Αν δεν είναι εργασία που πρέπει να χρησιμοποιήσεις υποχρεωτικά threads, τότε για web server σου προτείνω να κάνεις forking για κάθε request, ώστε να μην έχεις race conditions και να δουλεύεις σε sandboxed memory space... Αν δεν κάνω λάθος και ο apache με fork είναι υλοποιημένος, γι' αυτό ακριβώς το λόγο...

Όχι [MENTION=5249]Jaco[/MENTION], πρέπει να γίνει χρήση threads. Anyway, 9enx και στους 2, εκτιμώ ότι το όλο project θα ξεκινήσει σε κάνα μηνά(όπου και θα έχω ξεμπερδέψει με εξεταστική), οπότε απλώς αναμένουμε για νεότερα :baby:

(ναι, το ξέρω ότι αυτό το καλοκαίρι θα είμαι πιο κοντά από κάθε άλλο στο να σπάσω το PC μου,αλλά αφού μπήκαμε στο χορό...αναγκαστικά θα χορέψουμε :baby: )

Αυτό που θα αλλάξει για σένα με τα threads είναι πως θα πρέπει να ασφαλίζεις με mutexes και locks την shared memory (στο heap κυρίως)... Επειδή είναι web server δεν θες πολλά mutexes, γιατί είναι ουσιαστικά one night stand σχέση client-server, οπότε απλά θα πρέπει να διασφαλίζεις κυρίως τα arrays σου που κρατάς τους pointers από τα threads και να κάνεις ασφαλές socket management (που θα δεις θα είναι και το πιο δύσκολο στην εφαρμογή σου)...

Αν έχεις 1-2 πράγματα στο μυαλό σου, δεν είναι κάτι δύσκολο...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.