www.pudn.com > cpe09-tr06-ipv601-gychoi.zip > goya_ipv6server.c, change:2009-04-01,size:2496b


#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <sys/stat.h> 
#include <pthread.h> 
 
#define BUFMAX 100 
#define CLIENTMAX 10 
 
void *do_for_client(void *arg); 
void send_msg_to_clients(char *buf, int len, int recv_sock); 
void error_print(char *message); 
 
int client_num=0; 
int cli_socks[CLIENTMAX]; 
pthread_mutex_t mutex; 
 
int main(int argc, char **argv) { 
 
	int serv_sock; 
	int cli_sock; 
	struct sockaddr_in6 serv_addr6; 
	struct sockaddr_in6 cli_addr6; 
	int addr_len; 
	pthread_t thread; 
	 
	if(argc!=2) { 
		printf("Usage : %s <port> \n", argv[0]); 
		exit(1); 
	} 
 
	if(pthread_mutex_init(&mutex, NULL)) 
		error_print("mutex initialization error"); 
	 
	serv_sock = socket(PF_INET6, SOCK_STREAM, 0); 
	memset(&serv_addr6, 0, sizeof(serv_addr6)); 
	serv_addr6.sin6_family = AF_INET6; 
	serv_addr6.sin6_flowinfo = 0; 
	serv_addr6.sin6_addr = in6addr_any; 
	serv_addr6.sin6_port = htons(atoi(argv[1])); 
 
	if(bind(serv_sock, (struct sockaddr *) &serv_addr6, sizeof(serv_addr6)) == -1) 
		error_print("bind() error"); 
	 
	if(listen(serv_sock, 5) == -1) 
		error_print("listen() error"); 
	 
	while(1){ 
		addr_len = sizeof(cli_addr6); 
		cli_sock = accept(serv_sock, (struct sockaddr *)&cli_addr6, &addr_len); 
		pthread_mutex_lock(&mutex); 
		cli_socks[client_num++] = cli_sock; 
		printf("Client's Number : %d\n", client_num); 
		pthread_mutex_unlock(&mutex); 
		pthread_create(&thread, NULL, &do_for_client, &cli_sock); 
		printf("New client joined !!\n"); 
	} 
	return(0); 
} 
 
void *do_for_client(void *arg){ 
 
	int cli_sock = *((int*)arg); 
	char buf[BUFMAX]; 
	int str_len=0; 
	int i; 
	 
	pthread_detach(pthread_self()); 
 
	while((str_len = read(cli_sock, buf, sizeof(buf)))!=0) 
		send_msg_to_clients(buf, str_len, cli_sock); 
 
	pthread_mutex_lock(&mutex); 
	for(i=0; i<client_num;i++){ 
		if(cli_sock == cli_socks[i]){ 
			for( ;i<client_num-1; i++) 
				cli_socks[i] = cli_socks[i+1]; 
			break; 
		} 
	} 
	client_num ; 
	pthread_mutex_unlock(&mutex); 
 
	close(cli_sock); 
	return(0); 
} 
 
void send_msg_to_clients(char *msg, int len, int recv_sock){ 
 
	int i; 
	 
	pthread_mutex_lock(&mutex); 
	for(i=0; i<client_num; i++) 
		if(cli_socks[i] != recv_sock) 
			write(cli_socks[i], msg, len); 
	pthread_mutex_unlock(&mutex); 
} 
 
void error_print(char *buf){ 
	fputs(buf,stderr); 
	fputc('\n', stderr); 
	exit(1); 
}