客户端运行起来。先输入zhuce或者denglu 回车结束。
输入账号密码的时候回车结束。
实现的功能:
注册、登录账号;
注册之后可以直接查找。
登录时账号密码不对会直接退出。并关闭服务器端。
账号和密码保存在数据库中。
输入存在的单词,会返回该单词的意思。
输入不存在的单词,会报错。
将单词插入数据库中:
/*************************************************************************
> File Name: c.c
> Author:
> Mail:
> Created Time: Mon 15 Jun 2015 03:27:27 AM PDT
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sqlite3.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc,const char * argv[])
{
FILE *fp1;
int i =0;
int num = 0;
char *p,*s,*y;
char *errmsg;
char sql[256];
char buff2[1024];
sqlite3 *db =NULL;
if(sqlite3_open("db.db",&db)!=sqlITE_OK)
{
sqlite3_errmsg(db);
exit(EXIT_FAILURE);
}
sqlite3_exec(db,"create table dir (ID INTEGER,WORD TEXT,MEANING TEXT)",NULL,&errmsg);
fp1 = fopen("dict.txt","r");
while(1)
{
fgets(buff2,1024,fp1);
p = buff2;
s = buff2;
y = buff2;
num = 0;
while(1)
{
while(*p!='\x20')
{
p++;
y++;
}
if(*p == '\x20')
{
*p = '\0';
}
p = p+1;
num = num +1;
y = y+1;
while(*p =='\x20')
{
p++;
y++;
num++;
}
while(*p!='\n')
{
p++;
num++;
}
if(*p == '\n')
{
*p = '\0';
}
p = p+1;
num = num+1;
i++;
printf("di%dci charu\n",i);
//printf("s:%s,y:%s",s,y);
sprintf(sql,"insert into dir values(%d,\"%s\",\"%s\") ",i,y);
sqlite3_exec(db,sql,&errmsg);
break;
}
}
}
服务器端程序:
/*************************************************************************
> File Name: server.c
> Author:
> Mail:
> Created Time: Mon 15 Jun 2015 03:59:26 AM PDT
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netinet/ip.h>
#include<sqlite3.h>
int callback(void * h,int f_num,char **f_val,char **f_name);
int main(int argc,const char *argv[])
{
int listenfd = socket(PF_INET,SOCK_STREAM,0);
if(listenfd == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}
int connfd;
char *p,*z,*m;
void *h;
char *errmsg;
sqlite3 *db ;
char sql[256];
char buff[1024];
char buff1[1024];
char buff2[1024];
char buffer[1024];
char buffer2[1024];
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = PF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int on = 1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))==-1)
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
{
perror("bind");
exit(EXIT_FAILURE);
}
printf("bind success!\n");
listen(listenfd,8);
printf("listening...\n");
fd_set readfds,tmpfds;
FD_ZERO(&readfds);
FD_SET(0,&readfds);
FD_SET(listenfd,&readfds);
int maxfd = listenfd;
while(1)
{
tmpfds = readfds;
//struct timeval tv ={2,0};
int ret = select((maxfd+1),&tmpfds,NULL);
if(ret == -1)
{
perror("select");
exit(EXIT_FAILURE);
}
else if(ret = 0)
{
;
}
else
{
int i;
for(i = 0;i<=maxfd;i++)
{
if(FD_ISSET(i,&tmpfds))
{
if(i==STDIN_FILENO)
{
fgets(buff,sizeof(buff),stdin);
if(strncmp(buff,"quit",4)==0)
{
exit(0);
}
printf("shuru:%s\n",buff);
}
else if(i==listenfd)
{
connfd = accept(listenfd,NULL);
FD_SET(connfd,&readfds);
maxfd = maxfd>connfd?maxfd:connfd;
}
else
{
int recvbytes = 0;
recvbytes = recv(i,buff,0);
if(recvbytes == -1)
{
perror("recv");
close(i);
FD_CLR(i,&readfds);
}
if(recvbytes == 0)
{
printf("client[%d] shutdown\n",i);
close(i);
FD_CLR(i,&readfds);
}
printf("client:%s\n",buff);
if(strncmp(buff,"zhuce",5)==0)
{
recv(i,0);
if(sqlite3_open("db.db",&db)!=sqlITE_OK)
{
sqlite3_errmsg(db);
exit(EXIT_FAILURE);
}
sqlite3_exec(db,"create table name (NAME TEXT,MIMA TEXT)",&errmsg);
p = buff;
z = buff;
m = buff;
while(1)
{
while(*p!='\n')
{
p++;
m++;
}
if(*p == '\n')
{
*p = '\0';
}
p = p+1;
m = m+1;
while(*p!='\n')
{
p++;
}
if(*p == '\n')
{
*p ='\0';
}
sprintf(sql,"insert into name values(\"%s\",\"%s\")",z,m);
printf("sql:%s\n",sql);
//break;
if(sqlite3_exec(db,&errmsg)!=sqlITE_OK)
{
printf("insert error:%s\n",errmsg);
exit(EXIT_FAILURE);
}
break;
}
while(1)
{
if(recv(i,buff1,sizeof(buff1),0)==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
buff1[strlen(buff1)-1]='\0';
if(strncmp(buff1,4)==0)
{
send(i,0);
exit(0);
}
sprintf(sql,"select * from dir where WORD = \"%s\" ",buff1);
h = buff2;
strcpy(buff2,"bucunzai");
if(sqlite3_exec(db,callback,(void *)h,&errmsg) != sqlITE_OK)
{
printf("select error :%s\n",errmsg);
exit(EXIT_FAILURE);
}
//printf("xxxx:%s\n",buff2);
if(send(i,buff2,sizeof(buff2),0)==-1)
{
perror("send");
exit(EXIT_FAILURE);
}
//bzero(buff2,sizeof(buff2));
}
}
//if(strncmp(buff))
if(strncmp(buff,"denglu",6)==0)
{
recv(i,&db)!=sqlITE_OK)
{
sqlite3_errmsg(db);
exit(EXIT_FAILURE);
}
//sqlite3_exec(db,"select * from name where name = \"%s\" and mima = \"%s\"",sql);
h = buff2;
strcpy(buff2,&errmsg)!=sqlITE_OK)
{
printf("insert error:%s\n",errmsg);
printf("zhaobudaozhegeren\n");
exit(EXIT_FAILURE);
}
printf("zhanghao:%s\n",buff2);
if(strncmp(buff2,"bucunzai",8)==0)
{
strcpy(buffer2,"quit");
send(i,buffer2,sizeof(buffer2),0);
exit(0) ;
}
else if(strncmp(buff2,8)!=0)
{
while(1)
{
if(recv(i,0)==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
buff1[strlen(buff1)-1]='\0';
if(strncmp(buff1,4)==0)
{
send(i,0);
exit(0);
}
sprintf(sql,buff1);
h = buff2;
if(sqlite3_exec(db,&errmsg) != sqlITE_OK)
{
printf("select error :%s\n",errmsg);
exit(EXIT_FAILURE);
}
//printf("xxxx:%s\n",buff2);
if(send(i,0)==-1)
{
perror("send");
exit(EXIT_FAILURE);
}
}
}
break;
}
}
}
}
}
}
}
}
int callback(void *h,char **f_name)
{
printf("f_num = %d\n",f_num);
int j = 0;
for(j = 0;j<f_num;j++)
{
printf("%s:%s\n",f_name[j],f_val[j]);
sprintf(h,"%s:%s\n",f_val[j]);
}
//printf("%s:%s\n",f_name[f_num],f_val[f_num]);
return 0;
}
客户端程序:
/************************************************************************* > File Name: client.c > Author: > Mail: > Created Time: Mon 15 Jun 2015 04:24:26 AM PDT ************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<arpa/inet.h> #include<sqlite3.h> int main(int argc,const char *argv[]) { int clientfd; char buff[1024]; char buff1[1024]; char buff2[1024]; char buff3[1024]; pid_t pid; clientfd = socket(PF_INET,0); if(clientfd == -1) { exit(EXIT_FAILURE); } struct sockaddr_in servaddr; servaddr.sin_family = PF_INET; servaddr.sin_port = htons(8888); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); if(connect(clientfd,(struct sockaddr *)&servaddr,sizeof(servaddr))==-1) { perror("connect"); exit(EXIT_FAILURE); } printf("connected..\n"); printf("-----zhuce / denglu-----\n"); if((pid = fork())==-1) { perror("fork"); exit(EXIT_FAILURE); } else if(pid == 0) { while(1) { fgets(buff,stdin); if(send(clientfd,0)==-1) { perror("send"); exit(EXIT_FAILURE); } //printf("buff:%s\n",buff); if(strncmp(buff,5)==0) { printf("****zhanghao****Enter****\n"); fgets(buff1,stdin); printf("******mima******Enter****\n"); fgets(buff2,stdin); strcat(buff1,buff2); if(send(clientfd,0)==-1) { perror("send"); exit(EXIT_FAILURE); } printf("***input words**quit->tuichu***\n"); //printf("quit tuichu \n"); while(1) { fgets(buff3,sizeof(buff3),stdin); if(send(clientfd,buff3,0)== -1) { perror("send"); exit(EXIT_FAILURE); } if(strncmp(buff3,4)==0) { //raise(SIGSTOP); printf("child process exit\n"); exit(0); } sleep(1); printf("***input words**quit->tuichu***\n"); } } if(strncmp(buff,6)==0) { printf("****zhanghao****Enter****\n"); fgets(buff1,0)==-1) { perror("send"); exit(EXIT_FAILURE); } } } } else { while(1) { if(recv(clientfd,0)==-1) { perror("recv"); exit(EXIT_FAILURE); } if(strncmp(buff,4)==0) { exit(0); } printf("%s\n",buff); } } return 0; }