C語言網絡聊天室程序

共分爲四部分,服務器兩個,客戶端兩個

1.my_sever.c

//******************************************************//
//鐢熸垚鏃ユ湡 2017騫?2鏈?4鏃?  浣滆€?闄堝漿   //
//璇ユ枃浠朵負鑱婂ぉ瀹ゆ湇鍔″櫒涓葷▼搴忥紝涓昏榪涜濂楁帴瀛楃殑寤虹珛錛岀粦瀹氾紝浠ュ強瀵瑰鎴風鐨勭洃鍚粠鑰屽疄鐜板悇縐嶅姛鑳?/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/select.h>
#include"my_chat.h"
#include<sqlite3.h>

#define PORT 8888


int main()
{
    int sockfd, ret, i = 0, j, length, k, location, num = 0, n;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    struct info Recvbuf;
    fd_set ReadFd, TmpFd;
    int MaxFd;
    int fd[100];
    sqlite3* pdb;
    Linklist list;
    ret = ListInit(&list);
    if (ERROR == ret)
    {
        printf("Init failed!\n");
    }
    sockfd = socket(PF_INET, SOCK_STREAM, 0); //寤虹珛Socket
    if (-1 == sockfd)
    {
        perror("socket");
        exit(1);
    }
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = PORT;
    server_addr.sin_addr.s_addr = inet_addr("192.168.159.128");
    int opt = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));//緇戝畾
    if (-1 == ret)
    {
        perror("bind");
        exit(1);
    }

    ret = listen(sockfd, 10);     //鐩戝惉
    if (-1 == ret)
    {
        perror("listen");
        exit(1);
    }

    ret = sqlite3_open("alluser.db", &pdb);     //鎵撳紑瀛樻斁鎵€浠ヨ亰澶╄褰曠殑鏁版嵁搴?    if (SQLITE_OK != ret)
    {
        perror("sqlite3_open");
        exit(1);
    }    

    FD_ZERO(&ReadFd);
    FD_ZERO(&TmpFd);
    FD_SET(sockfd, &ReadFd);
    MaxFd = sockfd;


    while(1)
    {
        TmpFd = ReadFd;
        ret = select(MaxFd + 1, &TmpFd, NULL, NULL, NULL);
        if (-1 == ret)
        {
            perror("select");
            exit(1);
        }

        if (FD_ISSET(sockfd, &TmpFd))
        {
            length = sizeof(client_addr);
            fd[i] = accept(sockfd, (struct sockaddr*)&client_addr, &length);
            if (-1 == fd[i])
            {
                perror("accept");
                exit(1);
            }
            printf("Accept:%d Port:%d\n", fd[i], client_addr.sin_port);
            FD_SET(fd[i], &ReadFd);
            for (k = 0; k <= i; k++)
            {
                if (fd[k] > MaxFd)
                {
                    MaxFd = fd[k];
                }
            }
    
            i++;
        }

        else
        {
            for (j = 0; j < i; j++)
            {
                if (FD_ISSET(fd[j], &TmpFd))
                {
                    memset(&Recvbuf, 0, sizeof(Recvbuf));
                    ret = recv(fd[j], &Recvbuf, sizeof(Recvbuf), 0);//鎺ユ敹瀹㈡埛絝彂閫佺殑淇℃伅
                    if (-1 == ret)
                    {
                        perror("recv");
                        exit(1);
                    }


                    if (Recvbuf.idlist == 1)
                    {
                        /*鍑芥暟鍚嶏細search  鍔熻兘錛氬垽鏂甯愬彿鏄惁宸茬粡鐧誨綍 鍙傛暟錛氬湪綰縤d鐨勪俊鎭摼琛紝
                        瀹㈡埛絝殑fd錛屽瓨鏀炬帴鏀朵俊鎭殑緇撴瀯浣?/
                        ret = search(list, Recvbuf.id, fd[j]);
                        if (ret == ERROR)
                        {
                            printf("search failed!\n"); 
                        }

                    }

                
                    else if (Recvbuf.namelist == 1)  //灝嗙綉鍚嶏紝fd鍜宨d甯愬彿瀛樺靉閾捐〃
                    {
                        ret = ListInsert(list, 1, fd[j], Recvbuf);
                        if (ret == ERROR)
                        {
                            printf("Insert failed!\n");
                        }
                        ret = send(fd[j], &Recvbuf, sizeof(Recvbuf), 0);
                        if (-1 == ret)
                        {
                            perror("sendname");
                            exit(1);
                        }
                        break;
                    }

                    else if (Recvbuf.look_online == 1)
                    {
                        /*鍑芥暟鍚嶏細lookonline 鍔熻兘錛氭煡鐪嬪湪綰垮ソ鍙嬩俊鎭紝騫朵紶閫佸洖瀹㈡埛絝?                        鍙傛暟錛氫俊鎭摼琛紝瀹㈡埛絝痜d錛岀粨鏋勪綋*/
                        ret = lookonline(list, fd[j], Recvbuf);
                        if (ret == ERROR)
                        {
                            printf("look failed!\n");
                        }
                        break;
                    }
                    

                    else if (Recvbuf.chat_personal == 1)
                    {
                        /*鍑芥暟鍚嶏細chatpersonal 鍔熻兘瀹炵幇縐佽亰鍔熻兘錛屽嵆淇℃伅鐨勮漿鍙?                        鍙傛暟錛氬鎴風fd錛岀粨鏋勪綋錛岃亰澶╄褰曟暟鎹簱pdb錛屼俊鎭摼琛?/
                        ret = chatpersonal(fd[j], Recvbuf, list, pdb);
                        if (ret == ERROR)
                        {
                            printf("chat personal failed!\n");
                        }
                        break;
                    }

                    else if (Recvbuf.chat_all == 1)
                    {
                        /*鍑芥暟鍚嶏細chatall 鍔熻兘錛氬疄鐜扮兢鍙戝姛鑳斤紝鍗衝皢淇℃伅杞彂緇欐墍浠ュ湪綰跨敤鎴?                        鍙傛暟錛氬鎴風fd錛岀粨鏋勪綋錛岃亰澶╄褰曟暟鎹簱pdb錛屼俊鎭摼琛?/
                        ret = chatall(fd[j], Recvbuf, list, pdb);
                        if (ret == ERROR)
                        {
                            printf("chat all people failed!\n");
                        }
                        break;
                    }

                    else if (Recvbuf.shutup == 1)
                    {
                        /*鍑芥暟鍚嶏細shutup 鍔熻兘錛氱璦€ 鍙傛暟錛氬鎴風fd錛屼俊鎭摼琛紝緇撴瀯浣?/
                        ret = shutup(fd[j], Recvbuf, list);
                        if (ret == ERROR)
                        {
                            printf("Shutup failed!\n");
                        }
                        break;
                    }

                    else if (Recvbuf.speakout == 1)
                    {
                        /*鍑芥暟鍚嶏細shutup 鍔熻兘錛氱璦€ 鍙傛暟錛氬鎴風fd錛屼俊鎭摼琛紝緇撴瀯浣?/
                        ret = speakout(fd[j], Recvbuf, list);
                        if (ret == ERROR)
                        {
                            printf("Speakout failed!\n");
                        }
                        break;
                    }


                    else if (Recvbuf.kickout == 1)
                    {
                        /*鍑芥暟鍚嶏細kickout 鍔熻兘錛氬皢鏌愮敤鎴瘋涪鍑鴻亰澶╁錛岀粨鏉熷叾榪涗▼*/
                        ret = kickout(fd[j], Recvbuf, list);
                        if (ret == ERROR)
                        {
                            printf("Kickout failed!\n");
                            break;
                        }
                        else
                        {
                            close(ret);
                            FD_CLR(ret, &ReadFd);
                            location = Location(list, ret); //瀹氫綅璇ョ敤鎴鳳紝紜畾鍏舵墍鍦ㄤ俊鎭摼琛ㄧ殑浣嶇疆
                            ret = ListDelete(list, location);//鍒犻櫎璇ョ敤鎴鋒墍鍦ㄩ摼琛ㄤ俊鎭?                            if (ERROR == ret)
                            {
                                printf("Delete failed!\n");
                                break;
                            }
                            MaxFd = 5;     //閲嶆柊紜畾姝ゆ椂鐨凪axFd鐨勫€礆紝紜繚鏄渶澶х殑fd鐨勫€?                            for (k = 0; k < i; k++)
                            {
                                /*if (fd[k] == ret)
                                {
                                    continue;
                                }*/
                                if (fd[k] > MaxFd)
                                {
                                    MaxFd = fd[k];
                                }
                            }
                        }
                        break;
                    }
                        
                    else if (Recvbuf.esc == 1)
                    {
                        //澶勭悊閫€鍑洪€夐」浠ュ強ctrl c淇″彿錛?鍙戜俊鍙風粰瀹㈡埛絝紝浣垮叾鍏抽棴fd
                        memset(&Recvbuf, 0, sizeof(Recvbuf));
                        Recvbuf.esc = 1;
                        ret = send(fd[j], &Recvbuf, sizeof(Recvbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send1");
                            exit(1);
                        }

                        close(fd[j]);
                        FD_CLR(fd[j], &ReadFd);
                        location = Location(list, fd[j]);   //瀹氫綅鍏跺湪閾捐〃浣嶇疆
                        ret = ListDelete(list, location);   //鍒犻櫎涓漢淇℃伅
                        if (ERROR == ret)
                        {
                            printf("Delete failed!\n");
                            break;
                        }
                        MaxFd = 5;                           //閲嶆柊紜畾MaxFd
                        for (k = 0; k < i; k++)
                        {
                            /*if (k == j)
                            {
                                continue;
                            }*/
                            if (fd[k] > MaxFd)
                            {
                                MaxFd = fd[k];
                            }
                        }

                        break;
                    }

                    else if (Recvbuf.quit == 1)
                    {                                        //澶勭悊鍦ㄧ櫥褰曠晫闈㈢殑閫€鍑洪€夐」
                        close(fd[j]);                        //鍏抽棴鐩稿簲fd
                        FD_CLR(fd[j], &ReadFd);
                        break;
                    }
                    break;
                }
            }
        }
    }

    return 0;
}


 

2.sever.c

//******************************************************//
//鐢熸垚鏃ユ湡 2017騫?2鏈?4鏃?  浣滆€?闄堝漿   //
//璇ユ枃浠朵負鑱婂ぉ瀹ゆ湇鍔″櫒瀛愮▼搴忥紝涓昏榪涜瀹㈡埛絝悇欏瑰姛鑳界殑瀹炵幇//


#include<stdio.h>
#include"my_chat.h"
#include<stdlib.h>
#include<string.h>
#include<sqlite3.h>

int ListInit(Linklist* L)
{
    *L = (Linklist)malloc(sizeof(Node));
    if (*L == NULL)
    {
        return ERROR;
    }
    (*L)->next = NULL;
    return OK;
}


/*鍑芥暟鍚嶏細search  鍔熻兘錛氬垽鏂甯愬彿鏄惁宸茬粡鐧誨綍 鍙傛暟錛氬湪綰縤d鐨勪俊鎭摼琛紝
瀹㈡埛絝殑fd錛屽瓨鏀炬帴鏀朵俊鎭殑緇撴瀯浣?/
int search(Linklist L, char* id, int fd)
{
    if (NULL == L)
    {
        return ERROR;
    }
    struct info Sendbuf;
    Linklist p = L;
    int exist = 0, ret;
    while(p->next)
    {
        p = p->next;
        if (!strcmp(p->Id, id))
        {
            exist = 1;
            break;
        }
    }
    if (exist == 1)
    {
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 1;
        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }
        return OK;
    }

    else
    {
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 0;
        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }
        return OK;
    }
}

int ListInsert(Linklist L, int k, int fd, struct info Recvbuf)
{
    if (NULL == L)
    {
        return ERROR;
    }
    int j = 1;
    Linklist p = L;
    while (p && j < k)
    {
        p = p->next;
        j++;
    }
    if (!p || j > k)
    {
        return ERROR;
    }
    Linklist s = (Linklist)malloc(sizeof(Node));
    s->Fd = fd;
    strcpy(s->Id, Recvbuf.id);
    strcpy(s->Name, Recvbuf.name); 
    s->next = p->next;
    p->next = s;
    return OK;
}

/*鍑芥暟鍚嶏細lookonline 鍔熻兘錛氭煡鐪嬪湪綰垮ソ鍙嬩俊鎭紝騫朵紶閫佸洖瀹㈡埛絝?鍙傛暟錛氫俊鎭摼琛紝瀹㈡埛絝痜d錛岀粨鏋勪綋*/
int lookonline(Linklist L, int fd, struct info Recvbuf)
{
    if (NULL == L)
    {
        return ERROR;
    }
    Linklist p = L;
    struct info Sendbuf;
    int ret;
    memset(&Sendbuf, 0, sizeof(Sendbuf));
    while(p->next != NULL)
    {
        p = p->next;
        strcat(Sendbuf.buf, p->Name);
        strcat(Sendbuf.buf, " ");
    }
    Sendbuf.look_online = 1;

    ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
    if (-1 == ret)
    {
        perror("send");
        exit(1);
    }
    return OK;
}

/*鍑芥暟鍚嶏細chatpersonal 鍔熻兘瀹炵幇縐佽亰鍔熻兘錛屽嵆淇℃伅鐨勮漿鍙?鍙傛暟錛氬鎴風fd錛岀粨鏋勪綋錛岃亰澶╄褰曟暟鎹簱pdb錛屼俊鎭摼琛?/
int chatpersonal(int fd, struct info Recvbuf, Linklist L, sqlite3* pdb)
{
    char from_name[100] = {0};
    char to_name[100] = {0};
    char sql[100] = {0};
    char record[100] = {0};
    int to_fd;
    Linklist p = L;
    int ret, exist = 0;
    struct info Sendbuf;
    memset(sql, 0, sizeof(sql));
    sprintf(sql, "create table if not exists alluser (chatinfo text);");
    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_exec1");
        exit(1);
    }

    while(p->next)
    {
        p = p->next;
        if (fd == p->Fd)
        {
            //printf("%s\n", p->Name);
            strcpy(from_name, p->Name);
            break;
        }
    }


    p = L;
    while(p->next)
    {
        p = p->next;
        if (!strcmp(Recvbuf.name, p->Name))
        {
            exist = 1;
            to_fd = p->Fd;
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            strcpy(Sendbuf.name, from_name);
            strcpy(Sendbuf.buf, Recvbuf.buf);
            Sendbuf.chat_personal = 1;
            ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }

            memset(record, 0, sizeof(record));
            strcpy(record, from_name);
            strcat(record, "鍚?);
            strcat(record, Recvbuf.name);
            strcat(record, "鍙戦€佷簡:");
            strcat(record, Sendbuf.buf);
            memset(sql, 0, sizeof(sql));
            sprintf(sql, "insert into alluser (chatinfo) values ('%s');", record);
            ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
            if (SQLITE_OK != ret)
            {
                perror("sqlite3_exec2");
                exit(1);
            }
        }
    }

    
    if (exist == 0)
    {    
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 1;
        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }
        return ERROR;
    }

    return OK;
}

/*鍑芥暟鍚嶏細chatall 鍔熻兘錛氬疄鐜扮兢鍙戝姛鑳斤紝鍗衝皢淇℃伅杞彂緇欐墍浠ュ湪綰跨敤鎴?鍙傛暟錛氬鎴風fd錛岀粨鏋勪綋錛岃亰澶╄褰曟暟鎹簱pdb錛屼俊鎭摼琛?/
int chatall(int fd, struct info Recvbuf, Linklist L, sqlite3* pdb)
{
    if (NULL == L)
    {
        return ERROR;
    }

    char from_name[100] = {0};
    char sql[100] = {0};
    char record[100] = {0};
    Linklist p = L;
    int ret;
    struct info Sendbuf;
    while(p->next)
    {
        p = p->next;
        if (fd == p->Fd)
        {
            strcpy(from_name, p->Name);
            break;
        }
    }
    memset(sql, 0, sizeof(sql));
    sprintf(sql, "create table if not exists alluser (chatinfo text);");
    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_exec1");
        exit(1);
    }

    p = L;
    memset(&Sendbuf, 0, sizeof(Sendbuf));
    Sendbuf.chat_all = 1;
    strcpy(Sendbuf.name, from_name);
    strcpy(Sendbuf.buf, Recvbuf.buf);
    while(p->next)
    {
        p = p->next;
        if (p->Fd == fd)
        {
            continue;
        }

        ret = send(p->Fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }        
    }
    memset(record, 0, sizeof(record));
    strcpy(record, from_name);
    strcat(record, "鍚?);
    strcat(record, "澶у");
    strcat(record, "鍙戦€佷簡:");
    strcat(record, Sendbuf.buf);
    memset(sql, 0, sizeof(sql));
    sprintf(sql, "insert into alluser (chatinfo) values ('%s');", record);
    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_exec2");
        exit(1);
    }

    return OK;
}
//瑙i櫎紱佽█
int speakout(int fd, struct info Recvbuf, Linklist L)
{
    if (NULL == L)
    {
        return ERROR;
    }

    char from_name[100] = {0};
    Linklist p = L;
    int ret, to_fd;
    int exist = 0;
    struct info Sendbuf;
    while(p->next)
    {
        p = p->next;
        if (fd == p->Fd)
        {
            strcpy(from_name, p->Name);
            break;
        }
    }

    p = L;
    while(p->next)
    {
        p = p->next;
        if (!strcmp(Recvbuf.name, p->Name))
        {
            to_fd = p->Fd;
            exist = 1;
            
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            strcpy(Sendbuf.name, from_name);
            Sendbuf.speakout = 1;
            strcpy(Sendbuf.buf, "宸插皢瑙i櫎浣犵璦€錛?);

            ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }        
        }
    }

    if (exist == 0)
    {
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 1;

        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }        

        return ERROR;
    }
    return OK;
}

/*鍑芥暟鍚嶏細shutup 鍔熻兘錛氱璦€ 鍙傛暟錛氬鎴風fd錛屼俊鎭摼琛紝緇撴瀯浣?/
int shutup(int fd, struct info Recvbuf, Linklist L)
{
    if (NULL == L)
    {
        return ERROR;
    }

    char from_name[100] = {0};
    Linklist p = L;
    int ret, to_fd;
    int exist = 0;
    struct info Sendbuf;
    while(p->next)
    {
        p = p->next;
        if (fd == p->Fd)
        {
            strcpy(from_name, p->Name);
            break;
        }
    }

    p = L;
    while(p->next)
    {
        p = p->next;
        if (!strcmp(Recvbuf.name, p->Name))
        {
            to_fd = p->Fd;
            exist = 1;
            
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            strcpy(Sendbuf.name, from_name);
            Sendbuf.speak = 1;
            strcpy(Sendbuf.buf, "宸插皢浣犵璦€錛?);

            ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }        
        }
    }

    if (exist == 0)
    {
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 1;

        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }        

        return ERROR;
    }
    return OK;
}

/*鍑芥暟鍚嶏細kickout 鍔熻兘錛氬皢鏌愮敤鎴瘋涪鍑鴻亰澶╁錛岀粨鏉熷叾榪涗▼*/
int kickout(int fd, struct info Recvbuf, Linklist L)
{
    if (NULL == L)
    {
        return ERROR;
    }

    char from_name[100] = {0};
    Linklist p = L;
    int ret, to_fd;
    int exist = 0;
    struct info Sendbuf;
    while(p->next)
    {
        p = p->next;
        if (fd == p->Fd)
        {
            strcpy(from_name, p->Name);
            break;
        }
    }

    p = L;
    while(p->next)
    {
        p = p->next;
        if (!strcmp(Recvbuf.name, p->Name))
        {
            to_fd = p->Fd;
            exist = 1;
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            strcpy(Sendbuf.name, from_name);
            Sendbuf.kickout = 1;
            strcpy(Sendbuf.buf, "宸插皢浣犺涪鍑鴻亰澶╁錛?);

            ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }
        }
    }

    if (exist == 0)
    {
        memset(&Sendbuf, 0, sizeof(Sendbuf));
        Sendbuf.not_exist = 1;

        ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
        if (-1 == ret)
        {
            perror("send");
            exit(1);
        }        

        return ERROR;
    }

    return to_fd;
}


int ListDelete(Linklist L, int k)
{
    Linklist p = L;
    int j = 1;
    Linklist l;
    if (NULL == L)
    {
        return ERROR;
    }

    while (p->next && j < k)
    {
        p = p->next;
        j++;
    }

    if (!(p->next) || j > k)
    {
        return ERROR;
    }

    l = p->next;
    p->next = p->next->next;
    free(l);
    return OK;
}

int Location(Linklist L, int fd)
{
    if (NULL == L)
    {
        return ERROR;
    }
    int count = 0;
    Linklist p = L;
    while(p->next)
    {
        count++;
        p = p->next;
        if (p->Fd == fd)
        {
            return count;
        }
    }
    return ERROR;
}


3.my_client.c

//******************************************************//
//鐢熸垚鏃ユ湡 2017騫?2鏈?4鏃?  浣滆€?闄堝漿   //
//璇ユ枃浠朵負鑱婂ぉ瀹ゅ鎴風涓葷▼搴忥紝涓昏榪涜濂楁帴瀛楃殑寤虹珛錛屼笌鏈嶅姟鍣ㄧ殑榪炴帴錛岀敤鎴風殑鐧誨綍娉ㄥ唽錛屼互鍙婅亰澶╁鐨勫悇縐嶅姛鑳界殑瀹炵幇//
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include"my_chat.h"
#include<signal.h>
#include<sqlite3.h>

#define PORT 8888
int speak_flag = 0;

void* receive(void* arg)                     //綰跨▼鍑芥暟錛屼笉鏂帴鏀舵湇鍔″櫒鍙戦€佺殑淇℃伅
{
    int ret;
    sqlite3* pdb;
    char name1[100] = {0};
    char id1[100] = {0};
    char sql[100] = {0};
    char record[100] = {0};
    struct info Recvbuf;
    ret = sqlite3_open("user.db", &pdb);     //鎵撳紑瀛樻斁涓漢鐢ㄦ埛鑱婂ぉ璁板綍鐨勬暟鎹簱
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_open");
        exit(1);
    }    


    while(1)
    {
        int ret;
        memset(&Recvbuf, 0, sizeof(Recvbuf));
        ret = recv(*(int*)arg, &Recvbuf, sizeof(Recvbuf), 0);  //涓嶆柇鎺ユ敹鏈嶅姟鍣ㄥ彂閫佺殑娑堟伅
        if (-1 == ret)
        {
            perror("recv");
            return;
        }
        if (Recvbuf.namelist == 1)                  //閫氳繃鏈嶅姟鍣ㄦ潵鑾峯彇鐧誨綍鍑芥暟鎵€鏀墮泦鐨勭敤鎴風綉鍚嶅拰
        {                                           //鐢ㄦ埛id鐨勪俊鎭?            strcpy(name1, Recvbuf.name);
            strcpy(id1, Recvbuf.id);
        }

        if (Recvbuf.look_online == 1)              //瀹炵幇鏌ョ湅鍦ㄧ嚎濂藉弸鍔熻兘錛屽苟灝嗗叾鎵撳嵃
        {
            printf("\n鍦ㄧ嚎濂藉弸:%s\n", Recvbuf.buf);
            sleep(3);
        }

        else if (Recvbuf.not_exist == 1)            //鑻ュ彂閫佷俊鎭椂鍑虹幇涓嶅瓨鍦ㄧ殑緗戝悕鍒欐墦鍗?        {
            printf("\n瀵逛笉璧鳳紝璇ュソ鍙嬩笉瀛樺湪\n");
            sleep(2);
        }

        else if (Recvbuf.chat_personal == 1)        //瀹炵幇瀵圭鑱婁俊鎭殑鎺ユ敹錛屽苟鎵撳嵃鍙戦€佽€呭拰鍐呭
        {                                          
            memset(record, 0, sizeof(record));
            strcpy(record, Recvbuf.name);
            strcat(record, "鍚?);
            strcat(record, name1);
            strcat(record, "鍙戦€佷簡:");
            strcat(record, Recvbuf.buf);
            memset(sql, 0, sizeof(sql));
            sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
            ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);   //灝嗘璁板綍瀛樺靉鏁版嵁搴?            if (SQLITE_OK != ret)
            {
                perror("sqlite3_exec2");
                exit(1);
            }

            printf("\n\t\t\t\t\t\t鏂版秷鎭細\n\t\t\t\t\t\t%s : %s\n", Recvbuf.name, Recvbuf.buf);
        }

        else if (Recvbuf.chat_all == 1)          //瀵圭兢鑱婁俊鎭殑鎺ユ敹
        { 
            printf("\n\t\t\t\t\t\t鏂版秷鎭?\n\t\t\t\t\t\t%s 鍚戝ぇ瀹跺彂閫佷簡娑堟伅:%s\n",
            Recvbuf.name, Recvbuf.buf);
            sleep(2);
        }

        else if (Recvbuf.speak == 1)             //鑻ヨ紱佽█錛屽墶鎵撳嵃紱佽█鑰呯綉鍚?        {
            speak_flag = 1;
            printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
            sleep(2);
        }

        else if (Recvbuf.speakout == 1)             //鑻ヨ紱佽█錛屽墶鎵撳嵃紱佽█鑰呯綉鍚?        {
            speak_flag = 0;
            printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
            sleep(2);
        }


        else if (Recvbuf.kickout == 1)           //鑻ヨ韙㈠嚭鑱婂ぉ瀹わ紝鎵撳嵃韙綘鐨勪漢緗戝悕
        {
            printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
            break;
        }

        else if (Recvbuf.esc == 1)              //鎺ユ敹鏉ヨ嚜鐧誨綍鐣岄潰鐨勯€€鍑轟俊鎭?        {
            break;
        }
    }
    close(*(int*)arg);
    kill(getpid(), SIGSTOP);
}

int main()
{
    int sockfd, ret;
    struct info Sendbuf;
    struct sockaddr_in server_addr;
    pthread_t tid;
    char buf[100] = {0};
    char name[100] = {0};
    sockfd = socket(PF_INET, SOCK_STREAM, 0);           //寤虹珛socket
    if (-1 == sockfd)
    {
        perror("socket");
        exit(1);
    }
    printf("Start Server!\n");
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = PORT;
    server_addr.sin_addr.s_addr = inet_addr("192.168.159.128");
    ret = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));  //涓庢湇鍔″櫒榪炴帴
    if (-1 == ret)
    {
        perror("connect");
        exit(1);
    }

    logininterface(sockfd);     //鐧誨綍鐣岄潰鍑芥暟錛屽疄鐜版敞鍐岀櫥褰曠瓑鍔熻兘
    sleep(2);
    ret = pthread_create(&tid, 0, receive, (void*)&sockfd);  //鍒涘緩涓€涓嚎紼嬬敤鏉ヤ笉鏂帴鏀朵俊鎭?    if (ret != 0)
    {
        perror("create");
        exit(1);
    }

    funinterface(sockfd);  //璋冪敤鎵€鏈夊姛鑳界殑鍑芥暟
    return 0;
}

 

4.client.c

//******************************************************//
//鐢熸垚鏃ユ湡 2017騫?2鏈?4鏃?  浣滆€?闄堝漿   //
//璇ユ枃浠朵負鑱婂ぉ瀹ゅ鎴風瀛愮▼搴忥紝涓昏榪涜鐢ㄦ埛鐨勭櫥褰曟敞鍐岋紝浠ュ強鑱婂ぉ瀹ょ殑鍚勭鍔熻兘鐨勫疄鐜?/

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include"my_chat.h"
#include<signal.h>

int id_exist = 0;       //鍒ゆ柇杈撳靉鐨剗d鏄惁瀛樺湪
int id_num = 0;         //紜畾璇d鍦ㄦ暟鎹簱琛ㄤ腑鐨勪綅緗?int id_num1 = 0;
int name_exist = 0;     //鍒ゆ柇璇ョ綉鍚嶆槸鍚﹂噸澶?int password_num = 0;   //鍒ゆ柇瀵嗙爜鎵€鍦ㄦ暟鎹簱琛ㄤ腑浣嶇疆錛屼互鎵懼埌鐩稿搴旂殑甯愬彿
int password_right = 0; //鍒ゆ柇瀵嗙爜鏄惁姝g‘
int vip_flag = 0;       //鏄惁鏄痸ip鐨勬爣蹇?extern speak_flag;      //瀹氫箟鍦ㄥ鎴風涓誨嚱鏁版枃浠朵腑錛屼紶閫掓湇鍔″櫒鐨勭璦€淇℃伅        
char name1[100] = {0};  //瀛樻斁緗戝悕
char id1[100] = {0};    //瀛樻斁id
int Sockfd;

void quit(int sig)      //澶勭悊閫€鍑轟俊鍙鳳紝 紜繚鍏抽棴鐩稿簲fd
{
    printf("姝e湪淇濆瓨淇℃伅......\n");
    int ret;
    struct info Sendbuf;
    memset(&Sendbuf, 0, sizeof(Sendbuf));
    Sendbuf.esc = 1;
    ret = send(Sockfd, &Sendbuf, sizeof(Sendbuf), 0); //鍙戦€佺粰鏈嶅姟鍣紝浣垮叾鍏抽棴fd
    if (-1 == ret)
    {
        perror("send");
        exit(1);
    }
    sleep(2);
    kill(getpid(), SIGSTOP);        //緇撴潫涓誨嚱鏁?}
/*鍑芥暟鍚嶏細name  鍙傛暟錛氳緭鍏ョ殑緗戝悕 鍔熻兘錛氬垽鏂緗戝悕鏄惁宸茬粡瀛樺湪*/
int name(void* para, int columncount, char** columnValue, char** columnName)
{
    if (strcmp((char*)para, columnValue[2]) == 0)
    {
        name_exist = 1;
    }
    return 0;
}

/*鍑芥暟鍚嶏細idnum 鍙傛暟錛氳緭鍏ョ殑id甯愬彿  鍔熻兘錛氬垽鏂甯愬彿鏄惁宸茬粡瀛樺湪錛岃嫢瀛樺湪紜畾璧鋒墍鍦ㄦ暟鎹簱琛ㄤ腑浣嶇疆*/
int idnum(void* para, int columncount, char** columnValue, char** columnName)
{
    id_num++;
    if (strcmp((char*)para, columnValue[0]) == 0)
    {
        id_exist = 1;
        id_num1 = id_num;
    }
    return 0;
}

/*鍑芥暟鍚嶏細password 鍙傛暟錛氳緭鍏ョ殑瀵嗙爜 鍔熻兘錛氭壘鍒板笎鍙風溮瀵圭殑瀵嗙爜錛屽苟涓庤緭鍏ヨ繘琛屾瘮杈冿紝鍒ゆ柇杈撳靉瀵嗙爜瀵歸敊*/
int passwordnum(void* para, int columncount, char** columnValue, char** columnName)
{
    password_num++;
    if (password_num == id_num1)
    {
        if(strcmp((char*)para, columnValue[1]) == 0)
        {
            password_right = 1;
            strcpy(name1, columnValue[2]);
        }
    }
    return 0;
}

/*鍑芥暟鍚嶏細print 鍙傛暟錛氭棤 鍔熻兘錛氭墦鍗板瓨鏀捐亰澶╄褰曠殑鏁版嵁搴撹〃涓墍鏈夊唴瀹?/
int print(void* para, int columncount, char** columnValue, char** columnName)
{
    printf("\n");
    printf("%s\n", *columnValue);
    return 0;
}


int logininterface(int sockfd)        //鐧誨綍鐣岄潰鍑芥暟錛屽弬鏁頒負寤虹珛濂界殑sockfd
{                                     //瀹炵幇鐧誨綍娉ㄥ唽錛屽苟鏃佹柇鐧誨綍鐨剗d鏄惁瀛樺湪錛岃緭鍏ョ殑瀵嗙爜鏄惁姝g‘
    sqlite3* pdb;                     //浠ュ強娉ㄥ唽鏃秈d鏄惁瀛樺湪錛岀綉鍚嶆槸鍚﹂噸澶?    int ret, i, age, choose;
    char sql[100] = {0};
    char id[100] = {0};
    Sockfd = sockfd;
    char password[100] = {0};
    struct info Sendbuf;
    struct info Recvbuf;
    ret = sqlite3_open("info.db", &pdb);//鎵撳紑瀛樻斁甯愬彿瀵嗙爜緗戝悕淇℃伅鐨勬暟鎹簱
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_open");
        exit(1);
    }    


    sprintf(sql, "create table if not exists id_info (id text, password text, name text);");
    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);       //寤虹珛涓€寮犲瓨鏀緄d錛屽瘑鐮侊紝緗戝悕鐨勮〃
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_exec1");
        exit(1);
    }
    signal(SIGINT, SIG_IGN);        //姝ゆ椂蹇界暐ctrl錛媍淇″彿

    while(1)
    {
        system("clear");
        printf("\n\n\n");
        printf("***********************************************************\n");
        printf("*    *         *  *                 *           *         *\n");
        printf("*   *       *        *       *                   *        *\n");
        printf("*      *          *      Welcome!      *     *    *       *\n");
        printf("*  *          *               *                 *       * *\n");
        printf("*       *        Happy   *    *   Chating!      *         *\n");
        printf("*    *                  *    *         *     *            *\n");
        printf("*          *        *           *     *    *   *   *      *\n");
        printf("***********************************************************\n");
        sleep(2);
        system("clear");
        printf("\n\n\n");
        printf("***********************************************************\n");
        printf("*             *       *                            *      *\n");
        printf("*     *                  1.鐧誨綍甯愬彿       *               *\n");
        printf("*       *    *   *     * 2.娉ㄥ唽甯愬彿          *   *        *\n");
        printf("*    *              *    3.閫€鍑?           *              *\n");
        printf("*        *  *   *     *            *        *       *     *\n");
        printf("*     *       (璐﹀彿瀵嗙爜杈撳靉涓緭鍏xit閮藉皢閫€鍑?            *\n");
        printf("*            *          *                          *      *\n");
        printf("***********************************************************\n");
        printf("\n");
    
        ret = scanf("%d", &choose);
        if (ret == 0)
        {
            int ch;
            printf("杈撳靉閿欒!\n");
            while ((ch = getchar()) != EOF && ch != '\n');
            sleep(1);
            continue;
        }
        else if (choose == 1)
        {
            id_exist = 0;
            id_num = 0;
            id_num1 = 0;
            password_num = 0;
            password_right = 0;
            system("clear");
            printf("\n\n\n\n");
            while(1)
            {
                printf("璇瘋緭鍏ュ笎鍙?");
                memset(id, 0, sizeof(id));
                scanf("%s", id);
                if (!strcmp(id, "exit"))         //鑻ヨ緭鍏xit錛屽墶榪涜閫€鍑虹郴緇?                {
                    printf("嬈㈣繋涓嬫鍐嶆潵!\n");
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.quit = 1;
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);  //鍙戦€佺粰鏈嶅姟鍣ㄩ€€鍑轟俊鍙?                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }
                    printf("閫€鍑烘垚鍔燂紒\n");
                    close(sockfd);
                    sleep(1);
                    exit(1);
                }
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.idlist = 1;                 //鍒ゆ柇璇ュ笎鍙鋒槸鍚﹀凡緇忕櫥褰?                strcpy(Sendbuf.id, id);
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                ret = recv(sockfd, &Recvbuf, sizeof(Recvbuf), 0); //鎺ユ敹鏈嶅姟鍣ㄧ殑鍙嶉淇℃伅
                if (-1 == ret)                                
                {
                    perror("recv");
                    exit(1);
                }
                if (Recvbuf.not_exist == 1)
                {
                    printf("\n璇ュ笎鍙峯凡鐧誨綍錛乗n");
                    continue;
                }

                else if (Recvbuf.not_exist == 0)
                {
                    break;
                }

            }
            sprintf(sql, "select * from id_info;");             //浠庢暟鎹簱涓垽鏂甯愬彿鏄惁瀛樺湪
            ret = sqlite3_exec(pdb, sql, idnum, (void*)id, NULL);
            if (SQLITE_OK != ret)
            {
                perror("sqlite3_exec2");
                exit(1);
            }

            if (id_exist == 0)
            {
                printf("\n閿欒:璇ュ笎鍙蜂笉瀛樺湪!\n");
                sleep(2);
            }
            else
            {
                memset(password, 0, sizeof(password));
                printf("\n璇瘋緭鍏ュ瘑鐮?");
                scanf("%s", password);
                if (!strcmp(password, "exit"))      //閫€鍑烘搷浣?                {
                    printf("嬈㈣繋涓嬫鍐嶆潵!\n");
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.quit = 1;
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }
                    printf("閫€鍑烘垚鍔燂紒\n");
                    close(sockfd);
                    sleep(1);
                    exit(1);
                }

                sprintf(sql, "select * from id_info;");      //璋冪敤甯愬彿鏁版嵁搴撲俊鎭紝鍒ゆ柇瀵嗙爜鏄惁姝g‘
                ret = sqlite3_exec(pdb, sql, passwordnum, (void*)password, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
                if (password_right == 0)
                {
                    printf("瀵嗙爜閿欒\n");
                    sleep(2);
                }
                else
                {
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.namelist = 1;            //瀵嗙爜姝g‘鍚庯紝灝嗕俊鎭瓨鍏ュ湪綰跨敤鎴風殑閾捐〃
                    strcpy(Sendbuf.name, name1);
                    strcpy(Sendbuf.id, id);
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0); 
                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }

                    strcpy(id1, id);
                    printf("\n姝e湪鐧誨綍......\n");
                    sleep(1);
                    printf("\n鐧誨綍鎴愬姛錛乗n");
                    break;
                }

            }
        }
        else if (choose == 2)
        {
            system("clear");
            printf("\n\n\n\n");
            printf("璇瘋緭鍏ュ笎鍙?");
            scanf("%s", id);
            if (!strcmp(id, "exit"))
            {
                printf("嬈㈣繋涓嬫鍐嶆潵!\n");
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.quit = 1;
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("閫€鍑烘垚鍔燂紒\n");
                close(sockfd);
                sleep(1);
                exit(1);
            }
        
            sprintf(sql, "select * from id_info;");
            ret = sqlite3_exec(pdb, sql, idnum, (void*)id, NULL);  //鍒ゆ柇璇ュ笎鍙鋒槸鍚﹀瓨鍦?            if (SQLITE_OK != ret)
            {
                perror("sqlite3_exec2");
                exit(1);
            }
            if (id_exist == 1)
            {
                printf("\n閿欒:璇ュ笎鍙峯凡瀛樺湪!\n\n");
                id_exist = 0;
                sleep(2);
            }

            else
            {
                printf("\n璇瘋緭鍏ュ瘑鐮?");
                scanf("%s", password);
                if (!strcmp(password, "exit"))
                {
                    printf("嬈㈣繋涓嬫鍐嶆潵!\n");
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.quit = 1;
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }
                    printf("閫€鍑烘垚鍔燂紒\n");
                    close(sockfd);
                    sleep(1);
                    exit(1);
                }

                printf("\n璇瘋緭鍏ョ綉鍚?");
                scanf("%s", name1);
                if (!strcmp(name1, "exit"))
                {
                    printf("嬈㈣繋涓嬫鍐嶆潵!\n");
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.quit = 1;
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }
                    printf("閫€鍑烘垚鍔燂紒\n");
                    close(sockfd);
                    sleep(1);
                    exit(1);
                }

                sprintf(sql, "select * from id_info;");
                ret = sqlite3_exec(pdb, sql, name, (void*)name1, NULL); //鍒ゆ柇璇ョ綉鍚嶆槸鍚﹂噸澶?                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
                if (name_exist == 1)
                {
                    printf("\n閿欒:璇ョ綉鍚嶅凡瀛樺湪!\n\n");
                    name_exist = 0;
                    sleep(1);
                }

                else      //閮芥紜悗錛屽皢鏂扮殑甯愬彿淇℃伅瀛樺靉鏁版嵁搴?                {
                    sprintf(sql, "insert into id_info (id,password,name) values ('%s', '%s', '%s');", id, password, name1);
                    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                    if (SQLITE_OK != ret)
                    {
                        perror("sqlite3_exec2");
                        exit(1);
                    }
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    Sendbuf.namelist = 1;         //綾諱技浜庣櫥褰曟垚鍔燂紝瀛樺靉鍦ㄧ嚎鐢ㄦ埛淇℃伅閾捐〃
                    strcpy(Sendbuf.name, name1);
                    strcpy(Sendbuf.id, id);
                    ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0); 
                    if (-1 == ret)
                    {
                        perror("send");
                        exit(1);
                    }
                    strcpy(id1, id);
                    printf("\n");
                    printf("姝e湪娉ㄥ唽......\n");
                    sleep(1);
                    printf("\n");
                    printf("**********\n");
                    printf("*娉ㄥ唽鎴愬姛*\n");
                    printf("**********\n");
                    break;
                }
            }
        }
        else if (choose == 3)
        {
            printf("嬈㈣繋涓嬫鍐嶆潵!\n");
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            Sendbuf.quit = 1;
            ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }
            printf("閫€鍑烘垚鍔燂紒\n");
            close(sockfd);
            sleep(1);
            exit(1);
        }

        else
        {
            printf("杈撳靉閿欒!\n");
            sleep(1);
        }
    }
    return 0;
}


int funinterface(int sockfd)       //鍔熻兘瀹炵幇鍑芥暟錛屼紶鍏ヤ簬鏈嶅姟鍣ㄨ繛鎺ュソ鐨剆ockfd
{
    int choose, ret;
    sqlite3* pdb;
    char sql[100] = {0};
    char name[100] = {0};
    char look[100] = {0};
    char str[100] = {0};
    char use[100] = {0};
    char record[100] = {0};
    struct info Sendbuf;
    Sockfd = sockfd;
    signal(SIGINT, quit);         //姝ゆ椂鑻ヨ幏鍙朿trl錛媍淇″彿錛屽墶璋冪敤quit鍑芥暟錛岃繘琛屽fd鐨勫叧闂?    ret = sqlite3_open("user.db", &pdb);
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_open");
        exit(1);
    }    
    memset(sql, 0, sizeof(sql));
    sprintf(sql, "create table if not exists '%s' (chatinfo text);", id1); //鍒涘緩涓撳睘鐨勮亰澶╄褰曡〃
    ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
    if (SQLITE_OK != ret)
    {
        perror("sqlite3_exec1");
        exit(1);
    }

    while(1)
    {
        system("clear");
        printf("*************************************************************\n");
        printf("*     *  *        Welcome  to chatting room!      *         *\n");
        printf("*    *                1.鏌ョ湅鎵€鏈夊湪綰垮ソ鍙?         *    *   **\n");
        printf("* * *       *         2.縐佽亰濂藉弸                         *  *\n");
        printf("*     *          *    3.緹ゅ彂娑堟伅          *     *           *\n");
        printf("*                     4.韙㈠嚭緹よ亰     *   *       *     *    *\n");
        printf("*   *       *         5.紱佽█            *         *         *\n");
        printf("*    *       *  *     6.瑙i櫎紱佽█           *           *    *\n");
        printf("*  *    *             7.鍙戦€佽〃鎯?     *      *      *       *\n");
        printf("*  *        *     *   8.鍙戦€佸父鐢ㄨ            *             *\n");
        printf("*    *                9.娉ㄥ唽浼氬憳           *       *        *\n");
        printf("* *       *           10.鏌ョ湅鑱婂ぉ璁板綍        *              *\n");
        printf("*   *           *     11.閫€鍑鴻亰澶╁   *            *        *\n");
        printf("*      *      *       12.浣跨敤鎵嬪唽        *          *       *\n");              
        printf("*************************************************************\n");
        printf("浣犵殑緗戝悕:%s  \n璇瘋緭鍏ユ偍閫夋嫨鐨勫姛鑳?\n", name1);
        printf("\n");
        printf("***********************************************/  娑堟伅鏍? /\n");
        ret = scanf("%d", &choose);
        if (ret == 0)
        {
            int ch;
            printf("杈撳靉閿欒!\n");
            while ((ch = getchar()) != EOF && ch != '\n');
            sleep(1);
            continue;
        }
        switch(choose)
        {
            case(1):
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            if (speak_flag == 1)
            {
                Sendbuf.speak = 1;
            }
            Sendbuf.look_online = 1;
            ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0); //鍙戦€佺粰鏈嶅姟鍣紝榪涜鏌ョ湅鍦ㄧ嚎鐢ㄦ埛
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }
            sleep(2);
            break;

            case(2):
            if (speak_flag)             //鑻ユ帴鏀剁殑紱佽█鏍囧織浣嶅凡緗?錛屽墶宸茶紱佽█
            {
                printf("\n瀵逛笉璧鳳紝鎮ㄥ凡琚璦€!\n");
                sleep(2);
                break;
            }
            else
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                printf("璇瘋緭鍏ュソ鍙嬬綉鍚?");
                scanf("%s", name);
                printf("\n璇瘋緭鍏ュ唴瀹?鎸塃nter閿彂閫? 緇撴潫鑱婂ぉ璇瘋緭鍏?exit):\n");
                printf("\n");
                printf("*           鍙€氳繃蹇嵎鏂瑰紡鍙戦€佽〃鎯呭摝         *\n");
                printf("**********************************************\n");
                printf("*     蹇嵎鏂瑰紡   :)     寮€蹇? ( *^0^* )      *\n");
                printf("*     蹇嵎鏂瑰紡   :(     鐢熸皵  ( > o < )      *\n");
                printf("*     蹇嵎鏂瑰紡   :<     浼ゅ績  (T _ T )       *\n");
                printf("*     蹇嵎鏂瑰紡   :>     鎯婅  (0 A 0|||)     *\n");
                printf("*     蹇嵎鏂瑰紡   :,     浜蹭翰  (o^3^o)        *\n");
                printf("**********************************************\n");
    
                while(1)
                {
                    memset(&Sendbuf, 0, sizeof(Sendbuf));
                    scanf("%s", Sendbuf.buf);
                    if (!strcmp(Sendbuf.buf, "exit"))
                    {
                        break;
                    }
                    else if (!strcmp(Sendbuf.buf, ":)"))
                    {    
                        memset(&Sendbuf, 0, sizeof(Sendbuf));
                        Sendbuf.chat_personal = 1;
                        strcpy(Sendbuf.name, name);
                        strcpy(Sendbuf.buf, "鍚戜綘寰瑧浜嗕竴涓?( *^0^* )");
                        memset(record, 0, sizeof(record));
                        strcpy(record, name1);
                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }

                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }

                    else if (!strcmp(Sendbuf.buf, ":("))
                    {    
                        memset(&Sendbuf, 0, sizeof(Sendbuf));
                        Sendbuf.chat_personal = 1;
                        strcpy(Sendbuf.name, name);
                        strcpy(Sendbuf.buf, "鎴戝緢鐢熸皵 ( > o < )");
                        memset(record, 0, sizeof(record));
                        strcpy(record, name1);
                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }

                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }
                    
                    else if (!strcmp(Sendbuf.buf, ":<"))
                    {    
                        memset(&Sendbuf, 0, sizeof(Sendbuf));
                        Sendbuf.chat_personal = 1;
                        strcpy(Sendbuf.name, name);
                        strcpy(Sendbuf.buf, "鎴戝緢浼ゅ績 ( > o < )");
                        memset(record, 0, sizeof(record));
                        strcpy(record, name1);
                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }

                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }


                    else if (!strcmp(Sendbuf.buf, ":>"))
                    {    
                        memset(&Sendbuf, 0, sizeof(Sendbuf));
                        Sendbuf.chat_personal = 1;
                        strcpy(Sendbuf.name, name);
                        strcpy(Sendbuf.buf, "浠€涔堥 (0 A 0|||)");
                        memset(record, 0, sizeof(record));
                        strcpy(record, name1);
                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }

                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }

                    else if (!strcmp(Sendbuf.buf, ":,"))
                    {    
                        memset(&Sendbuf, 0, sizeof(Sendbuf));
                        Sendbuf.chat_personal = 1;
                        strcpy(Sendbuf.name, name);
                        strcpy(Sendbuf.buf, "鍋峯伔浜蹭簡浣犱竴涓?(o^3^o)");
                        memset(record, 0, sizeof(record));
                        strcpy(record, name1);
                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }

                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }
                    else
                    {
                        memset(record, 0, sizeof(record)); //灝嗗彂閫佽€咃紝鍙戦€佸璞★紝鍙戦€佺殑鍐呭鐩告帴鍚?                        strcpy(record, name1);             //瀛樺靉鏁版嵁搴?                        strcat(record, "鍚?);
                        strcat(record, name);
                        strcat(record, "鍙戦€佷簡:");
                        strcat(record, Sendbuf.buf);
                        memset(sql, 0, sizeof(sql));
                        sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                        ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                        if (SQLITE_OK != ret)
                        {
                            perror("sqlite3_exec2");
                            exit(1);
                        }
                        strcpy(Sendbuf.name, name);
                        Sendbuf.chat_personal = 1;      //灝嗙鑱婃爣蹇椾綅緗竴
                        ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                        if (-1 == ret)
                        {
                            perror("send");
                            exit(1);
                        }
                    }
                }
            }
            break;
            case(3):
            if (speak_flag)
            {
                printf("\n瀵逛笉璧鳳紝鎮ㄥ凡琚璦€!\n");
                sleep(2);
                break;
            }
            else
            {
                printf("\n娉ㄦ剰錛?閫€鍑鴻杈撳靉:exit\n");
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                printf("璇瘋緭鍏ュ唴瀹?");
                scanf("%s", Sendbuf.buf);
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚戝ぇ瀹?);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }

                Sendbuf.chat_all = 1;
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }

                if (!strcmp(Sendbuf.buf, "exit"))
                {
                    break;
                }
            }
            break;

            case(4):
            if (vip_flag == 0)
            {
                printf("\n瀵逛笉璧鳳紝鎮ㄦ病鏈夋潈闄怽n");  //鑻ユ病鏈夋敞鍐屼細鍛橈紝鍒欐棤鏉冮檺
                sleep(2);
            }

            else
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                printf("\n璇瘋緭鍏ヤ綘鎯寵涪鍑鴻亰澶╁瀵硅薄鐨勭綉鍚?");
                sleep(1);
                scanf("%s", Sendbuf.name);
                Sendbuf.kickout = 1;
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                sleep(1);
            }
            break;
            case(5):
            if (vip_flag == 0)
            {
                printf("\n瀵逛笉璧鳳紝鎮ㄦ病鏈夋潈闄怽n");
                sleep(2);
            }

            else
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                printf("\n璇瘋緭鍏ヤ綘鎯崇璦€瀵硅薄鐨勭綉鍚?");
                sleep(1);
                scanf("%s", Sendbuf.name);
                Sendbuf.shutup = 1;
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                sleep(1);
            }
            break;

            case(6):
            if (vip_flag == 0)
            {
                printf("\n瀵逛笉璧鳳紝鎮ㄦ病鏈夋潈闄怽n");
                sleep(2);
            }

            else
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                printf("\n璇瘋緭鍏ヤ綘鎯寵В闄ょ璦€瀵硅薄鐨勭綉鍚?");
                sleep(1);
                scanf("%s", Sendbuf.name);
                Sendbuf.speakout = 1;
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                sleep(1);
            }
            break;

            case(7):
            system("clear");
            printf("\n璇瘋緭鍏ユ偍瑕佸彂閫佺殑瀵硅薄:");
            scanf("%s", name);
            printf("\n");
            printf("**********************************************\n");
            printf("*     蹇嵎鏂瑰紡   :)     寮€蹇? ( *^0^* )      *\n");
            printf("*     蹇嵎鏂瑰紡   :(     鐢熸皵  ( > o < )      *\n");
            printf("*     蹇嵎鏂瑰紡   :<     浼ゅ績  (T _ T )       *\n");
            printf("*     蹇嵎鏂瑰紡   :>     鎯婅  (0 A 0|||)     *\n");
            printf("*     蹇嵎鏂瑰紡   :,     浜蹭翰  (o^3^o)        *\n");
            printf("**********************************************\n");
            printf("璇瘋緭鍏ヨ〃鎯呭揩鎹鋒柟寮?\n");
            memset(look, 0, sizeof(look));
            scanf("%s", look);
            if (!strcmp(look, ":)"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "鍚戜綘寰瑧浜嗕竴涓?( *^0^* )");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }

                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(look, ":("))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "鎴戝緢鐢熸皵 ( > o < )");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
    
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(look, ":<"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "鎴戝緢浼ゅ績 ( > o < )");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }

                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(look, ":>"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "浠€涔堥 (0 A 0|||)");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
    
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(look, ":,"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "鍋峯伔浜蹭簡浣犱竴涓?(o^3^o)");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }

                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else
            {
                printf("杈撳靉閿欒錛乗n");
                sleep(1);
                break;
            }

            case(8):
            system("clear");
            printf("\n\n");
            printf("***********************************\n");
            printf("*   杈撳靉鏍煎紡 渚嬪: john /welcome  *\n");
            printf("*                                 *\n");
            printf("*         嬈㈣繋  /welcome          *\n");
            printf("*         鐐硅禐  /praise           *\n");
            printf("*         鍐嶈  /goodbye          *\n");
            printf("***********************************\n");
            printf("\n璇瘋緭鍏?");
            memset(name, 0 ,sizeof(name));
            memset(str, 0, sizeof(str));
            scanf("%s %s", name, str);
            if (!strcmp(str, "/welcome"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "嬈㈣繋浣犳潵鍒拌亰澶╁");

                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }

                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(str, "/praise"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "緇欎綘鐐逛釜璧烇紝浣犵湡嬀?);

                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
    
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else if (!strcmp(str, "/goodbye"))
            {
                memset(&Sendbuf, 0, sizeof(Sendbuf));
                Sendbuf.chat_personal = 1;
                strcpy(Sendbuf.name, name);
                strcpy(Sendbuf.buf, "鏈嬪弸鏈夌紭鍗冮噷鏉ョ溮浼?");
                memset(record, 0, sizeof(record));
                strcpy(record, name1);
                strcat(record, "鍚?);
                strcat(record, name);
                strcat(record, "鍙戦€佷簡:");
                strcat(record, Sendbuf.buf);
                memset(sql, 0, sizeof(sql));
                sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
    
                ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
                if (SQLITE_OK != ret)
                {
                    perror("sqlite3_exec2");
                    exit(1);
                }
                ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
                if (-1 == ret)
                {
                    perror("send");
                    exit(1);
                }
                printf("宸插彂閫?..\n");
                sleep(2);
                break;
            }

            else
            {
                printf("杈撳靉閿欒錛乗n");
                sleep(1);
                break;
            }


            case(9):
            printf("鎭枩鎮ㄥ凡娉ㄥ唽涓虹櫧閲戜細鍛?\n");
            vip_flag = 1;               //灝嗕細鍛樻爣蹇椾綅緗竴
            sleep(2);
            break;

            case(10):
            memset(sql, 0, sizeof(sql));
            sprintf(sql, "select * from '%s';", id1);  //鎵撳嵃鐢ㄦ埛鏁版嵁搴撲腑鎵€鏈夎亰澶╄褰?            ret = sqlite3_exec(pdb, sql, print, NULL, NULL);
            if (SQLITE_OK != ret)
            {
                perror("sqlite3_exec2");
                exit(1);
            }
            printf("杈撳靉浠繪剰閿€€鍑篭n");
            scanf("%s", look);
            break;

            case(11):
            printf("嬈㈣繋涓嬫鍐嶆潵!\n");      //閫€鍑洪€夐」
            memset(&Sendbuf, 0, sizeof(Sendbuf));
            Sendbuf.esc = 1;
            ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
            if (-1 == ret)
            {
                perror("send");
                exit(1);
            }
            printf("閫€鍑烘垚鍔燂紒\n");
            sleep(2);
            break;
            
            case(12):
            printf("  杈撳靉浠繪剰閿€€鍑篭n");
            printf("\n1.杈撳靉鏁板瓧閫夋嫨鍔熻兘\n");
            printf("2.縐佽亰濂藉弸鏃跺彧鏈夎緭鍏xit鎵嶅彲浠ラ€€鍑篭n");
            printf("3.甯愬彿涓嶅彲閲嶅鐧誨綍錛岀綉鍚嶄笉鍙噸澶峔n");
            scanf("%s", use);
            break;
            default:
            printf("杈撳靉閿欒錛乗n");
            sleep(1);
            break;
        }
    }

    return 0;
}


運行時將兩個server文件編譯成一個可執行文件,兩個client文件也編譯成一個可持續文件,先運行服務器,再運行客戶端

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章