#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 \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