网络字典服务器端

基于TCP的在线词典客户端与服务器端 用QT编写的tcp通信的在线词典,客户端有注册登录模块,查找模块,历史记录模块;服务器端有注册登录(基于数据库查询和插入)模块,单词库搜索模块,还做了应对多用户同时访问的并发处理框架 立即下载

#include <stdio.h>

#include <sys/wait.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sqlite3.h>

#include <signal.h>

#include <time.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

 

#define  N  256

#define  R  1   //  user register

#define  L  2   //  user login

#define  Q  3   //  query word

#define  H  4   //  history record

 

#define DATABASE "my.db"

 

typedef struct sockaddr SA;

 

typedef struct

{

    int type;

    char name[N];

    char data[N];   // password or word

} MSG;

 

void handler(int signo)

{

    int a;

    pid_t pid;

    while ((pid = waitpid(-1, &a, WNOHANG)) > 0)

        printf("child %d terminate:%#x\n", pid, a);

}

 

void do_register(int connfd, MSG *pbuf, sqlite3 *db)

{

    char sqlstr[N];

    char *errmsg;

   

    sprintf(sqlstr, "insert into usr values ('%s', '%s')", pbuf->name, pbuf->data);

    printf("%s\n", sqlstr);

 

    bzero(pbuf->data, sizeof(pbuf->data));

    if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != SQLITE_OK)

    {

        sqlite3_free(errmsg);

        sprintf(pbuf->data, "user %s already exist!!!", pbuf->name);

    }

    else

        strcpy(pbuf->data, "OK");

    send(connfd, pbuf, sizeof(MSG), 0);

}

 

 

void do_login(int connfd, MSG *pbuf, sqlite3 *db)

{

    char sqlstr[N];

    char *errmsg, **result;

    int nrow, ncolumn;

   

    sprintf(sqlstr, "select * from usr where name = '%s' and pass = '%s'", pbuf->name, pbuf->data);

    if (sqlite3_get_table(db, sqlstr, &result, &nrow, &ncolumn, &errmsg) != SQLITE_OK)

    {

        printf("error : %s\n", errmsg);

        sqlite3_free(errmsg);

    }

       

    bzero(pbuf->data, sizeof(pbuf->data));

    if (nrow == 0)

        strcpy(pbuf->data, "name or password is wrong!!!");

    else

        strcpy(pbuf->data, "OK");

 

    send(connfd, pbuf, sizeof(MSG), 0);

 

    sqlite3_free_table(result);

}

 

void get_date(char date[])

{

    time_t t;

    struct tm *tp;

 

    time(&t);

   

    tp = localtime(&t);

    /*

    sprintf(date, "%d-%02d-%02d %02d:%02d:%02d", tp->tm_year+1900,

            tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);

    */

    strftime(date, 64, "%Y-%m-%d %H:%M:%S", tp);

 

    return;

}

 

int do_searchword(int connfd, MSG *pbuf)

{

    FILE *fp;

    char line[300]={0};

    char *p;

    int len, result;

        

    /***************pbuf->data 传入单词*****************/

    len = strlen(pbuf->data);//pbuf->data --- about

    if ((fp = fopen("dict.txt", "r")) == NULL)

        return -1;

 

    printf("query word is %s\n", pbuf->data);

    /***************fgets 函数读到\n结束 **********************/

    while (fgets(line, 300, fp) != NULL)

    {

       /****************和单词比较******************/

        result = strncmp(pbuf->data, line, len);

        if (result > 0) continue;

             

        if (result < 0 || line[len] != ' ') break;

                       

        p = line + len;

        /*******取单词解释段*************/

        while (*p == ' ') p++;

        strcpy(pbuf->data, p);

        fclose(fp);

        return 1;

    }

    fclose(fp);

 

    return 0;

}

 

void do_query(int connfd, MSG *pbuf, sqlite3 *db)

{

    char sqlstr[128], *errmsg;

    int found = 0;

    char date[64]={0}, word[64] = {0};

           

    strcpy(word, pbuf->data);

    found = do_searchword(connfd, pbuf);

 

    if (found == -1)

        strcpy(pbuf->data, "server error\n");

    else if ( found )

    {

        get_date(date);

        sprintf(sqlstr, "insert into record values ('%s', '%s', '%s')", pbuf->name, date, word);

        if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != SQLITE_OK)

        {

            printf("error : %s\n", errmsg);

            sqlite3_free(errmsg);

        }

    }

    else

        strcpy(pbuf->data, "not found\n");

    send(connfd, pbuf, sizeof(MSG), 0);

}

 

 

int history_callback(void *arg, int f_num, char **f_value, char **f_name)

{

    int connfd;

    MSG buf;

 

    connfd = *(int *)arg;

    sprintf(buf.data, "%s : %s", f_value[1], f_value[2]);

    send(connfd, &buf, sizeof(buf), 0);

 

    return 0;

}

 

void do_history(int connfd, MSG *pbuf, sqlite3 *db)

{

    char sqlstr[128], *errmsg;

 

    sprintf(sqlstr, "select * from record where name = '%s'", pbuf->name);

    if (sqlite3_exec(db, sqlstr, history_callback, (void *)&connfd, &errmsg) != SQLITE_OK)

    {

        printf("error : %s\n", errmsg);

        sqlite3_free(errmsg);

    }

    pbuf->data[0] = '\0';

    send(connfd, pbuf, sizeof(MSG), 0);

   

    return;

}

 

int main(int argc, char *argv[])

{

    int listenfd, connfd;

    struct sockaddr_in myaddr;

    pid_t pid;

    MSG buf;

    sqlite3 *db;

 

    if (argc < 3)

    {

        printf("Usage : %s <ip> <port>\n", argv[0]);

        exit(-1);

    }

 

    if (sqlite3_open(DATABASE, &db) != SQLITE_OK)

    {

        printf("error : %s\n", sqlite3_errmsg(db));

        exit(-1);

    }

 

    if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

    {

        perror("fail to socket");

        exit(-1);

    }

 

    bzero(&myaddr, sizeof(myaddr));

    myaddr.sin_family = PF_INET;

    myaddr.sin_port = htons(atoi(argv[2]));

    myaddr.sin_addr.s_addr = inet_addr(argv[1]);

    if (bind(listenfd, (SA *)&myaddr, sizeof(myaddr)) < 0)

    {

        perror("fail to bind");

        exit(-1);

    }

 

    if (listen(listenfd, 5) < 0)

    {

        perror("fail to listen");

        exit(-1);

    }

 

    signal(SIGCHLD, handler);

    while ( 1 )

    {

        if ((connfd = accept(listenfd, NULL, NULL)) < 0)

        {

            perror("fail to accept");

            exit(-1);

        }

        if ((pid = fork()) < 0)

        {

            perror("fail to fork");

            exit(-1);

        }

        else if (pid == 0)

        {

            close(listenfd);

            while (recv(connfd, &buf, sizeof(buf), 0) > 0)  // receive request

        {

                switch ( buf.type )

             {

                    case R :

                      do_register(connfd, &buf, db);

                      break;

                    case L :

                      do_login(connfd, &buf, db);

                      break;

                  case Q :

                        do_query(connfd, &buf, db);

                      break;

                  case H :

                        do_history(connfd, &buf, db);

                      break;

                }

            }

            printf("client quit\n");

            close(connfd);

            exit(0);

        }

        close(connfd);

    }

 

    exit(0);

}

服务器爆破字典 辛苦珍藏字典,用来爆破服务器的,很实用哦!! 立即下载

相关推荐

服务器获取字典值并展示在界面

服务器获取字典值作为下拉框数据源展示到界面

Qxnedy的博客 585

MIS系统中数据字典的两种解决方案

在信息系统中,很多的信息都是有标准化,所谓标准就是实现定义的一些规范,根据这个规范可以在多个实体之间进行数据的共享,以避免沟通中的歧异问题。数据字典就是标准化中的一个重要组成部分。关于数据字典的定义,版本有很多,在不同的场合中可能有不同的含义,这里特指的是:一个属性可能具有的几个值。比如:性别的字典为男、女等等,主要用来进行数据归类(统计)。数据字典的解决方案有很多种,这里仅讨论其中两

smilingleo的专栏 3375

网络编程-----在线词典项目(服务器

服务器端 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #incl

hsjdjhdijdsj的博客 615

Linux网络编程之六 --在线英英字典的实现

综合项目:在线英英字典   服务器端 head.h:   server.c   do_client.c   Makefile       客户端 head.h

drinkingcode 4688

Unity多路复用服务器端(Select)

网络游戏中,多路复用的方式是最常见的服务器端解决方案,程序结构如图: 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; //保存客户端信息的类 class ClientState { public Sock.

土豪gold的博客 1296

【Linux网络编程】网络编程套接字一

本篇博客首先对IP地址、端口号、 TCP协议、UDP协议、网络字节序等网络编程中的基本概念的学习,其中着重介绍了端口号,一台主机有很多进程,如何知道从一台主机的某一进程发送的消息就是给另一台主机对应的进程的? 知道了网络通信的本质就是进程间的通信!以及为什么要有端口号?然后学习socket api的基本用法,能够实现一个简单的udp客户端/服务器,并且对udpp客户端和服务端做了三个设计,最后实现windows客户端和linux服务端之间的交汇。

fight_p的博客 2085

IO多路复用实现在字典文件中查询单词

IO多路复用实现在字典文件中查询单词

CSDN_LVJT的博客 309

【LINUX网络网络socet接口的基本使用以及实现简易UDP通信

手把手带着0基础网络编程小白写一个UDP协议demo,实现本地和网络通信,进入网络编程世界,快速学习网络编程。

2301_79501467的博客 894

JavaEE-网络编程-客户端服务器

本文主要讲解了服务器与客户端的实现

Gremmie的博客 2493

网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

程序员良辰 767

2024年网安最新python知识点总结(九)(1)

如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。Python 字典 setdefault() 方法和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。新的字典为 : {‘age’: None, ‘name’: None, ‘sex’: None}新的字典为 : {‘age’: 10, ‘name’: 10, ‘sex’: 10}d = {“a”: 1, “b”: 2}变为{“A”:1,“B”:2}

2401_84301227的博客 448

网络电子词典

【代码】网络电子词典。

AI3090的博客 162

C#socket通信(服务器端与客户端实现简单的聊天室通信)

知识基础: 1.按网络覆盖范围,计算机网络可分类为广域网、城域网、局域网和Internet。 2.在TCP/IP网络中测试连通性的常用命令是Ping 命令,ipconfig。 3.Internet的核心协议是TCP/IP 。 4.IP地址127.0.0.1是一个测试地址。 5.Internet的前身是Arpanet 。 6.在企业内部网与外部网之间,用来检查网络请求分组是否合法,保护网络资源不被非...

qq_43551373的博客 1638

练习:在线英英词典

值得学习的内容: 1.网络通信TCP编程 2.多进程并发服务器 3.sqlite3轻量级数据库 4.IO多路复用编程,使用epoll族 client.c #include "MYHEAD.h" #define BACKLOG 5 //允许同时请求的客户端个数 #define PORT 5001 //端口号 #define TRANS 4 //单词解释 #defin...

Jan___的博客 528

ORACLE DBA 雜談

db oracle dba 已有 1731 次阅读 2009-3-3 22:32 |系统分类:数据库 ORACLE中客户端连接服务器端常见问题与解决 http://www.javaeye.com/topic/67440要排除客户端与服务器端的连接问题,首先检查客户端配置是否正确(客户端配置必须与数据库服务器端监听配置一致),再根据错误提示解决。下面列出几种常见的连...

weixin_30376163的博客 182

JSON序列化

// //  ViewController.m //  09-JSON序列化 // //  Created by Apple on 15/10/23. //  Copyright © 2015年 heima. All rights reserved. // #import "ViewController.h" #import "HMVid

paulsi的博客 328

网络编程(二)

网络编程(二) >>>思维导图>>>中二青年 基于TCP协议的Socket套接字 server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',8898)) # 把地址绑定到套接字 sk.listen() # 监听链接 conn,addr ...

weixin_30859423的博客 103
上一篇: 网络字典客户端
下一篇: ARM_NOR_NAND_启动
linuxarmsummary
博客等级 码龄14年 1541粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值