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:

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Χαχ. Ότι σου είναι πιο εύκολο(με μία μικρή κλίση προς τον κώδικα, γιατί πέρα από αυτή τη βοήθεια, δεν βρήκα κάτι άλλο... network programming - Creating a web server in pure C - Stack Overflow )

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Αυτό που θα αλλάξει για σένα με τα 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

Archived

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

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

Important Information

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