TCP实现英英词典(多线程)(项目设计)新手思维

server

 

main函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include <pthread.h>
#include"create_server.h"
#include"login.h"
#include"search.h"
int server_init(char *,unsigned short,int);
int login(int,fd_set);
int search(int);
void *thread_link(void *arg)
{
    int ret=0;
    int rws=*(int *)arg;
    ret=login(rws);
    if(ret==-1)
    {
        close(rws);
        return NULL;
    }                                        //error
    else if(ret==1)
    {
        close(rws);
        return NULL;
    }                                        //login quit
    else if(ret==0)
    {
        ret=search(rws);
        if(ret==-1)
        {
            printf("search");
            close(rws);
            return NULL;
        }
    }                                        //login success
    close(rws);
    pthread_exit(NULL);
}
int main(int argc, char *argv[])
{ 
    int sockfd,ret;
    sockfd=server_init("192.168.2.41",7878,1024);
    if(sockfd==-1)
    {
        printf("server_init error\n");
        return -1;
    }
    printf("server create success\n");
    int i;
                                            //等待连接
#define SIZE 1024
    char recvbuf[SIZE]={0},sendbuf[SIZE]={0};
    while(1)
    {     
        struct sockaddr_in caddr;
        bzero(&caddr,sizeof(caddr));
        socklen_t clen=sizeof(caddr);
        int rws=accept(sockfd,(struct sockaddr *)&caddr,&clen);
        if(rws==-1)
        {
            perror("accept");
            close(sockfd);
            return -1;
        }
        printf("some usr join in success\n");
        strcpy(sendbuf,"注册/登录/退出输入:0/1/quit");
        ret=send(rws,sendbuf,SIZE,0);
        if(ret==-1)
        {
            perror("send");
            close(rws);
            break;
        }                                    //主线程接受连接
        pthread_t tid;
        if(0 != pthread_create(&tid,NULL,thread_link,(void *)&rws))
        {
            perror("pthread_create");
            break;
        }                                //创建子线程处理客户端请求
        pthread_detach(tid);
    }
close(sockfd);
return 0;
} 

create_server函数

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include"create_server.h"
int server_init(char *ipaddr,unsigned short port,int backlog)
{
    int ret,sockfd;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        perror("socket");
        return -1;
    }                        //创建网络套接字
    struct sockaddr_in saddr;
    bzero(&saddr,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(port);
    saddr.sin_addr.s_addr=(ipaddr==NULL)?htonl(INADDR_ANY):inet_addr(ipaddr);
    socklen_t slen=sizeof(saddr);
    ret=bind(sockfd,(struct sockaddr *)&saddr,slen);//绑定
    if(ret==-1)
    {
        perror("bind");
        close(sockfd);
        return -1;
    }
    ret=listen(sockfd,backlog);        //监听
    if(ret==-1)
    {
        perror("listen");
        close(sockfd);
        return -1;
    }
    return sockfd;
}

login 函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"login.h"
#include"search.h"
int login(int i)
{
#define SIZE 1024
    int ret,flag,flag1,flag2,flag3,falg4,flag5,flag6,len;
    sqlite3 *db=NULL;
    ret = sqlite3_open("server.usr",&db);
    if(ret!=SQLITE_OK)
    {
        printf("%s\n",sqlite3_errmsg(db));
        return -1;
    }
    char *errmsg = NULL;
    char **resultp;
    int nrow;
    int ncolumn;
    ret = sqlite3_get_table(db,"create table usr (name char [10],passwd char [10]);",&resultp,&nrow,&ncolumn,&errmsg);
    if(ret==-1)
    {
        printf("sqlite3_get_table error\n");
        return -1;
    }        //建好用户信息表

    char recvbuf[SIZE]={0},sendbuf[SIZE]={0},namebuf[SIZE]={0},passwdbuf[SIZE]={0},buf[10]={0};
flag5:
    bzero(recvbuf,SIZE);
    ret=recv(i,recvbuf,SIZE,0);
    if(ret==-1)
    {
        perror("recv");
        close(i);
        sqlite3_close(db);
        return -1;
    }
    if(recvbuf[0]=='0')//注册
    {
flag6:
        bzero(sendbuf,SIZE);
        strcpy(sendbuf,"请输入你的账号id 4~10个字符");
        ret=send(i,sendbuf,SIZE,0);
        if(ret==-1)
        {
            perror("send");
            close(i);
            sqlite3_close(db);
            return -1;
        }
        bzero(recvbuf,SIZE);
        ret=recv(i,recvbuf,SIZE,0);
        if(ret==-1)
        {
            perror("recv");
            close(i);
            sqlite3_close(db);
            return -1;
        }
        len=strlen(recvbuf);
        if(len<4||len>10)
        {
            strcpy(sendbuf,"id长度不合适,请重新输入id");
            ret=send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            goto flag6;
        }
        else
        {
            strcpy(buf,recvbuf);
            sprintf(sendbuf,"select * from usr where name=\"%s\";",buf);
            if(SQLITE_OK!=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg))
            {
                printf("sqlite3_get_table:%s\n",errmsg);
                close(i);
                sqlite3_close(db);
                return -1;
            }
            if(nrow>0)
            {
                strcpy(sendbuf,"id 重复 请重新注册!");
                ret=send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    perror("send");
                    close(i);
                    sqlite3_close(db);
                    return -1;
                }
                goto flag6;
            }
            else
            {
                if(strcmp(recvbuf,"quit")==0)//usr want to quit really? 
                {
flag :
                    strcpy(sendbuf," 你的账号是:’quit‘,还是你想要退出?扣0/1");
                    ret=send(i,sendbuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("send");
                        close(i);
                        sqlite3_close(db);
                        return -1;
                    }
                    ret=recv(i,recvbuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("recv");
                        close(i);
                        sqlite3_close(db);
                        return -1;
                    }
                    if(recvbuf[0]=='1')
                    {
                        close(i);
                        return 1;
                    }
                    else if(recvbuf[0]=='0')
                    {
                        strcpy(namebuf,"quit");
                    }
                    else
                    {
                        strcpy(sendbuf,"无效字符,重新输入");
                        ret=send(i,sendbuf,SIZE,0);
                        if(ret==-1)
                        {
                            perror("send");
                            close(i);
                            sqlite3_close(db);
                            return -1;
                        }
                        goto flag;
                    }

                }
                else
                {
                    strcpy(namebuf,recvbuf);
                }
flag7:
                strcpy(sendbuf,"现在你可以设置你的密码,4~10个字符 !");
                ret=send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    perror("send");
                    close(i);
                    sqlite3_close(db);
                    return -1;
                }
                ret=recv(i,recvbuf,SIZE,0);
                if(ret==-1)
                {
                    perror("recv");
                    close(i);
                    sqlite3_close(db);
                    return -1;
                }
                len=strlen(recvbuf);
                if(len<4||len>10)
                {
                    strcpy(sendbuf,"密码长度不合适,请重新输入密码");
                    ret=send(i,sendbuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("send");
                        close(i);
                        sqlite3_close(db);
                        return -1;
                    }
                    goto flag7;
                }
                else
                {
                    if(strcmp(recvbuf,"quit")==0)//判断用户密码是quit 还是想退出
                    {
flag1:
                        strcpy(sendbuf,"你的密码是‘quit’,还是你想要退出?扣0/1");
                        ret=send(i,sendbuf,SIZE,0);\
                            if(ret==-1)
                            {
                                perror("send");
                                close(i);
                                sqlite3_close(db);
                                return -1;
                            }
                        ret=recv(i,recvbuf,SIZE,0);
                        if(ret==-1)
                        {
                            perror("recv");
                            close(i);
                            sqlite3_close(db);
                            return -1;

                        }
                        if(recvbuf[0]=='1')//退出
                        {
                            close(i);
                            return 1;
                        }
                        else if(recvbuf[0]=='0')//密码四位是quit
                        {
                            strcpy(passwdbuf,"quit");
                        }
                        else 
                        {
                            strcpy(sendbuf,"无效字符,重新输入:0/1\n");//没有输入0/1
                            ret=send(i,sendbuf,SIZE,0);
                            if(ret==-1)
                            {
                                perror("send");
                                close(i);
                                sqlite3_close(db);
                                return -1;

                            }
                            goto flag1;
                        }
                    }
                    else 
                    {
                        strcpy(passwdbuf,recvbuf);
                    }
                    //到此用户账号与密码保存在namebuf/passwdbuf中
                    strcpy(recvbuf,"insert into usr values (\"");
                    strcat(recvbuf,namebuf);
                    strcpy(sendbuf,"\",\"");
                    strcat(recvbuf,sendbuf);
                    strcat(recvbuf,passwdbuf);
                    strcpy(sendbuf,"\");");
                    strcat(recvbuf,sendbuf);
                    if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg))
                    {
                        printf("sqlite_get_table:%s\n",errmsg);
                        close(i);
                        sqlite3_close(db);
                        return -1;
                    } //注册成功
                    strcpy(sendbuf,"恭喜你,注册成功!你的账号信息如下 :");
                    strcpy(his[i].name,namebuf);
                    strcpy(his[i].pass,passwdbuf);
                    ret=send(i,sendbuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("send");
                        close(i);
                        sqlite3_close(db);
                        return -1;
                    }
                    ret=send(i,namebuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("send");
                        close(i);
                        sqlite3_close(db);
                        return -1;

                    }
                    ret=send(i,passwdbuf,SIZE,0);
                    if(ret==-1)
                    {
                        perror("send");
                        close(i);
                        sqlite3_close(db);
                        return -1;

                    }//将信息发给客户端进行确认注册成功;
                }
            }
        }
    }
    else if(recvbuf[0]=='1')//登陆
    {
flag4 :
        strcpy(sendbuf,"请输入你的账号:");
        ret=send(i,sendbuf,SIZE,0);
        if(ret==-1)
        {
            perror("send");
            close(i);
            sqlite3_close(db);
            return -1;

        }
        ret=recv(i,recvbuf,SIZE,0);
        if(ret==-1)
        {
            perror("recv");
            close(i);
            sqlite3_close(db);
            return -1;

        }
        if(strcmp(recvbuf,"quit")==0)
        {
flag2 :
            strcpy(sendbuf,"你的账号是‘quit’还是你想退出: 0/1");
            send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            recv(i,recvbuf,SIZE,0);
            if(ret==-1)
            {
                perror("recv");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            if(recvbuf[0]=='1')
            {
                close(i);
                return 1;
            }
            else if(recvbuf[0]=='0')
            {
                strcpy(namebuf,"quit");
            }
            else
            {
                strcpy(sendbuf,"无效字符,重新输入:0/1");
                send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    perror("send");
                    close(i);
                    sqlite3_close(db);
                    return -1;
                }
                goto flag2;
            }
        }
        else 
        {
            strcpy(namebuf,recvbuf);
        }
        strcpy(sendbuf,"输入你的密码:");
        send(i,sendbuf,SIZE,0);
        if(ret==-1)
        {
            perror("send");
            close(i);
            sqlite3_close(db);
            return -1;
        }
        recv(i,recvbuf,SIZE,0);
        if(ret==-1)
        {
            perror("recv");
            close(i);
            sqlite3_close(db);
            return -1;
        }
        if(strcmp(recvbuf,"quit")==0)
        {
flag3:
            strcpy(sendbuf,"你的密码是‘quit’,还是你想退出:扣0/1");
            send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            recv(i,recvbuf,SIZE,0);
            if(ret==-1)
            {
                perror("recv");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            if(recvbuf[0]=='1')
            {
                close(i);
                return 1;
            }
            else if(recvbuf[0]=='0')
            {
                strcpy(passwdbuf,"quit");
            }
            else
            {
                strcpy(sendbuf,"无效字符,重新输入:0/1");
                send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    perror("send");
                    close(i);
                    sqlite3_close(db);
                    return -1;
                }
                goto flag3;
            }
        }
        else
        {
            strcpy(passwdbuf,recvbuf);
        }//登陆信息存在namebuf/passwdbuf
        strcpy(recvbuf,"select * from usr where name=\"");
        strcat(recvbuf,namebuf);
        strcpy(sendbuf,"\"and passwd =\"");
        strcat(recvbuf,sendbuf);
        strcat(recvbuf,passwdbuf);
        strcpy(sendbuf,"\";");
        strcat(recvbuf,sendbuf);
        if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg))
        {
            printf("sqlite3_get_table:%s\n",errmsg);
            close(i);
            sqlite3_close(db);
            return -1;
        }
        if(nrow<1)
        {
            strcpy(sendbuf,"账户信息有误,请重新输入");
            send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                close(i);
                sqlite3_close(db);
                return -1;
            }
            goto flag4;
        }
        strcpy(his[i].name,namebuf);
        strcpy(his[i].pass,passwdbuf);
        //log in success
    }
    else if(strcmp(recvbuf,"quit")==0)
    {
        close(i);
        return 1;
    }
    else
    {
        strcpy(sendbuf,"请输入0/1来决定选项");
        ret=send(i,sendbuf,SIZE,0);
        if(ret==-1)
        {
            perror("send");
            close(i);
            sqlite3_close(db);
            return -1;
        }
        goto flag5;
    }
    sqlite3_close(db);
    return 0;
}

search函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>
#include<time.h>
#include"search.h"
#define SIZE 1024
int search(int i)
{
    int ret,o,flag;
    char recvbuf[SIZE]={0},sendbuf[SIZE]={0},rowbuf[SIZE]={0};
    strcpy(sendbuf,"--------------登录成功----------------!");
    ret=send(i,sendbuf,SIZE,0);
    if(ret==-1)
    {
        perror("send");
        close(i);
        return -1;
    }
flag:
    strcpy(sendbuf,"---------‘Q’退出---‘H‘历史------------");
    ret=send(i,sendbuf,SIZE,0);
    if(ret==-1)
    {
        close(i);
        return -1;
    }
    strcpy(sendbuf,"---------------英英词典---------------");
    send(i,sendbuf,SIZE,0);
    if(ret==-1)
    {
        close(i);
        return -1;
    }
    while(1)
    {
        FILE *fp=fopen("dict.txt","r");
        if(fp==NULL)
        {
            perror("fopen");
            return -1;
        }

        ret=recv(i,recvbuf,SIZE,0);
        if(ret==-1)
        {
            perror("recv");
            close(i);
            return -1;
        }
        if(strcmp(recvbuf,"Q")==0)
        {
            strcpy(sendbuf,"-----------BYE BYE !------------");
            ret=send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                close(i);
                return -1;
            }
            close(i);
            return 1;
        }
        else if(strcmp(recvbuf,"H")==0)
        {
            strcpy(sendbuf,"-------------HISTORY-------------------");
            sleep(1);
            ret=send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                close(i);
                return -1;
            }

            for(int j=0;j<5;j++)
            {

                sprintf(sendbuf,"TIME-----%s",his[i].time[j]);
                ret=send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    close(i);
                    return -1;
                }
                sprintf(sendbuf,"WORD----%s",his[i].word[j]);
                ret=send(i,sendbuf,SIZE,0);
                if(ret==-1)
                {
                    close(i);
                    return -1;
                }
            }
            goto flag;
        }
        else
        {
            sqlite3 *db=NULL;
            ret = sqlite3_open("server.usr",&db);
            if(ret!=SQLITE_OK)
            {
                printf("%s\n",sqlite3_errmsg(db));
                return -1;
            }
            char *errmsg = NULL;
            char **resultp;
            int nrow=0;
            int ncolumn=0;

            recvbuf[strlen(recvbuf)]='\0';
            strcpy(sendbuf,"select * from dict where word=\"");
            strcat(sendbuf,recvbuf);
            strcat(sendbuf,"\";");
            ret=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg);
            if(ret!=SQLITE_OK)
            {
                printf("sqlite_get_table:%s\n",errmsg);
                close(i);
                sqlite3_close(db);
                return -1;
            }
            if(nrow>0)
            {
                strcpy(sendbuf,resultp[3]);
                time_t timep;
                struct tm *t;
                time(&timep);
                t=localtime(&timep);
                sprintf(rowbuf,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
                strcpy(his[i].time[o],rowbuf);
                strcpy(his[i].word[o],recvbuf);
                o++;
                if(o==4)
                {
                    o=0;
                }

            }
            else
            {
                strcpy(sendbuf,"--------------未找到!--------------");
            }
            sleep(1);
            ret=send(i,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                return -1;
            }
        }
    }
}

头文件.H

create_server.h
#ifndef CREATE_SERVER_H
#define CREATE_SERVER_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
int server_init(char *,unsigned short,int);
#endif
--------------------------------------------------------------
login.h
#ifndef LOGIN_H
#define LOGIN_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"search.h"
int login(int);
#endif

--------------------------------------------------------------

search.h
#ifndef SEARCH_H
#define SEARCH_H
#include"login.h"
typedef struct 
{
    char name[20];
    char pass[20];
    char time[5][20];
    char word[5][20];
}history;
history his[1024];  
int search(int);
#define SIZE 1024
#endif

makefile

server_app:create_server.o login.o search.o main.o 
	gcc create_server.o login.o search.o main.o -lsqlite3 -lpthread -o server_app
create_server.o:./create_server.c
	gcc -c create_server.c -I ./ -o create_server.o
login.o: ./login.c
	gcc -c login.c -I ./ -o login.o
search.o: ./search.c
	gcc -c search.c -I ./ -o search.o
main.o: ./main.c
	gcc -c main1.c -I ./ -o main.o
clean:
	rm *.o

user

client函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>

int link_server(char *ipaddr,unsigned short port)
{
    int ret,sockfd;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in saddr;
    bzero(&saddr,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(port);
    saddr.sin_addr.s_addr=inet_addr(ipaddr);
    socklen_t slen=sizeof(saddr);
    ret=connect(sockfd,(struct sockaddr*)&saddr,slen);
    if(ret==-1)
    {
        perror("connect");
        close(sockfd);
        return -1;
    }
    return sockfd;
}
int main()
{
    int ret,sockfd;
    sockfd=link_server("192.168.2.41",7878);
    if(sockfd==-1)
    {
        printf("server error\n");
        return -1;
    }
    printf("-------------------------------------------\n");
    printf("|        ENG--ENG DIGTIONARY!!!           |\n");
    printf("|     /                         \\         |\n");
    printf("|    ||        广告位出租        ||       |\n");
    printf("|     \\                         /         |\n");
    printf("|      ----------WELCOME!--------         |\n");
    printf("-------------------------------------------\n");
    printf("------------------SCD----------------------\n");
    fd_set rfds,fds;
    FD_ZERO(&rfds);
    FD_SET(0,&rfds);
    FD_SET(sockfd,&rfds);
    int nfds=sockfd+1;
#define SIZE 1024
    char recvbuf[SIZE]={0},sendbuf[SIZE]={0};
    while(1)
    {
        fds=rfds;
        ret=select(nfds,&fds,NULL,NULL,NULL);
        if(ret==-1)
        {
            perror("select");
            close(sockfd);
            return -1;
        }
        if(FD_ISSET(0,&fds))
        {
            fgets(sendbuf,SIZE,stdin);
            sendbuf[strcspn(sendbuf,"\n")]='\0';
            ret=send(sockfd,sendbuf,SIZE,0);
            if(ret==-1)
            {
                perror("send");
                close(sockfd);
            }
        }
        if (FD_ISSET(sockfd,&fds))
        {
            bzero(recvbuf,SIZE);
            ret=recv(sockfd,recvbuf,SIZE,0);
            if(ret==-1)
            {
                perror("recv");
                close(sockfd);
                return -1;
            }
            if(ret==0)
            {
                break;
            }
            printf("%s\n",recvbuf);

        }
    }
    return 0;
}

结果展示:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小珂打代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值