电子词典:
-
登录注册功能,不能重复登录,重复注册
-
单词查询功能
-
历史记录功能,存储单词,意思,以及查询时间
-
基于TCP,支持多客户端连接
-
采用数据库保存用户信息与历史记录
-
将dict.txt的数据导入到数据库中保存。
服务器代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <fcntl.h>
#include <signal.h>
#include<sys/stat.h>
#include <sys/wait.h>
#define ERR_MSG(msg) do{\
fprintf(stderr, "__%d__:", __LINE__);\
perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.0.177"
typedef void (*sighandler_t)(int);
typedef struct
{
int type;
char name[20];
char data[256];
}MSG[30];
int n=0;
int fp;
int newfd;
sqlite3*db;
char *errmsg;
int rcv_cli_msg(int newfd, struct sockaddr_in cin);
int do_load();
int do_select(char *words);
void handler(int sig)
{
while(waitpid(-1,NULL,WNOHANG)>0);
}
int main(int argc, const char *argv[])
{
sighandler_t s=signal(SIGCHLD, handler);
if(SIG_ERR==s)
{
ERR_MSG("signal");
return -1;
}
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("快速重用成功\n");
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
sin.sin_addr.s_addr=inet_addr(IP);
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin))<0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success\n");
if(listen(sfd,10)<0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
if(access("./dict.db",F_OK)<0)
{
do_load();
}
else
{
if(unlink("./dict.db")==0)
{
do_load();
}
}
pid_t pid;
MSG msg;