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);
}