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