server
main函数
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include <pthread.h>
#include"create_server.h"
#include"login.h"
#include"search.h"
int server_init(char *,unsigned short,int);
int login(int,fd_set);
int search(int);
void *thread_link(void *arg)
{
int ret=0;
int rws=*(int *)arg;
ret=login(rws);
if(ret==-1)
{
close(rws);
return NULL;
} //error
else if(ret==1)
{
close(rws);
return NULL;
} //login quit
else if(ret==0)
{
ret=search(rws);
if(ret==-1)
{
printf("search");
close(rws);
return NULL;
}
} //login success
close(rws);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
int sockfd,ret;
sockfd=server_init("192.168.2.41",7878,1024);
if(sockfd==-1)
{
printf("server_init error\n");
return -1;
}
printf("server create success\n");
int i;
//等待连接
#define SIZE 1024
char recvbuf[SIZE]={0},sendbuf[SIZE]={0};
while(1)
{
struct sockaddr_in caddr;
bzero(&caddr,sizeof(caddr));
socklen_t clen=sizeof(caddr);
int rws=accept(sockfd,(struct sockaddr *)&caddr,&clen);
if(rws==-1)
{
perror("accept");
close(sockfd);
return -1;
}
printf("some usr join in success\n");
strcpy(sendbuf,"注册/登录/退出输入:0/1/quit");
ret=send(rws,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(rws);
break;
} //主线程接受连接
pthread_t tid;
if(0 != pthread_create(&tid,NULL,thread_link,(void *)&rws))
{
perror("pthread_create");
break;
} //创建子线程处理客户端请求
pthread_detach(tid);
}
close(sockfd);
return 0;
}
create_server函数
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include"create_server.h"
int server_init(char *ipaddr,unsigned short port,int backlog)
{
int ret,sockfd;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket");
return -1;
} //创建网络套接字
struct sockaddr_in saddr;
bzero(&saddr,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=(ipaddr==NULL)?htonl(INADDR_ANY):inet_addr(ipaddr);
socklen_t slen=sizeof(saddr);
ret=bind(sockfd,(struct sockaddr *)&saddr,slen);//绑定
if(ret==-1)
{
perror("bind");
close(sockfd);
return -1;
}
ret=listen(sockfd,backlog); //监听
if(ret==-1)
{
perror("listen");
close(sockfd);
return -1;
}
return sockfd;
}
login 函数
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"login.h"
#include"search.h"
int login(int i)
{
#define SIZE 1024
int ret,flag,flag1,flag2,flag3,falg4,flag5,flag6,len;
sqlite3 *db=NULL;
ret = sqlite3_open("server.usr",&db);
if(ret!=SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
char *errmsg = NULL;
char **resultp;
int nrow;
int ncolumn;
ret = sqlite3_get_table(db,"create table usr (name char [10],passwd char [10]);",&resultp,&nrow,&ncolumn,&errmsg);
if(ret==-1)
{
printf("sqlite3_get_table error\n");
return -1;
} //建好用户信息表
char recvbuf[SIZE]={0},sendbuf[SIZE]={0},namebuf[SIZE]={0},passwdbuf[SIZE]={0},buf[10]={0};
flag5:
bzero(recvbuf,SIZE);
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(recvbuf[0]=='0')//注册
{
flag6:
bzero(sendbuf,SIZE);
strcpy(sendbuf,"请输入你的账号id 4~10个字符");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
bzero(recvbuf,SIZE);
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
len=strlen(recvbuf);
if(len<4||len>10)
{
strcpy(sendbuf,"id长度不合适,请重新输入id");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag6;
}
else
{
strcpy(buf,recvbuf);
sprintf(sendbuf,"select * from usr where name=\"%s\";",buf);
if(SQLITE_OK!=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg))
{
printf("sqlite3_get_table:%s\n",errmsg);
close(i);
sqlite3_close(db);
return -1;
}
if(nrow>0)
{
strcpy(sendbuf,"id 重复 请重新注册!");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag6;
}
else
{
if(strcmp(recvbuf,"quit")==0)//usr want to quit really?
{
flag :
strcpy(sendbuf," 你的账号是:’quit‘,还是你想要退出?扣0/1");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(recvbuf[0]=='1')
{
close(i);
return 1;
}
else if(recvbuf[0]=='0')
{
strcpy(namebuf,"quit");
}
else
{
strcpy(sendbuf,"无效字符,重新输入");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag;
}
}
else
{
strcpy(namebuf,recvbuf);
}
flag7:
strcpy(sendbuf,"现在你可以设置你的密码,4~10个字符 !");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
len=strlen(recvbuf);
if(len<4||len>10)
{
strcpy(sendbuf,"密码长度不合适,请重新输入密码");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag7;
}
else
{
if(strcmp(recvbuf,"quit")==0)//判断用户密码是quit 还是想退出
{
flag1:
strcpy(sendbuf,"你的密码是‘quit’,还是你想要退出?扣0/1");
ret=send(i,sendbuf,SIZE,0);\
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(recvbuf[0]=='1')//退出
{
close(i);
return 1;
}
else if(recvbuf[0]=='0')//密码四位是quit
{
strcpy(passwdbuf,"quit");
}
else
{
strcpy(sendbuf,"无效字符,重新输入:0/1\n");//没有输入0/1
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag1;
}
}
else
{
strcpy(passwdbuf,recvbuf);
}
//到此用户账号与密码保存在namebuf/passwdbuf中
strcpy(recvbuf,"insert into usr values (\"");
strcat(recvbuf,namebuf);
strcpy(sendbuf,"\",\"");
strcat(recvbuf,sendbuf);
strcat(recvbuf,passwdbuf);
strcpy(sendbuf,"\");");
strcat(recvbuf,sendbuf);
if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg))
{
printf("sqlite_get_table:%s\n",errmsg);
close(i);
sqlite3_close(db);
return -1;
} //注册成功
strcpy(sendbuf,"恭喜你,注册成功!你的账号信息如下 :");
strcpy(his[i].name,namebuf);
strcpy(his[i].pass,passwdbuf);
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=send(i,namebuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=send(i,passwdbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}//将信息发给客户端进行确认注册成功;
}
}
}
}
else if(recvbuf[0]=='1')//登陆
{
flag4 :
strcpy(sendbuf,"请输入你的账号:");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(strcmp(recvbuf,"quit")==0)
{
flag2 :
strcpy(sendbuf,"你的账号是‘quit’还是你想退出: 0/1");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(recvbuf[0]=='1')
{
close(i);
return 1;
}
else if(recvbuf[0]=='0')
{
strcpy(namebuf,"quit");
}
else
{
strcpy(sendbuf,"无效字符,重新输入:0/1");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag2;
}
}
else
{
strcpy(namebuf,recvbuf);
}
strcpy(sendbuf,"输入你的密码:");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(strcmp(recvbuf,"quit")==0)
{
flag3:
strcpy(sendbuf,"你的密码是‘quit’,还是你想退出:扣0/1");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
sqlite3_close(db);
return -1;
}
if(recvbuf[0]=='1')
{
close(i);
return 1;
}
else if(recvbuf[0]=='0')
{
strcpy(passwdbuf,"quit");
}
else
{
strcpy(sendbuf,"无效字符,重新输入:0/1");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag3;
}
}
else
{
strcpy(passwdbuf,recvbuf);
}//登陆信息存在namebuf/passwdbuf
strcpy(recvbuf,"select * from usr where name=\"");
strcat(recvbuf,namebuf);
strcpy(sendbuf,"\"and passwd =\"");
strcat(recvbuf,sendbuf);
strcat(recvbuf,passwdbuf);
strcpy(sendbuf,"\";");
strcat(recvbuf,sendbuf);
if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg))
{
printf("sqlite3_get_table:%s\n",errmsg);
close(i);
sqlite3_close(db);
return -1;
}
if(nrow<1)
{
strcpy(sendbuf,"账户信息有误,请重新输入");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag4;
}
strcpy(his[i].name,namebuf);
strcpy(his[i].pass,passwdbuf);
//log in success
}
else if(strcmp(recvbuf,"quit")==0)
{
close(i);
return 1;
}
else
{
strcpy(sendbuf,"请输入0/1来决定选项");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
sqlite3_close(db);
return -1;
}
goto flag5;
}
sqlite3_close(db);
return 0;
}
search函数
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>
#include<time.h>
#include"search.h"
#define SIZE 1024
int search(int i)
{
int ret,o,flag;
char recvbuf[SIZE]={0},sendbuf[SIZE]={0},rowbuf[SIZE]={0};
strcpy(sendbuf,"--------------登录成功----------------!");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(i);
return -1;
}
flag:
strcpy(sendbuf,"---------‘Q’退出---‘H‘历史------------");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
strcpy(sendbuf,"---------------英英词典---------------");
send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
while(1)
{
FILE *fp=fopen("dict.txt","r");
if(fp==NULL)
{
perror("fopen");
return -1;
}
ret=recv(i,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(i);
return -1;
}
if(strcmp(recvbuf,"Q")==0)
{
strcpy(sendbuf,"-----------BYE BYE !------------");
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
close(i);
return 1;
}
else if(strcmp(recvbuf,"H")==0)
{
strcpy(sendbuf,"-------------HISTORY-------------------");
sleep(1);
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
for(int j=0;j<5;j++)
{
sprintf(sendbuf,"TIME-----%s",his[i].time[j]);
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
sprintf(sendbuf,"WORD----%s",his[i].word[j]);
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
close(i);
return -1;
}
}
goto flag;
}
else
{
sqlite3 *db=NULL;
ret = sqlite3_open("server.usr",&db);
if(ret!=SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
char *errmsg = NULL;
char **resultp;
int nrow=0;
int ncolumn=0;
recvbuf[strlen(recvbuf)]='\0';
strcpy(sendbuf,"select * from dict where word=\"");
strcat(sendbuf,recvbuf);
strcat(sendbuf,"\";");
ret=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg);
if(ret!=SQLITE_OK)
{
printf("sqlite_get_table:%s\n",errmsg);
close(i);
sqlite3_close(db);
return -1;
}
if(nrow>0)
{
strcpy(sendbuf,resultp[3]);
time_t timep;
struct tm *t;
time(&timep);
t=localtime(&timep);
sprintf(rowbuf,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
strcpy(his[i].time[o],rowbuf);
strcpy(his[i].word[o],recvbuf);
o++;
if(o==4)
{
o=0;
}
}
else
{
strcpy(sendbuf,"--------------未找到!--------------");
}
sleep(1);
ret=send(i,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
return -1;
}
}
}
}
头文件.H
create_server.h
#ifndef CREATE_SERVER_H
#define CREATE_SERVER_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
int server_init(char *,unsigned short,int);
#endif
--------------------------------------------------------------
login.h
#ifndef LOGIN_H
#define LOGIN_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"search.h"
int login(int);
#endif
--------------------------------------------------------------
search.h
#ifndef SEARCH_H
#define SEARCH_H
#include"login.h"
typedef struct
{
char name[20];
char pass[20];
char time[5][20];
char word[5][20];
}history;
history his[1024];
int search(int);
#define SIZE 1024
#endif
makefile
server_app:create_server.o login.o search.o main.o
gcc create_server.o login.o search.o main.o -lsqlite3 -lpthread -o server_app
create_server.o:./create_server.c
gcc -c create_server.c -I ./ -o create_server.o
login.o: ./login.c
gcc -c login.c -I ./ -o login.o
search.o: ./search.c
gcc -c search.c -I ./ -o search.o
main.o: ./main.c
gcc -c main1.c -I ./ -o main.o
clean:
rm *.o
user
client函数
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>
int link_server(char *ipaddr,unsigned short port)
{
int ret,sockfd;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("socket");
return -1;
}
struct sockaddr_in saddr;
bzero(&saddr,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=inet_addr(ipaddr);
socklen_t slen=sizeof(saddr);
ret=connect(sockfd,(struct sockaddr*)&saddr,slen);
if(ret==-1)
{
perror("connect");
close(sockfd);
return -1;
}
return sockfd;
}
int main()
{
int ret,sockfd;
sockfd=link_server("192.168.2.41",7878);
if(sockfd==-1)
{
printf("server error\n");
return -1;
}
printf("-------------------------------------------\n");
printf("| ENG--ENG DIGTIONARY!!! |\n");
printf("| / \\ |\n");
printf("| || 广告位出租 || |\n");
printf("| \\ / |\n");
printf("| ----------WELCOME!-------- |\n");
printf("-------------------------------------------\n");
printf("------------------SCD----------------------\n");
fd_set rfds,fds;
FD_ZERO(&rfds);
FD_SET(0,&rfds);
FD_SET(sockfd,&rfds);
int nfds=sockfd+1;
#define SIZE 1024
char recvbuf[SIZE]={0},sendbuf[SIZE]={0};
while(1)
{
fds=rfds;
ret=select(nfds,&fds,NULL,NULL,NULL);
if(ret==-1)
{
perror("select");
close(sockfd);
return -1;
}
if(FD_ISSET(0,&fds))
{
fgets(sendbuf,SIZE,stdin);
sendbuf[strcspn(sendbuf,"\n")]='\0';
ret=send(sockfd,sendbuf,SIZE,0);
if(ret==-1)
{
perror("send");
close(sockfd);
}
}
if (FD_ISSET(sockfd,&fds))
{
bzero(recvbuf,SIZE);
ret=recv(sockfd,recvbuf,SIZE,0);
if(ret==-1)
{
perror("recv");
close(sockfd);
return -1;
}
if(ret==0)
{
break;
}
printf("%s\n",recvbuf);
}
}
return 0;
}
结果展示: