gcc -D_REENTRANT thread.c -o thread -lpthread
#include <stdio.h> #include <pthread.h> #include <sys/socket.h> #include <stdlib.h> #include <string.h> #include <sys/errno.h> #include <netinet/in.h> #include <stdlib.h> #define SERVER_PORT 3334 // 绑定端口 #define LISTEN_QUEUE 25 //监听队列的长度 #define DEFAULT 1 //默认值 #define EXIT -1 // 退出 #define NET_BUF_LEN 512 // 接收&发送 缓冲区长度 #define SUCCESS 1 // 猜对 #define ERR_NUM -2 // 猜错 #define STR -9 // 字符串标识 char cue_message[200]; int guess_times=0; //pthread_mutex_t user_mutex; // 创建线程锁 int tcp_server_init() { int serv_sockfd; struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT); if ((serv_sockfd = socket(AF_INET,SOCK_STREAM,0))<0) { printf("Creat socket failed !\n"); exit(1); } if ((bind(serv_sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr)))<0) { printf("bind port %d failed !\n",SERVER_PORT); exit(1); } if ((listen(serv_sockfd,LISTEN_QUEUE))<0) { printf("server listen failed !\r\n "); exit(1); } return serv_sockfd; // 返回套接字句柄 } int str_to_num(char *str) { int num=0,i=0; char *tmp; tmp = str; while(tmp[i]) { num += tmp[i] - '0'; if(tmp[i+1]) { num *= 10; } else { return num; } i++; } return num; } int check_str(char *buf) { int num; char *tmp; tmp=buf; if(tmp[0]>='0' && tmp[0] <= '9') { num = str_to_num(tmp); return num; } else { return STR; } } int slove_num(int num,int standard) { if(num < standard) { memset(cue_message,0,100); memcpy(cue_message,"你输入的数太小\n",sizeof("你输入的数太小\n")); // guess_times ++; return ERR_NUM; } else if(num > standard) { memset(cue_message,0, 100); memcpy(cue_message,"你输入的数太大\n",sizeof("你输入的数太大\n")); // guess_times++; return ERR_NUM; } else { memset(cue_message,0,100); sprintf(cue_message,"恭喜!!!!猜对啦!!!\n你要猜的数是: %d \n继续游戏请输入\"y\"或\"Y\"\n",standard); return SUCCESS; } } int get_standard_num() { int num; srand((int)time(0)); num = 1+(int)(100.0*rand()/(RAND_MAX+1.0)); return num; } void *tcp_thread(void *new_server_socket) { char recv_buf[NET_BUF_LEN]; char send_buf[NET_BUF_LEN]; int server_sockfd = (int)new_server_socket; int result=DEFAULT; int flag,standard,first=1,err; while (result != EXIT) { if (first == 1) { standard = get_standard_num(); //printf("要猜的数是: %d \n",standard); memset(cue_message,0,100); memcpy(cue_message,"欢迎进入猜数字游戏!\ \n请输入一个从 0 到 100 之间的数:\n",\ sizeof("欢迎进入猜数字游戏!\n\ 请输入一个从 0 到 100 之间的数:\n")); first = 0; guess_times = 0; } if((send(server_sockfd,cue_message,sizeof(cue_message),0))<0) { printf("send error \r\n"); exit(1); } if ((recv(server_sockfd,recv_buf,NET_BUF_LEN,0))<0) { printf("recv error !\r\n"); exit(1); } printf("server_sockfd: %d\n",server_sockfd); //printf("recv ok: %s \n",recv_buf); if (strcmp(recv_buf,"quit")==0) { result = EXIT; printf("你要猜的数是 : %d \n",standard); } else if ((strcmp(recv_buf,"y")==0) || (strcmp(recv_buf,"Y")==0)) { first = 1; result = DEFAULT; } else { result = DEFAULT; } flag = check_str(recv_buf); if(flag != STR) { err=slove_num(flag,standard); if(err == SUCCESS) { guess_times = 0; // first = 1; printf("你要猜的数是%d \n",standard); } if(err == ERR_NUM) { guess_times++; printf("guess_times = %d \n",guess_times); } } #if 0 if ((recv(server_sockfd,recv_buf,NET_BUF_LEN,0))<0) { printf("recv error !\r\n"); exit(1); } printf("recv ok: %s \n",recv_buf); if (strcmp(recv_buf,"ok")==0) { memset(recv_buf,0,NET_BUF_LEN); if((send(server_sockfd,"ok",sizeof("ok"),0))<0) { printf("send error \r\n"); exit(1); } result = DEFAULT; printf("send ok \n"); } else if (strcmp(recv_buf,"quit")==0) { memset(recv_buf,0,NET_BUF_LEN); if ((send (server_sockfd,"this tcp thread is close,bye bye!\n",\ sizeof("this tcp thread is close,bye bye!\n"),0))<0) { printf("send error !\n"); exit(1); } printf("close tcp server thread !\n"); result = EXIT; } else { memset(send_buf,0,NET_BUF_LEN); sprintf(send_buf,"you have send \" %s \" to me,thank you !\n", recv_buf); if ((send (server_sockfd,send_buf,NET_BUF_LEN,0))<0) { printf("send error !\n"); exit(1); } printf("send ok!\n"); memset(recv_buf,0,NET_BUF_LEN); result = DEFAULT; } #endif } pthread_exit(NULL); } int main() { int sockfd,cli_sockfd; struct sockaddr_in client_addr; socklen_t length; pthread_t thread_id; sockfd = tcp_server_init(); while (1) { length = sizeof(client_addr); printf("start accept \n"); if ((cli_sockfd = accept(sockfd,(struct sockaddr *)&client_addr,&length))<0) { printf("tcp server accept error! \n"); break; } if(pthread_create(&thread_id,NULL,tcp_thread,(void*)cli_sockfd)<0) { printf("tcp server create thread error:%s !\n",strerror(errno)); } else { printf("create thread : thread_id -> %d ok !\n",thread_id); } } close(sockfd); pthread_exit(NULL); return 0; }