rendered paste body#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#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);
}
}