#include #include #include #include #include #include #include #include #include #include #include #define BUFSIZE 8096 #define ERROR 42 #define SORRY 43 #define LOG 44 #define NUM_THREADS 100 typedef struct { int fd; int hit; } thread_parm_t; void web(void *parm) { thread_parm_t *p = (thread_parm_t *)parm; long ret; static char buffer[BUFSIZE+1]; ret = read(p->fd, buffer, BUFSIZE); (void)sprintf(buffer, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"); (void)write(p->fd, buffer, strlen(buffer)); (void)sprintf(buffer, "Hello World\n"); (void)write(p->fd, buffer, strlen(buffer)); close(p->fd); // free(parm); } void log(int e, char *s0, char *s2, int num) { printf("%s - %s", s0, s2); } int main(int argc, char **argv) { int port, listenfd, socketfd, hit; size_t length; static struct sockaddr_in cli_addr; static struct sockaddr_in serv_addr; if (argc < 2 || argc > 2) return 1; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) log(ERROR, "system call", "socket", 0); port = atoi(argv[1]); if (port < 0 || port > 60000) log(ERROR, "Invalid port nr", argv[1], 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(port); if(bind(listenfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) <0) log(ERROR,"system call","bind",0); if( listen(listenfd,64) <0) log(ERROR,"system call","listen",0); thread_parm_t *parm = malloc( sizeof(thread_parm_t) ); pthread_t thread_id[NUM_THREADS]; for(hit = 0; ; hit++) { length = sizeof(cli_addr); if ((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0 ) log(ERROR, "system call", "accept", 0); // parm = malloc( sizeof(thread_parm_t) ); parm->fd = socketfd; parm->hit = hit; pthread_create( &thread_id[hit%NUM_THREADS], NULL, web, parm); // free(parm); } }