华清远见电子词典

1.服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <sqlite3.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <unistd.h>
typedef struct //线程函数传参结构体
{
    int newfd;
    struct sockaddr_in addrinfo;
    sqlite3 *userdb;
    sqlite3 *dictdb;
} pth_parameters;
typedef struct //通信协议基本构成
{
    char opcode;
    char username[20];
    char txt[128];
} msg; 
int init_TCP_ser(int *sfd);
int init_BANK_word(sqlite3 **Dictionary);
int init_BANK_user(sqlite3 **User); 
void *callBack(void *arg); 
int Register(int newfd, msg info, sqlite3 *User);
int Login(int newfd, msg info, sqlite3 *User, char *username);
int Inquire(int newfd, msg info, sqlite3 *User, sqlite3 *Dictionary);
int History(int newfd, msg info, sqlite3 *User);
int Quit_user(int newfd, msg info, sqlite3 *User);
#define ERR_MSG(ms){ \
        fprintf(stderr, "Line: %d ", __LINE__); \
        perror(ms);                            \
    }
 
#define PORT 8888
#define IP "192.168.1.101"
int main(int argc, const char *argv[])
{
    int sfd;           
	sqlite3 *User;     
    sqlite3 *Dictionary; 
    init_BANK_word(&Dictionary); 
    init_BANK_user(&User);
    init_TCP_ser(&sfd);
    struct sockaddr_in cli; 
    socklen_t cliadrlen = sizeof(cli);
    while (1)
    {
        int newfd = accept(sfd, (struct sockaddr *)&cli, &cliadrlen);
        if (-1 == newfd)
        {
            ERR_MSG("accept");
            return -1;
        }
        printf("[%s:%d]客户端链接成功\n", (char *)inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));
        pthread_t tid;
		pth_parameters pth_into;
        pth_into.newfd = newfd;
        pth_into.addrinfo = cli;
        pth_into.userdb = User;
        pth_into.dictdb = Dictionary;
        int pt1 = pthread_create(&tid, NULL, callBack, &pth_into);
        if (0!=pt1)
        {
            ERR_MSG("pthread_create");
            return -1;
        }
        pthread_detach(tid);
    }
}
 
void *callBack(void *arg) //进程
{
    int newfd = (*(pth_parameters *)arg).newfd;
    struct sockaddr_in cli = (*(pth_parameters *)arg).addrinfo;
    sqlite3 *Dictionary = (*(pth_parameters *)arg).dictdb;
    sqlite3 *User = (*(pth_parameters *)arg).userdb;
    char username[20] = ""; 
    while (1)
    {
        msg recvmsg;
 
        ssize_t res_recv = recv(newfd, &recvmsg, sizeof(recvmsg), 0);
        if (0 == res_recv)
        {
            printf("[%s | %d]客户端断开链接\n", (char *)inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));
            char sql[512] = "";
            sprintf(sql, "update login set state=0 where username0 =\"%s\";", username);
            printf("%s\n", sql);
            char *errmsg = NULL;
            int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
            if (SQLITE_OK != sql_exec)
            {
                fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
                break;
            }
            close(newfd);
            break;
        }
        else if (-1 == res_recv)
        {
            ERR_MSG("recv");
            break;
        }
        switch (recvmsg.opcode)
        {
        case 'R': //注册
            Register(newfd, recvmsg, User);
            break;
        case 'L': //登录
            Login(newfd, recvmsg, User, username);
            break;
        case 'I': //查询单词
            Inquire(newfd, recvmsg, User, Dictionary);
            break;
        case 'H': //查询历史记录
            History(newfd, recvmsg, User);
            break;
        case 'Q': //用户命令退出
            Quit_user(newfd, recvmsg, User);
            break;
        default:
            break;
        }
    }
}
 
int History(int newfd, msg info, sqlite3 *User) //查历史
{
    char sql[512] = "";
    sprintf(sql, "select * from history where username0 = \"%s\";", info.username);
    printf("%s\n", sql);
    char **pres;    
    int row,colum;
    char *errmsg = NULL;
    int res = sqlite3_get_table(User, sql, &pres, &row, &colum, &errmsg);
    if (SQLITE_OK != res)
    {
        fprintf(stderr, "Line: %d sqlite3_get_table: %s\n", __LINE__, sqlite3_errmsg(User));
        return -1;
    }
    msg sendmsg; 
    if (0 != row)
    {
        printf("ROW=%d\n", row);
        printf("COLUM=%d\n", colum);
        sendmsg.opcode = 'S';
        int count = row;
        while (count >= 1)
        {
            bzero(sendmsg.txt, sizeof(sendmsg.txt));
            sprintf(sendmsg.txt, "%d%s %s %s %s", count, pres[(((count + 1) * colum) - 4)], pres[(((count + 1) * colum) - 3)], pres[(((count + 1) * colum) - 2)], pres[(((count + 1) * colum) - 1)]);
            printf("%s\n", sendmsg.txt);
            ssize_t res_send = send(newfd, &sendmsg, sizeof(sendmsg), 0);
            if (-1 == res_send)
            {
                ERR_MSG("send");
                return -1;
            }
            count--;
        }
    }
    else
    {
        sendmsg.opcode = 'E';
        ssize_t res_send = send(newfd, &sendmsg, sizeof(sendmsg), 0);
        if (-1 == res_send)
        {
            ERR_MSG("send");
            return -1;
        }
    }
 
    sqlite3_free_table(pres);
    return 0;
}
int Quit_user(int newfd, msg info, sqlite3 *User) //用户退出
{
	char sql[512] = "";
    sprintf(sql, "update login set state=0 where username0 =\"%s\";", info.username);
    printf("%s\n", sql);
    char *errmsg = NULL;
    int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
        return -1;
    }
}
int Inquire(int newfd, msg info, sqlite3 *User, sqlite3 *Dictionary) 
{
    char sql[512] = "";
    time_t Time; 
    Time = time(NULL);
    struct tm *ptr = localtime(&Time);
    bzero(sql, sizeof(sql));
    sprintf(sql, "select * from dictionary where word0 = \"%s\";", info.txt);
    printf("%s\n", sql);
    char **pres;    
    int row, colum; 
    char *errmsg = NULL;
    int res = sqlite3_get_table(Dictionary, sql, &pres, &row, &colum, &errmsg);
    if (SQLITE_OK != res)
    {
        fprintf(stderr, "Line: %d sqlite3_get_table: %s\n", __LINE__, sqlite3_errmsg(User));
        return -1;
    }
    msg sendmsg; 
    if (0 != row)
    {
        printf("ROW=%d\n", row);
        printf("COLUM=%d\n", colum);
        sendmsg.opcode = 'S';
        int count = row;
        while (count >= 1)
        {
            bzero(sendmsg.txt, sizeof(sendmsg.txt));
            sprintf(sendmsg.txt, "%d%s", count, pres[(((count + 1) * colum) - 1)]);
            printf("%s\n", sendmsg.txt);
            bzero(sql, sizeof(sql));
            sprintf(sql, "insert into history values (\"%s\", \"%s\", \"%s\",\"%4d-%02d-%02d %02d:%02d:%02d\");", info.username, info.txt, pres[(((count + 1) * colum) - 1)], ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday, ptr->tm_hour, ptr->tm_min, ptr->tm_sec);
            printf("%s\n", sql);
            char *errmsg;
            int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
            if (SQLITE_OK != sql_exec)
            {
                fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
                return -1;
            }
            ssize_t res_send = send(newfd, &sendmsg, sizeof(sendmsg), 0);
            if (-1 == res_send)
            {
                ERR_MSG("send");
                return -1;
            }
            count--;
        }
    }
    else
    {
        sendmsg.opcode = 'E';
        ssize_t res_send = send(newfd, &sendmsg, sizeof(sendmsg), 0);
        if (-1 == res_send)
        {
            ERR_MSG("send");
            return -1;
        }
        bzero(sql, sizeof(sql));
        sprintf(sql, "insert into history values (\"%s\", \"%s\", \"\",\"%4d-%02d-%02d %02d:%02d:%02d\");", info.username, info.txt, ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday, ptr->tm_hour, ptr->tm_min, ptr->tm_sec);
        printf("%s\n", sql);
        char *errmsg;
        int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
        if (SQLITE_OK != sql_exec)
        {
            fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
            return -1;
        }
    }
 
    sqlite3_free_table(pres);
    return 0;
}
int Login(int newfd, msg info, sqlite3 *User, char *username) //登录
{
    char sql[512] = "";
    sprintf(sql, "select * from login where username0 = \"%s\" and password1 = \"%s\" and state = 0;", info.username, info.txt);
    char **pres;    
    int row, colum;
    char *errmsg;
    int res = sqlite3_get_table(User, sql, &pres, &row, &colum, &errmsg);
    if (SQLITE_OK != res)
    {
        fprintf(stderr, "Line: %d sqlite3_get_table: %s\n", __LINE__, sqlite3_errmsg(User));
        return -1;
    }
    msg sendmsg; 
    if (1 == row)
    {
        sendmsg.opcode = 'S';
        strcpy(username, info.username);
        bzero(sql, sizeof(sql)); 
        sprintf(sql, "update login set state=1 where username0 =\"%s\";", info.username);
        printf("%s\n", sql);
        errmsg = NULL;
        int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
        if (SQLITE_OK != sql_exec)
        {
            fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
            return -1;
        }
    }
    else
    {
        sendmsg.opcode = 'E';
    }
 
    ssize_t res_send = send(newfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
 
    sqlite3_free_table(pres);
    return 0;
}
 
int Register(int newfd, msg info, sqlite3 *User) //注册
{
    char sql[512] = "";
    msg sendmsg;
    sprintf(sql, "insert into login values (\"%s\", \"%s\", 0);", info.username, info.txt); 
    char *errmsg = NULL;
    int sql_exec = sqlite3_exec(User, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(User));
        sendmsg.opcode = 'E'; 
        strcpy(sendmsg.txt, sqlite3_errmsg(User));
    }
    else
    {
        sendmsg.opcode = 'S'; 
    }
    ssize_t res = send(newfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res)
    {
        ERR_MSG("send");
        return -1;
    }
    return 0;
}
int init_TCP_ser(int *sfd) 
{
    *sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == *sfd)
    {
        ERR_MSG("socket");
        return -1;
    }
    int set = 1;
    socklen_t optlen = sizeof(set);
    int res_setopt = setsockopt(*sfd, SOL_SOCKET, SO_REUSEADDR, &set, optlen);
    if (-1 == res_setopt)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(PORT);
    ser.sin_addr.s_addr = inet_addr(IP);
    socklen_t serlen = sizeof(ser);
    int res_bind = bind(*sfd, (struct sockaddr *)&ser, serlen);
    if (-1 == res_bind)
    {
        ERR_MSG("bind");
        return -1;
    }
    int res_lisn = listen(*sfd, 128);
    if (-1 == res_lisn)
    {
        ERR_MSG("listen");
        return -1;
    }
    printf("等待accept....\n");
    return 0;
}
int init_BANK_word(sqlite3 **Dictionary) //单词库表初始化
{
    char sql[512] = "";  
    int sqlop_D = sqlite3_open("./Dictionary", Dictionary);
    if (SQLITE_OK != sqlop_D)
    {
        fprintf(stderr, "Line: %d sqlite3_open: %s\n", __LINE__, sqlite3_errmsg(*Dictionary));
        return -1;
    }
    printf("词典库创建成功\n");
    bzero(sql, sizeof(sql));
    strcpy(sql, "create table if not exists dictionary (word0 char, translate1 char);");
    char *errmsg = NULL;
    int sql_exec = sqlite3_exec(*Dictionary, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*Dictionary));
        return -1;
    }
    bzero(sql, sizeof(sql));
    strcpy(sql, "drop table dictionary;");
    errmsg = NULL;
    sql_exec = sqlite3_exec(*Dictionary, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*Dictionary));
        return -1;
    }
    bzero(sql, sizeof(sql));
    strcpy(sql, "create table if not exists dictionary (word0 char, translate1 char);");
    errmsg = NULL;
    sql_exec = sqlite3_exec(*Dictionary, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*Dictionary));
        return -1;
    }
    printf("单词表创建成功\n");
    FILE *fp = fopen("./dict.txt", "r");
    if (NULL == fp)
    {
        ERR_MSG("fopen");
        return -1;
    }
    printf("导入txt打开成功\n");
    char word[50] = "";       
    char translate[550] = ""; 
    char temp[600] = "";     
    while (1)
    {
        bzero(temp, sizeof(temp));
        char *res = fgets(temp, sizeof(temp), fp);
        if (NULL == res)
        {
            if (2 == errno)
            {
                fclose(fp);
                printf("单词表导入完成\n");
            }
            else
            {
                ERR_MSG("fgets");
                return -1;
            }
            break;
        }
        temp[strlen(temp) - 1] = 0;
        char *middle = temp; 
		while (1)
        {
            if ((' ' == *middle) && (' ' == *(middle + 1)))
            {
                break;
            }
            middle++;
        }
        *middle = 0; 
        strcpy(word, temp);
        strcpy(translate, middle + 3);
 
        bzero(sql, sizeof(sql));
        sprintf(sql, "insert into dictionary values (\"%s\", \"%s\");", word, translate);
 
        bzero(word, sizeof(word));
        bzero(translate, sizeof(translate));
 
        errmsg = NULL;
        sql_exec = sqlite3_exec(*Dictionary, sql, NULL, NULL, &errmsg);
        if (SQLITE_OK != sql_exec)
        {
            fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*Dictionary));
            return -1;
        }
    }
    printf("单词表数据添加完成\n");
    return 0;
}
 
int init_BANK_user(sqlite3 **User)
{
    char sql[512] = ""; 
    int sqlop_D = sqlite3_open("./User", User);
    if (SQLITE_OK != sqlop_D)
    {
        fprintf(stderr, "Line: %d sqlite3_open: %s\n", __LINE__, sqlite3_errmsg(*User));
        return -1;
    }
    printf("用户库创建成功\n");
    bzero(sql, sizeof(sql));
    strcpy(sql, "create table if not exists login (username0 char primary key, password1 char, state int);"); 
    char *errmsg = NULL;
    int sql_exec = sqlite3_exec(*User, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*User));
        return -1;
    }
    printf("用户信息表创建完成\n"); 
    bzero(sql, sizeof(sql));
    strcpy(sql, "create table if not exists history (username0 char, word1 char, translate2 char, time3 char);"); 
    errmsg = NULL;
    sql_exec = sqlite3_exec(*User, sql, NULL, NULL, &errmsg);
    if (SQLITE_OK != sql_exec)
    {
        fprintf(stderr, "Line: %d sqlite3_exec: %s\n", __LINE__, sqlite3_errmsg(*User));
        return -1;
    }
    printf("历史记录表创建完成\n");
    return 0;
}

2.客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
 
#define ERR_MSG(msg)                            \
    {                                           \
        fprintf(stderr, "Line: %d ", __LINE__); \
        perror(msg);                            \
    }
#define PORT 8888
#define IP "192.168.1.101"
 
typedef struct //通信协议基本构成
{
    char opcode;
    char username[20];
    char txt[128];
} msg;
int init_TCP_cli(int *sfd);
int Register(int sfd);
int Login(int sfd, char *username);
int interface(int sfd, char *username);
int Inquire(int sfd, char *username);
int Quit_user(int sfd, char *username);
int History(int sfd, char *username);
 
int main(int argc, const char *argv[])
{
    int sfd;
    char username[20] = ""; 
    if (-1 == init_TCP_cli(&sfd)) 
    {
        return -1;
    }
    while (1)
    {
        char order;
        system("clear");
        printf("**********************************\n");
        printf("**********************************\n");
        printf("**************1.注册**************\n");
        printf("**************2.登录**************\n");
        printf("**************3.退出**************\n");
        printf("**********************************\n");
        printf("**********************************\n");
        printf("请输入命令(1/2/3): ");
        order = getchar();
        while (getchar() != '\n');
        switch (order)
        {
        case '1':
            Register(sfd); //注册
            break;
        case '2':
            Login(sfd, username); //登录
            break;
        case '3':
            goto END; //客户端退出
            break;
        default:
            printf("输入错误,请重新输入\n");
        }
			printf("输入任意按键清屏>>");
        while (getchar() != '\n');
    }
END:
    close(sfd);
    return 0;
}
int Login(int sfd, char *username) //登录
{
    msg sendmsg, recvmsg;
    sendmsg.opcode = 'L';  
    printf("请输入登录用户名:");
    fgets(sendmsg.username, sizeof(sendmsg.username), stdin);
    sendmsg.username[strlen(sendmsg.username) - 1] = 0;
    printf("请输入登录密码: ");
    fgets(sendmsg.txt, sizeof(sendmsg.txt), stdin);
    sendmsg.txt[strlen(sendmsg.txt) - 1] = 0;
    ssize_t res_send = send(sfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
 
    ssize_t res_recv = recv(sfd, &recvmsg, sizeof(recvmsg), 0);
    if (-1 == res_recv)
    {
        ERR_MSG("recv");
        return -1;
    }
    if ('S' == recvmsg.opcode)
    {
        printf("登录成功\n");
        strcpy(username, sendmsg.username); 
		interface(sfd, username);
    }
    else if ('E' == recvmsg.opcode)
    {
        printf("登录失败\n");
    }
    return 0;
}
int interface(int sfd, char *username) //二级界面
{
    while (1)
    {
        char order;
        system("clear");
        printf("**********************************\n");
        printf("**********************************\n");
        printf("*************1.查单词*************\n");
        printf("*************2.查历史*************\n");
        printf("*************3.返回上级***********\n");
        printf("**********************************\n");
        printf("**********************************\n");
        printf("请输入命令(1/2/3): ");
        order = getchar();
        while (getchar() != '\n');
        switch (order)
        {
        case '1':
            Inquire(sfd, username); //查单词
            break;
        case '2':
            History(sfd, username); //查历史
            break;
        case '3':
            Quit_user(sfd, username); //退出登录
            return 0;
        default:
            printf("输入错误,请重新输入\n");
        }
        printf("输入任意按键清屏>>");
        while (getchar() != '\n');
    }
    return 0;
}
int History(int sfd, char *username) //查询历史记录
{
    msg sendmsg;
    sendmsg.opcode = 'H';             
	strcpy(sendmsg.username, username);  
    ssize_t res_send = send(sfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
    while (1)
    {
        msg recvmsg;
        char count;
        ssize_t res_recv = recv(sfd, &recvmsg, sizeof(recvmsg), 0);
        if (-1 == res_recv)
        {
            ERR_MSG("recv");
            return -1;
        }
        if ('S' == recvmsg.opcode)
        {
            count = recvmsg.txt[0];
            if (count >= '1')
            {
                printf("%s\n", recvmsg.txt + 1);
                bzero(recvmsg.txt, sizeof(recvmsg.txt));
                count--;
                if ('0' == count)
                {
                    break;
                }
            }
        }
        else if ('E' == recvmsg.opcode)
        {
            printf("抱歉,该用户历史暂无历史\n");
            break;
        }
    }
}
 
int Quit_user(int sfd, char *username) //用户命令退出
{
    msg sendmsg;
    sendmsg.opcode = 'Q';
    strcpy(sendmsg.username, username);  
    ssize_t res_send = send(sfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
    printf("账号退出成功\n");
}
int Inquire(int sfd, char *username) //查询单词
{
    msg sendmsg;
    sendmsg.opcode = 'I';               
	strcpy(sendmsg.username, username); 
    printf("请输入想要查找的单词:");
    fgets(sendmsg.txt, sizeof(sendmsg.txt), stdin);
    sendmsg.txt[strlen(sendmsg.txt) - 1] = 0;
    ssize_t res_send = send(sfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
    while (1)
    {
        msg recvmsg;
        char count;
        ssize_t res_recv = recv(sfd, &recvmsg, sizeof(recvmsg), 0);
        if (-1 == res_recv)
        {
            ERR_MSG("recv");
            return -1;
        }
        if ('S' == recvmsg.opcode)
        {
            count = recvmsg.txt[0];
            if (count >= '1')
            {
                printf("%s\t%s\n", sendmsg.txt, (recvmsg.txt + 1));
                bzero(recvmsg.txt, sizeof(recvmsg.txt));
                count--;
                if ('0' == count)
                {
                    break;
                }
            }
        }
        else if ('E' == recvmsg.opcode)
        {
            printf("抱歉,未查询到该单词\n");
            break;
        }
    }
    return 0;
}
int Register(int sfd) //注册
{
    msg sendmsg, recvmsg;
    sendmsg.opcode = 'R';
	printf("请输入注册用户名:");
    fgets(sendmsg.username, sizeof(sendmsg.username), stdin);
    sendmsg.username[strlen(sendmsg.username) - 1] = 0;
    printf("请输入注册密码: ");
    fgets(sendmsg.txt, sizeof(sendmsg.txt), stdin);
    sendmsg.txt[strlen(sendmsg.txt) - 1] = 0;
    ssize_t res_send = send(sfd, &sendmsg, sizeof(sendmsg), 0);
    if (-1 == res_send)
    {
        ERR_MSG("send");
        return -1;
    }
 
    ssize_t res_recv = recv(sfd, &recvmsg, sizeof(recvmsg), 0);
    if (-1 == res_recv)
    {
        ERR_MSG("recv");
        return -1;
    }
    if ('S' == recvmsg.opcode)
    {
        printf("注册成功\n");
    }
    else if ('E' == recvmsg.opcode)
    {
        printf("注册失败");
        printf("\t错误原因: %s\n", recvmsg.txt);
    }
    return 0;
}
int init_TCP_cli(int *sfd)
{
    *sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == *sfd)
    {
        ERR_MSG("socket");
        return -1;
    } 
    struct sockaddr_in ser; 
    ser.sin_family = AF_INET;
    ser.sin_port = htons(PORT);
    ser.sin_addr.s_addr = inet_addr(IP);
    socklen_t serlen = sizeof(ser);
    int res_connect = connect(*sfd, (struct sockaddr *)&ser, serlen);
    if (-1 == res_connect)
    {
        ERR_MSG("connect");
        return -1;
    }
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在线词典项目描述: 版本号:v1.1 升级描述:1. 同时支持管理员(用户名:root,密码:1)和普通用户 2. 管理员可以查询所有用户的使用记录 服务器: 1. 支持并发服务器,每有一个客户端connect成功后,提示某某客户端已连接并打印客户端的ip和端口号。 2. 服务器程序可在任意IP地址上运行,并且允许IP地址快速重用 3. 接收到客户端的信息后,可以执行相应的操作:注册,登陆,退出 注册:接收到注册新用户指令后,可以创建sqlite3数据库,将用户名和密码存储到数据库的user表中(用户名name为primary key)。 登陆:接收到登陆命令,可以查询客户端输入的用户名和密码数据库中有没有,有的话跳到下一个菜单(查询单词,历史纪录,退出),没有的话打印错误信息。 查询单词:用户输入单词,服务器从dict.txt文件中遍历有无该单词,有的话打印释义,没有的话打印错误信息,并将用(户名,时间,单词)存储到数据库的history_record表中。(‘#’返回上一级菜单) 历史纪录:用户选择历史记录查询,服务器从数据库的history_record表查询相同name的记录,每查询到一条,调用一次callback将信息发送到客户端,查询完毕后通知客户端。 退出:客户端退出,服务器打印"client exit!" 退出:客户端退出,服务器打印"client exit!" 客户端: 1. 客户端输入./client 192.168.23.128(服务器IP地址) 10000(端口号),参数格式不对或少报错,端口号不能小于5000,小于5000报错 2. 客户端支持注册,登陆,退出 注册:向服务器发送用户名和密码,接收服务器返回来的信息,注册成功/当前用户已存在 登陆:用户输入用户名和密码,客服端将用户名和密码发送给服务器,接收服务器返回的信息,如果OK,打印Login OK! 进入下一菜单(查询单词,历史纪录,退出),否则打印错误信息 查询单词:用户输入单词,客户端将单词发送给服务器,服务器将释义返回给客户端,客户端将释义打印出来 历史纪录:用户选择历史记录查询,客户端将信息发送给服务器,服务器循环把该用户的历史查询记录发送给客户端,客户端循环将其打印出来。 退出:客户端关闭套接字后结束进程 退出:客户端关闭套接字后结束进程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值