目录
一、在线词典项目介绍及框架搭建
一、有道词典流程分析及本项目在线词典介绍
1、有道词典功能分析
2、项目流程
二、 在线词典项目演示
三、流程示意图分析
1、客户端
2、服务器
四、客户端代码框架搭建
五、服务器端代码框架搭建
模板结构代码
创建数据库
演示查看是否正常
5.1:注册模块
5.2:登录模块
5.3.查询模块
5.4 历史记录查询模块
作业
第一题:
第二题: 我不会
编译错误处理: warning: implicit declaration of function ‘close’ [-Wimplicit-function-declaration]
原来linux下面open和close是来源于不同的头文件:include <fcntl.h> // for open
include <unistd.h> // for close
网络信息结构体:
模板结构代码:
client.c:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close#define N 32#define R 1 //user - register
#define L 2 //user - login
#define Q 3 //user - query
#define H 4 //user - history//定义通信双方的结构体
typedef struct {int type;char name[N];char data[256];
}MSG;int do_register(int sockfd, MSG *msg)
{printf("register ...n");return 1;
}int do_login(int sockfd, MSG *msg)
{printf("login ...n");return 1;
}int do_query(int sockfd, MSG *msg)
{printf("login ...n");return 1;
}int do_history(int sockfd, MSG *msg)
{printf("login ...n");return 0;
}// ./server 192.168.***.*** 10000(端口号) 分别是argv[0],argv[1],argv[2]
int main(int argc, const char *argv[])
{int sockfd;struct sockaddr_in serveraddr;//网络信息结构体int n;MSG msg;if(argc != 3){printf("Usage:%s serverip port.n",argv[0]);//没有传IP和端口号,argv[0]表示从main函数将相应的参数接下来return -1;}//创建套接字if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)//等于-1说明失败{perror("fail to socket.n");return -1;}bzero(&serveraddr, sizeof(serveraddr));//清空结构体serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//将ip地址转换为二进制serveraddr.sin_port = htons(atoi(argv[2]));//将本机数据转换为网络数据,atoi功能将字符串转换为整数//连接服务器if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){perror("fail to connect");return -1;}//一级菜单while(1){printf("***************************************************n");printf("* 1.register 2.login 3.quit *n");printf("***************************************************n");printf("please choose:");scanf("%d",&n);getchar();switch(n){case 1:do_register(sockfd, &msg);break;case 2:if(do_login(sockfd, &msg) == 1){goto next;}break;case 3:close(sockfd);exit(0);break;default:printf("Invalid data cmd.n");}}//二级菜单
next:while(1){printf("*****************************************************n");printf("* 1.query_word 2.history_record 3.quit *n");printf("*****************************************************n");printf("Please choose:");scanf("%d", &n);getchar();switch(n){case 1:do_query(sockfd, &msg);break;case 2:do_history(sockfd, &msg);break;case 3:close(sockfd);exit(0);break;default :printf("Invalid data cmd.n");}}return 0;
}
server.c:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include<sqlite3.h>
#include<signal.h>#define N 32#define R 1 //user - register
#define L 2 //user - login
#define Q 3 //user - query
#define H 4 //user - history#define DATABASE "my.db"//定义通信双方的结构体
typedef struct {int type;char name[N];char data[256];
}MSG;int do_client(int acceptfd,sqlite3 *db);void do_register(int sockfd, MSG *msg,sqlite3 *db);int do_login(int sockfd, MSG *msg,sqlite3 *db);int do_query(int sockfd, MSG *msg,sqlite3 *db);int do_history(int sockfd, MSG *msg,sqlite3 *db);// ./server 192.168.***.*** 10000(端口号) 分别是argv[0],argv[1],argv[2]
int main(int argc, const char *argv[])
{int sockfd;struct sockaddr_in serveraddr;//网络信息结构体int n;MSG msg;sqlite3 *db;int acceptfd;pid_t pid;if(argc != 3){printf("Usage:%s serverip port.n",argv[0]);//没有传IP和端口号,argv[0]表示从main函数将相应的参数接下来return -1;}//打开数据库if(sqlite3_open(DATABASE,&db) != SQLITE_OK){printf("%sn",sqlite3_errmsg(db));return -1;}else{printf("open DATABASE successn");}//创建套接字if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)//等于-1说明失败{perror("fail to socket.n");return -1;}bzero(&serveraddr, sizeof(serveraddr));//清空结构体serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//将ip地址转换为二进制serveraddr.sin_port = htons(atoi(argv[2]));//将本机数据转换为网络数据,atoi功能将字符串转换为整数//绑定(建立套接字与地址联系)if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){perror("fail to bind");return -1;}//将套接字设为监听模式if(listen(sockfd,5) < 0)//监听个数5{printf("fail to listen");return -1;}//处理僵尸进程signal(SIGCHLD,SIG_IGN);while(1){if((acceptfd = accept(sockfd,NULL,NULL)) < 0){perror("fail to accept");return -1;}//如果成功了,应创建父子进程,父进程永远接收客户端请求,子进程处理请求的具体内容if((pid = fork()) < 0){perror("fail to fork");return -1;}else if(pid == 0){//处理客户端具体的消息(子进程)close(sockfd);//监听套接字不用了,关闭do_client(acceptfd,db);}else{//接收客户端的请求(父进程)close(acceptfd);//接收套接字不用了,关闭}}return 0;
}int do_client(int acceptfd,sqlite3 *db)
{MSG msg;while(recv(acceptfd,&msg,sizeof(msg),0) > 0)//接收成功{printf("type:%dn", pe);pe){case R:do_register(acceptfd, &msg, db);break;case L:do_login(acceptfd, &msg, db);break;case Q:do_query(acceptfd, &msg, db);break;case H:do_history(acceptfd, &msg, db);break;default:printf("Invalid data msg.n");}}printf("client exit.n");//客户端退出就会跳出while循环close(acceptfd);exit(0);return 0;}void do_register(int sockfd, MSG *msg, sqlite3 *db)
{printf("register ...n");
}int do_login(int sockfd, MSG *msg, sqlite3 *db)
{printf("login ...n");return 1;
}int do_query(int sockfd, MSG *msg, sqlite3 *db)
{printf("login ...n");return 1;
}int do_history(int sockfd, MSG *msg, sqlite3 *db)
{printf("login ...n");return 0;
}
create table usr(name text primary key,pass text); //创建用户表
create table record(name text,date text,word text); // 创建记录表
ps axj 查看有无僵尸进程
没有僵尸进程
client.c:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close#define N 32#define R 1 //user - regis
本文发布于:2024-01-31 06:57:20,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170665544226440.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |