#include "common.h"

void toggle(int conn_sock, int hit);
void *serve_client(void *vargp);

typedef struct _client_data_t {
    int conn_sock;			//客户连接socket
    int hit;                           //第几个客户
} client_data_t;

int main(int argc, char **argv) 
{
    int listen_sock, conn_sock, port,*conn_sock_p ; 
    struct sockaddr_in clientaddr; 
    struct hostent *hp;
    char *haddrp;
    client_data_t *cdp;                 //连接客户信息
    int hit;				//连接客户计数

    socklen_t clientlen=sizeof(struct sockaddr_in);

    pthread_t tid; 

    if (argc != 2) {
	    fprintf(stderr, "usage: %s <port>\n", argv[0]);
	    exit(1);
    }
    port = atoi(argv[1]);

    listen_sock = open_listen_sock(port);
    if( listen_sock==-1) {
    	printf("端口号%d繁忙\n",port);
    	exit(1);
    }
    
    for (hit=1; ; hit++) {
	    cdp = malloc(sizeof(client_data_t));
	    cdp->conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen);
	    cdp->hit=hit;
	    
            /* determine the domain name and IP address of the client */
	    hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, 
			   sizeof(clientaddr.sin_addr.s_addr), AF_INET);
	    haddrp = inet_ntoa(clientaddr.sin_addr);
	    printf("server connected to %s (%s)\n", hp->h_name, haddrp);

	    pthread_create(&tid, NULL, serve_client, (void *)cdp);
    }
}

/* thread routine */
void * serve_client (void *vargp) 
{  
    int hit,conn_sock;
    client_data_t cd;
    cd = *(client_data_t *)vargp;
    
    pthread_detach(pthread_self()); 
    free(vargp);
    toggle(cd.conn_sock,cd.hit);
    
    close(conn_sock);
    return NULL;
}

//工作函数
void toggle(int conn_sock,int hit) 
{
    size_t n; int i,no=0;
    char buf[MAXLINE]; 

    printf("第%d个客户通信开始\n",hit);
    while((n =recv(conn_sock, buf, MAXLINE,0))> 0) {
	printf("toggle服务器收到第%d个客户第%d个消息,长度为%d字节\n", hit,++no,(int)n);

        for(i=0; i<n; i++)
            if(isupper(buf[i])) 
                buf[i]=tolower(buf[i]);
            else if(islower(buf[i]))
                buf[i]=toupper(buf[i]);
               
	send (conn_sock, buf, n, 0);
    }
    printf("第%d个客户通信结束\n",hit);
}

