All pastes #885173 Raw Edit

Someone

public text v1 · immutable
#885173 ·published 2008-01-30 20:05 UTC
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);
	}
}