All pastes #965003 Raw Edit

Unnamed

public text v1 · immutable
#965003 ·published 2008-03-31 18:31 UTC
rendered paste body
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

#include <linux/if.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>

#define BUFFERSIZE 512
#define MAX_THREADS 15

int threads, srvsock;
pthread_mutex_t threadlock;
void* ThreadRoutine(void* _param);

int main(int argc, char* argv[]) {
	struct sockaddr_in srv;

	if (argc < 2) {
	  printf("usage: tcpsrv6 <portnumber>\n");
	  exit(1);
	}
	printf ("Multi-Threaded echo server started.\n");

	if ((srvsock = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
		perror ("creating socket");
		exit (1);
	}

	memset (&srv, 0, sizeof (struct sockaddr_in));	
	srv.sin_family = AF_INET;
	srv.sin_port = htons(atoi(argv[1]));
	srv.sin_addr.s_addr = htonl(INADDR_ANY);

	if (bind (srvsock, (struct sockaddr *)&srv, sizeof(srv)) != 0) {
		perror ("bind addr");
		exit (1);
	}

	printf("Listening...\n");

	listen(srvsock, 10);
	while (1) {
		while (threads < MAX_THREADS) {
			pthread_t thread;
			if (pthread_create(&thread, NULL, ThreadRoutine, (void*)NULL) == -1) { perror("pthread_create"); exit(1); }
			if (pthread_mutex_lock(&threadlock) != 0) { perror("mutex lock error"); exit(1); }
			threads++; /* increase threads accepting */
			if (pthread_mutex_unlock(&threadlock) != 0) { perror("mutex unlock error"); exit(1); }
		}
		sleep(1);		
	}
	close (srvsock);
	return 0;
}

void* ThreadRoutine(void* _param) {
	char buffer[BUFFERSIZE];			/* buffer met lengte van BUFFERSIZE */
	int i, bytes = 1;
	struct sockaddr_in cli;
	size_t cli_size = sizeof(cli);			/* Grootte van cli om later naar het adres te refereren */

	printf("New accept thread\n");


	while (1) {
		if ((i = accept(srvsock, (struct sockaddr *)&cli, &cli_size)) > 0) {
			printf("Connected to %s (socket: %i)\n", inet_ntoa(cli.sin_addr), i);
			if (pthread_mutex_lock(&threadlock) != 0) { perror("mutex lock error"); exit(1); }
			threads--;
			if (pthread_mutex_unlock(&threadlock) != 0) { perror("mutex unlock error"); exit(1); }
			do {
				bytes = recv(i, buffer, BUFFERSIZE, 0);
				if (send(i, buffer, BUFFERSIZE, 0) == -1) bytes = 0;
				printf("Received %i bytes from %s\n", bytes, inet_ntoa(cli.sin_addr));
			} while(bytes > 0);
			close(i);
			printf("Closing thread (socket: %i, ip: %s).\n", i, inet_ntoa(cli.sin_addr));
			pthread_exit(NULL);
		}
		else { printf("Accept error\n"); }
	}
}