项目实战:在线词典(3)服务器框架

服务器程序流程:

*. 定义消息结构体:

输出参数:

  1. 打开数据库:

  1. 建立服务器端网络连接

一,TCP多进程连接:

  1. 建立套接字

  1. 填充自己的网络地址:

  1. 绑定

  1. 监听

  1. 连接(采用父子进程的方式,父进程连接,每连接一个,就创建子进程进行服务)

do_client()应为do_server(),写错了

  1. 实现服务器功能:

服务器框架代码实现:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include<strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<unistd.h>
#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"

//defines the information structure of both sides of the communication 
typedef struct{
    int type;
    char name[N];
    char data[256];

}MSG;

void do_register(int sockfd,MSG *mag,sqlite3 *db);
int do_login(int sockfd, MSG* mag,sqlite3 *db);
int do_query(int sockfd, MSG* mag,sqlite3 *db);
int do_history(int sockfd, MSG* mag,sqlite3 *db);
int do_server(int acceptfd,sqlite3 *db);


//do_register
void do_register(int sockfd,MSG *mag,sqlite3 *db)
{
    printf("register ...\n");
}


//do_login
int do_login(int sockfd, MSG* mag,sqlite3 *db)
{
    printf("login...\n");

    return 1;
}


//do_query
int do_query(int sockfd, MSG* mag,sqlite3 *db)
{
    printf("query...\n");

    return 1;
}


//do_history
int do_history(int sockfd, MSG* mag,sqlite3 *db)
{
    printf("finding history...\n");

    return 0;
}


//./server 192.168.3.196 10000
int main(int argc,const char* argv[])
{
    //Robustness
    if(argc !=3){
        printf("Usage:%s serverip port.\n",argv[0]);
        return -1;
    }

    //massage struct
    MSG msg;
    sqlite3 *db;
    int acceptfd;
    pid_t pid;


    //open sqlite
    if(sqlite3_open(DATABASE,&db)!=SQLITE_OK){
        printf("%s\n",sqlite3_errmsg(db));
        return -1;
    }
    else{
        printf("open DATABASE success.\n");
    }

    //socket
    int sockfd;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        perror("socket");
        exit(1);
    }

    //padding
    //bzero
    struct sockaddr_in serveraddr;
    bzero((void*)&serveraddr,sizeof(serveraddr));
    //fill
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
    serveraddr.sin_port=htons(atoi(argv[2]));


    //bind
    if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
        perror("bind");
        exit(1);
    }

    //listen
    if(listen(sockfd,5)<0){
        perror("listen");
        exit(1);
    }

    //handle die process
    signal(SIGCHLD,SIG_IGN);

    //accept
    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){
            //handle client
            close(sockfd);
            do_server(acceptfd,db);
        }
        else {
            close(acceptfd);
        }

    }

    return 0;
}


int do_server(int acceptfd,sqlite3 *db)
{
    MSG msg;
    while(recv(acceptfd,&msg,sizeof(msg),0)>0)
    {
        switch(msg.type){
            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");
        }
    }
    close(acceptfd);
    exit(0);

    return 0;
}

服务器数据库:

  • 数据库中数据存储的结构:

  • 1.用户信息和查询历史

  • 用两个表实现

  • 2.在线词典库

数据库的创建

在数据库中建立两个表:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值