聊天室客户端(多线程)

头文件

#ifndef _SERVER_H_
#define _SERVER_H_

#define color_none      "\033[0m"
#define color_red       "\033[1;5;31m"
#define color_purple    "\033[1;5;35m"
#define color_green     "\033[1;5;32m"
#define color_yellow    "\033[1;5;33m"

#define PORT    8888

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

pthread_t tid;
struct info
{
    int option;
    int sign;
    int num;
    int chat;
    char username[20];
    char passward[20];
    char name[20];
    char question[20];
    char key[20];
    char buf[10000];
    char n[10][10];
    int online_num;
    char recvname[20];
    char filename[20];
    char member[10];  //判断是否是会员
    int speak;  //是否被禁言
    int offline;
    char agree[10];
};

struct link
{
    char id[20];
    char name[20];
    int fd;
    int port;
    char member[10];  //判断是否是会员
    int speak;  //是否被禁言
    int offline;
    struct link *next;
};

typedef struct link Link;
typedef Link *link_list;

void signalhandler(void);
void show();
void PrintInfo();
int regis(int sockfd);
int log_in(int sockfd);
int find(int sockfd);
int Exit(int sockfd);
int chat(int sockfd);

#endif

主程序

#include "chatroom.h"


int main(int argc, char *argv[])
{
    int sockfd, ret;
    struct sockaddr_in server_addr;
    char num[10] = {0};
    char enter[10] = {0};
    struct info sendbuf;
    struct info recvbuf;

    signalhandler();    //按下ctrl+c或ctrl+\时不会退出

    sockfd = socket(PF_INET, SOCK_STREAM, 0);
    if(-1 == sockfd)
    {
       perror("socket");
       exit(1);
    }
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = PF_INET;
    server_addr.sin_port =htons(PORT);                                                                                            
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);

    ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if(-1 == ret)
    {
        perror("connect");
        exit(1);
    }



    show();

    while(1)
    {
        PrintInfo();
        fgets(num, 2, stdin);

        switch(num[0])
        {
            case '1':
            {
                ret = log_in(sockfd);
                if(ret == -1)
                {
                    printf("\n\n\t\t\t\t\t账号错误!\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                else if(ret == -2)
                {
                    printf("\n\n\t\t\t\t\t密码错误!\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                else if(ret == -3)
                {
                    printf("\n\n\t\t\t\t\t该账号已登录!\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }

                else if(ret == 0)   //进入聊天界面
                {
                    ret = chat(sockfd);
                }
                break;
            }
            case '2':
            {
                ret = regis(sockfd);

                ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                if(recvbuf.sign == 2)
                {
                    system("clear");
                    printf("\n\n\t\t\t\t\t该账号已存在,注册失败\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                else if(recvbuf.sign == 1)
                {
                    system("clear");
                    printf("\n\n\t\t\t\t\t恭喜你,注册成功\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                break;          
            }

            case '3':
            {
                ret = find(sockfd);
                if(-1 == ret)
                {
                    printf("\n\n\t\t\t\t\t没有这个账号!\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                else if(-2 == ret)
                {
                    printf("\n\n\t\t\t\t\t答案错误!\n");
                    fgets(enter, 2, stdin);
                    if (enter[0] == 10)
                    {
                        system("clear");
                    }
                }
                else if(0 == ret)
                {
                    printf("\n\n\t\t\t\t\t恭喜你,密码修改成功!\n");
                    fgets(enter, 20, stdin);
                }
                break;
            }

            case '4':
            {
                Exit(sockfd);
                close(sockfd);
                exit(1);
            }
            case 10:  //回车键
            {
                system("clear");
                break;
            }
            default:
            {
                printf(color_red"\t\t\t\t\t**Unkown Input!\n"color_none);
                printf("\t\t\t\t\t                                            \n");
                printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
                fgets(enter, 2, stdin);
                if (enter[0] == 10)
                {
                    system("clear");
                }
                break;
            }
        }



    }


    return 0;
}

接口

#include "chatroom.h"


void *receive(void *arg)
{
    char n[10][10] = {0};
    int i = 0;
    struct info recvbuf;
    struct info sendbuf;
    int ret, oldtype;
    time_t now;
    struct tm *tm_now;
    char buf[10000];
    char filename[100];
    char enter[10] = {0};
    int fd;
    pthread_t pt;
    pthread_detach(pthread_self());
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);

    while(1)
    {

        memset(&recvbuf, 0, sizeof(recvbuf));
        memset(&sendbuf, 0, sizeof(sendbuf));
        recv(*(int *)arg, &recvbuf, sizeof(recvbuf), 0);
        switch(recvbuf.sign)
        {
            case (1):
            {
                system("clear");
                printf("\n\n\t\t\t\t\t%s 向您发起了聊天\n", recvbuf.name);
                printf("\n\t\t\t\t\t请按y接受 \n");

                break;      
            }       
            case (2):
            {
                memset(buf, 0, sizeof(buf));
                memset(filename, 0, sizeof(filename));
                printf("\t\t\t\t\t\trecv:%s\n", recvbuf.buf);
                now = time(NULL);
                tm_now = localtime(&now);
                sprintf(filename, "%s与%s的聊天记录.txt", recvbuf.username, recvbuf.recvname);
                fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
                sprintf(buf, "%d:%d:%d recv : %s\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, recvbuf.buf);
                write(fd, buf, strlen(buf));
                close(fd);
                break;
            }
            case (3):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t%s 向大家发送了一条消息:", recvbuf.recvname);
                printf("%s\n", recvbuf.buf);

                now = time(NULL);
                tm_now = localtime(&now);
                sprintf(filename, "%s的群聊.txt", recvbuf.username);
                fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
                sprintf(buf, "%d:%d:%d recv from %s: %s\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, recvbuf.recvname, recvbuf.buf);
                write(fd, buf, strlen(buf));
                close(fd);
                fgets(enter, 20, stdin);
                break;  
            }
            case (4):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t%s 向您发送了一个文件\n", recvbuf.recvname);
                break;
            }
            case (5):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t%s 向您发送了一个文件\n", recvbuf.recvname);
                fd = open(recvbuf.filename, O_RDWR | O_CREAT| O_APPEND, 666);
                write(fd, recvbuf.buf, strlen(recvbuf.buf));
                close(fd);
                break;
            }
            case (6):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t%s 向您发送了一个文件\n", recvbuf.recvname);
                printf("\n\n\t\t\t\t\t接收完成!!!\n");
                fgets(enter, 20, stdin);
                break;
            }
            case (-1):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t你被 %s 禁言了!!!\n", recvbuf.name);
                printf("\n\n\t\t\t\t\t你可以开通会员解除禁言\n");
                fgets(enter, 20, stdin);
                break;

            }
            case (-2):
            {
                system("clear");
                printf("\n\n\n\n\n\t\t\t\t\t你被 %s 踢下线了!!!\n", recvbuf.name);

                fgets(enter, 20, stdin);
                return 0;
            }
        }

    }
}


void signalhandler(void)
{
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset,SIGINT);
    sigaddset(&sigset,SIGQUIT);
    sigprocmask(SIG_BLOCK, &sigset, NULL);
}

void show()
{
    char enter[10];
    system("clear");

    printf("\t\t\t\t\t                                              \n");
    printf("\t\t\t\t\t                                              \n");
    printf("\t\t\t\t\t                                              \n");
    printf("\t\t\t\t\t##############################################\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#***************");  
    printf(color_red"欢迎进入聊天室"color_none);
    printf("***************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#*************");
    printf(color_purple"请按回车键进入界面"color_none);                   
    printf("*************#\n")  ;
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t##############################################\n");
    fgets(enter, 2, stdin);
    if (enter[0] == 10)
    {
        system("clear");
    }
}

void PrintInfo()
{
    system("clear");

    printf("\n\n\t\t\t\t\t##############################################\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#***************   1.登录   *****************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#***************   2.注册   *****************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#***************   3.找回密码   *************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#***************   4.退出    ****************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#****************");  
    printf(color_red"按回车键清屏"color_none);
    printf("****************#\n");
    printf("\t\t\t\t\t#********************************************#\n");
    printf("\t\t\t\t\t#                                            #\n");
    printf("\t\t\t\t\t#请输入选项:");
}

int regis(int sockfd)        //注册函数
{
    system("clear");
    struct info sendbuf;
    int ret;

    memset(&sendbuf, 0, sizeof(sendbuf));
    sendbuf.num = 2;

    printf("\n\n\n\t\t\t\t\t请输入账号:");
    scanf("%s", sendbuf.username);
    getchar();
    printf("\n\t\t\t\t\t请输入密码:");
    scanf("%s", sendbuf.passward);
    getchar();
    printf("\n\t\t\t\t\t请输入昵称:");
    scanf("%s", sendbuf.name);
    getchar();
    printf("\n\t\t\t\t\t请输入密保问题:");
    scanf("%s", sendbuf.question);
    getchar();
    printf("\n\t\t\t\t\t请输入密保答案:");
    scanf("%s", sendbuf.key);
    getchar();
    strcpy(sendbuf.member, "n");
    printf("\n\t\t\t\t\t正在注册...\n");
    sleep(1);

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

    return 1;
}

int log_in(int sockfd)    //登录函数
{
    system("clear");
    struct info sendbuf;
    struct info recvbuf;
    int ret;
    memset(&sendbuf, 0, sizeof(sendbuf));
    memset(&recvbuf, 0, sizeof(recvbuf));

    sendbuf.num = 1;
    sendbuf.option = 0;

    printf("\n\n\n\n\n\n\n\t\t\t\t\t账号:");
    scanf("%s", sendbuf.username);
    getchar();
    printf("\n\n\t\t\t\t\t密码:");
    scanf("%s", sendbuf.passward);
    getchar();

    send(sockfd, &sendbuf, sizeof(sendbuf), 0);

    recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
    if(recvbuf.sign == 1)
    {
        return -1;
    }

    else if(recvbuf.sign == 2)
    {
        return -2;
    }

    else if(recvbuf.sign == 3)
    {
        return 0;
    }

    else if(recvbuf.sign == 4)
    {
        return -3;
    }
    return 1;
}

int find(int sockfd)
{
    struct info sendbuf;
    struct info recvbuf;
    char id[100] = {0};
    int ret;


    memset(&sendbuf, 0, sizeof(sendbuf));
    memset(&recvbuf, 0, sizeof(recvbuf));
    sendbuf.num = 3;

    sendbuf.sign = 1;                             //传输账号
    printf("\n\n\n\t\t\t\t\t请输入账号:");
    scanf("%s", sendbuf.username);
    strcpy(id, sendbuf.username);
    getchar();
    send(sockfd, &sendbuf, sizeof(sendbuf), 0);

    recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

    if(recvbuf.sign == 1)
    {
        return -1;
    }
    else if(recvbuf.sign == 2)
    {
        memset(&sendbuf, 0, sizeof(sendbuf));
        sendbuf.num = 3;
        sendbuf.sign = 2;                        //传输答案
        printf("\n\t\t\t\t\t密保问题:%s\n", recvbuf.question);
        printf("\n\t\t\t\t\t请输入密保答案:");
        scanf("%s", sendbuf.key);
        getchar();
        strcpy(sendbuf.username, id);
        send(sockfd, &sendbuf, sizeof(sendbuf), 0);

        memset(&recvbuf, 0, sizeof(recvbuf));
        recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

        if(recvbuf.sign == 1)
        {
            return -2;
        }
        else if(recvbuf.sign == 2)
        {
            memset(&sendbuf, 0, sizeof(sendbuf));
            sendbuf.num = 3;
            sendbuf.sign = 3;               //传输新密码
            strcpy(sendbuf.username, id);
            printf("\n\t\t\t\t\t请输入新密码:");
            scanf("%s", sendbuf.passward);
            getchar();
            send(sockfd, &sendbuf, sizeof(sendbuf), 0);

            memset(&recvbuf, 0, sizeof(recvbuf));
            recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
            if(recvbuf.sign == 1)
            {
                return 0;
            }
        }
    }
}

int Exit(int sockfd)
{
    struct info sendbuf;
    memset(&sendbuf, 0, sizeof(sendbuf));
    sendbuf.num = 4;
    send(sockfd, &sendbuf, sizeof(sendbuf), 0);
    return 1;
}

int chat(int sockfd)            //聊天界面
{
    int ret;
    char enter[10] = {0};
    char num[10] = {0};
    char opt[10] = {0};
    char name[10] = {0};
    char filename[100] = {0};
    int fd;
    struct info sendbuf;
    struct info recvbuf;
    time_t now;
    struct tm *tm_now;

    char buf[10000];

    int i = 0;

    while(1)
    {
        system("clear");
        printf("\n\n\n\n\t\t\t\t正在刷新...\n");
        sleep(1);
        memset(&sendbuf, 0, sizeof(sendbuf));
        memset(&recvbuf, 0, sizeof(recvbuf));
        memset(filename, 0, sizeof(filename));
        sendbuf.num = 5;    
        sendbuf.option = 1;
        sendbuf.chat = -1;
        ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
        ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
        system("clear");

        if(recvbuf.offline == 1)
        {
            memset(&sendbuf, 0, sizeof(sendbuf));
            pthread_cancel(tid);
            sendbuf.num = 5;    //处理聊天
            sendbuf.option = -1;
            ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
            return 0;
        }

        printf("\n\n\t\t\t\t\t\t\t\t\t\t\t\t*****");

            if(recvbuf.speak == 1)
            {
                printf("  状态:");
                printf(color_red"禁言\n"color_none);
            }
            else
            {
                printf("  状态:");
                printf(color_green"在线\n"color_none);
            }
            printf("\t\t\t\t\t\t\t\t\t\t\t\t(^o^)");
            printf("  昵称:%s",recvbuf.name);

            if(strcmp(recvbuf.member, "y") == 0)
            {
                printf(color_yellow" 会员用户\n"color_none);
            }
            else          
            {
                printf(" 普通用户\n");
            }
            printf("\t\t\t\t\t\t\t\t\t\t\t\t*****");
            printf("  在线人数:%d\n\n", recvbuf.online_num);

            printf("\t\t\t\t\t\t\t\t\t\t\t\t1: 私聊\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t2: 群聊\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t3: 发送文件\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t4: 开通会员\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t5: 禁言(需开通会员)\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t6: 解除禁言(需开通会员)\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t7: 踢人(需开通会员)\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t8: 查看在线人数\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t9: 查看聊天记录\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t0: 退出登录\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t按回车刷新\n\n");
            printf("\t\t\t\t\t\t\t\t\t\t\t\t请输入:");
            ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);
            fgets(num, 2, stdin);

            switch(num[0])
            {
                case '1':
                {
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {

                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    getchar();
                    if(recvbuf.speak == 1)
                    {

                        printf("\n\n\n\t\t\t\t\t\t你已被禁言,不能聊天!!!\n");
                        printf("\n\n\n\n\t\t\t\t\t\t请按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;

                    }
                    memset(&sendbuf, 0, sizeof(sendbuf));

                    memset(name, 0, sizeof(name));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = 10;  //发起聊天
                    printf("\n\n\n\n\t\t\t\t\t你想向谁发起聊天:");
                    scanf("%s", name);
                    getchar();

                    if(strcmp(recvbuf.name, name) == 0)
                    {
                        printf("\n\n\t\t\t\t\t你不能与自己聊天哦\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }

                    strcpy(sendbuf.name, name);

                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                    if(recvbuf.sign == 1)
                    {
                        printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    printf("\n\t\t\t\t请等待该用户接受...\n");
                    sleep(3);
                    system("clear");
                    printf("*******************************************************\n");
                    printf("\t%s 的聊天室", name);
                    printf("(输入“bye“退出聊天)\n");
                    ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);

                    while(1)
                    {
                        memset(&sendbuf, 0, sizeof(sendbuf));
                        memset(buf, 0, sizeof(buf));
                        memset(filename, 0, sizeof(filename));
                        strcpy(sendbuf.name, name);
                        sendbuf.num = 5;    //处理聊天
                        sendbuf.option = 1;
                        sendbuf.chat = 1;
                        printf("");
                        scanf("%s", sendbuf.buf);
                        getchar();
                        if(strncmp(sendbuf.buf, "bye", 3) == 0)
                        {
                            pthread_cancel(tid);
                            break;
                        }
                        now = time(NULL);
                        tm_now = localtime(&now);
                        sprintf(filename, "%s与%s的聊天记录.txt", recvbuf.username, name);
                        fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
                        sprintf(buf, "%d:%d:%d send : %s\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, sendbuf.buf);
                        write(fd, buf, strlen(buf));
                        close(fd);

                        send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    }

                    break;
                }
                case '2':
                {
                    system("clear");
                    pthread_cancel(tid);

                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);


                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {

                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    getchar();
                    if(recvbuf.speak == 1)
                    {
                        printf("\n\n\n\n\t\t\t\t你已被禁言,不能聊天\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;

                    }
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    sendbuf.num = 5;
                    sendbuf.option = 2;
                    printf("\n\n\t\t\t\t请输入你想说的话:");
                    scanf("%s", sendbuf.buf);
                    getchar();
                    printf("\n\n\t\t\t\t正在发送...\n");
                    sleep(1);
                    now = time(NULL);
                    tm_now = localtime(&now);
                    sprintf(filename, "%s的群聊.txt", recvbuf.username);
                    fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
                    sprintf(buf, "%d:%d:%d send : %s\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, sendbuf.buf);
                    write(fd, buf, strlen(buf));
                    close(fd);
                    send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    printf("\n\n\t\t\t\t发送成功\n");
                    printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                    fgets(enter, 20, stdin);
                    break;
                }
                case '3':
                {
                    pthread_cancel(tid);
                    system("clear");

                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {

                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    sendbuf.num = 5;
                    sendbuf.option = 3;
                    printf("\n\n\t\t\t\t你想向谁发送:");
                    scanf("%s", sendbuf.name);
                    getchar();

                    if(strcmp(recvbuf.name, sendbuf.name) == 0)
                    {
                        printf("\n\n\t\t\t\t\t你不能给自己发送文件哦\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }

                    printf("\n\t\t\t\t请选择该文件夹中的文件:");
                    scanf("%s", filename);
                    getchar();
                    strcpy(sendbuf.filename, filename);
                    fd = open(filename, O_RDONLY);
                    if(-1 == fd)
                    {
                        printf("\n\t\t\t\t没有这个文件\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    sendbuf.sign = 1;
                    send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    while((ret = read(fd, sendbuf.buf, sizeof(sendbuf.buf))) > 0)
                    {
                        sendbuf.sign = 2;
                        send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                        usleep(1000);
                    }
                    close(fd);
                    printf("\n\n\t\t\t\t正在发送...\n");
                    sleep(1);
                    sendbuf.sign = 3;
                    send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    printf("\n\t\t\t\t发送成功\n");
                    printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                    fgets(enter, 20, stdin);
                    break;
                }
                case '4':
                {   
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    getchar();
                    if(strcmp(recvbuf.member, "y") == 0)
                    {
                        printf("你已经是会员了\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    printf("是否支付 20RMB 成为会员?\n");
                    printf("1:是\n");
                    printf("2:否\n");
                    fgets(opt, 2, stdin);
                    switch(opt[0])
                    {
                        case '1':
                        {
                            getchar();
                            printf("支付完成,恭喜你成为会员\n");
                            printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                            sendbuf.num = 5;
                            sendbuf.option = 4;
                            strcpy(sendbuf.member, "y");
                            ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                            fgets(enter, 20, stdin);
                            break;
                        }
                        case '2':
                        {
                            getchar();
                            printf("很遗憾,你放弃了成为会员的机会\n");
                            printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                            fgets(enter, 20, stdin);
                            break;
                        }
                    }
                    break;
                }
                case '5':
                {
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {

                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    getchar();
                    if(strcmp(recvbuf.member, "n") == 0)
                    {
                        printf("\n\n\t\t\t\t你还不是会员,不能禁言\n");
                        printf("\t\t\t\t快去开通会员吧\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    printf("\n\n\t\t\t\t你想禁言谁:");
                    scanf("%s", sendbuf.name);
                    getchar();
                    if(strcmp(sendbuf.name, recvbuf.name) == 0)
                    {
                        printf("\n\n\t\t\t\t你不能禁言自己哦\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;  
                    }
                    sendbuf.num = 5;
                    sendbuf.option = 5;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                    if(recvbuf.sign == 1)
                    {
                        printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    else if(recvbuf.sign == 2)
                    {
                        printf("\n\n\t\t\t\t此用户已被禁言,无法继续禁言\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    else if(recvbuf.sign == 3)
                    {
                        printf("\n\n\t\t\t\t恭喜你,禁言成功\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }

                }
                case '6':
                {
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    getchar();
                    if(recvbuf.speak != 1)
                    {
                        printf("\n\t\t\t\t你没有被禁言\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    else if(recvbuf.speak == 1)
                    {
                        if(strcmp(recvbuf.member, "n") == 0)
                        {
                            printf("\n\t\t\t\t你还不是会员,不能解除禁言\n");
                            printf("\t\t\t\t快去开通会员吧\n");
                            printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                            fgets(enter, 20, stdin);
                            break;
                        }
                        else if(strcmp(recvbuf.member, "y") == 0)
                        {
                            sendbuf.num = 5;
                            sendbuf.option = 6;
                            ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                            printf("\n\n\n\n\t\t\t\t恭喜你成功解除禁言!\n");
                            printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                            fgets(enter, 20, stdin);
                            break;
                        }
                    }

                }
                case '7':
                {
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);


                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {

                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    getchar();
                    if(strcmp(recvbuf.member, "n") == 0)
                    {
                        printf("\n\t\t\t\t你还不是会员,不能踢人\n");
                        printf("\t\t\t\t快去开通会员吧\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    printf("\n\t\t\t\t你想踢谁:");
                    scanf("%s", sendbuf.name);
                    getchar();
                    if(strcmp(sendbuf.name, recvbuf.name) == 0)
                    {
                        printf("\n\t\t\t\t你不能踢自己哦\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;  
                    }
                    sendbuf.num = 5;
                    sendbuf.option = 7;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                    if(recvbuf.sign == 1)
                    {
                        printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                    else if(recvbuf.sign == 2)
                    {
                        printf("\n\t\t\t\t此用户已被你踢下线\n");
                        printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                        fgets(enter, 20, stdin);
                        break;
                    }
                }
                case '8':
                {
                    system("clear");
                    pthread_cancel(tid);
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                    getchar();
                    printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
                    for(i = 0; i < recvbuf.online_num; i++)
                    {
                        if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.n[i]);
                        }                           
                        else
                        {
                            printf("\t\t\t\t\t\t\t\t\t\t\t\t%s\n", recvbuf.n[i]);
                        }

                    }
                    printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                    fgets(enter, 20, stdin);
                    break;
                }
                case '9':
                {
                    pthread_cancel(tid);

                    system("clear");

                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);

                    printf("\t\t\t\t\t\t\t\t\t\t\t\t%s(自己)\n", recvbuf.name);

                        getchar();
                        printf("\n\t\t\t\t1.查询私聊记录\n");
                        printf("\n\t\t\t\t2.查询群聊记录\n");
                        printf("\n\t\t\t\t请输入:");

                        fgets(opt, 2, stdin);
                        switch(opt[0])
                        {
                            case'1':
                            {
                                printf("\t\t\t\t你想查看与谁的聊天记录:");
                                scanf("%s", name);
                                getchar();

                                sprintf(filename, "%s与%s的聊天记录.txt", recvbuf.username, name);
                                fd = open(filename, O_RDONLY);
                                if (ret == -1)
                                {
                                    printf("\n\t\t\t\t没有记录\n");
                                }
                                while(1)
                                {
                                    memset(buf, 0, sizeof(buf));
                                    ret = read(fd, buf, sizeof(buf));
                                    if(ret == 0)
                                    {
                                        close(fd);
                                        break;
                                    }
                                    printf("%s\n", buf);
                                }
                                printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                                fgets(enter, 20, stdin);
                                break;
                            }
                            case'2':
                            {
                                getchar();
                                sprintf(filename, "%s的群聊.txt", recvbuf.username);
                                fd = open(filename, O_RDONLY);
                                if (ret == -1)
                                {
                                    printf("\n\t\t\t\t没有记录\n");
                                }
                                while(1)
                                {
                                    memset(buf, 0, sizeof(buf));
                                    ret = read(fd, buf, sizeof(buf));
                                    if(ret == 0)
                                    {
                                        close(fd);
                                        break;
                                    }
                                    printf("%s\n", buf);
                                }
                                printf("\n\n\n\t\t\t\t\t按回车键返回\n");
                                fgets(enter, 20, stdin);
                                break;
                            }

                        }

                    break;
                }

                case 'y':
                {
                    pthread_cancel(tid);

                    printf("\n\n\t\t\t\t\t请输入对方名字:");
                    scanf("%s", name);
                    getchar();
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    memset(&recvbuf, 0, sizeof(recvbuf));
                    sendbuf.num = 5;    
                    sendbuf.option = 1;
                    sendbuf.chat = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
                    system("clear");
                    printf("*******************************************************\n");
                    printf("\t%s 的聊天室", name);
                    printf("(输入“bye“退出聊天)\n");
                    ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);
                    while(1)
                    {

                        memset(&sendbuf, 0, sizeof(sendbuf));
                        memset(filename, 0, sizeof(filename));
                        memset(buf, 0, sizeof(buf));
                        strcpy(sendbuf.name, name);
                        sendbuf.num = 5;    //处理聊天
                        sendbuf.option = 1;
                        sendbuf.chat = 1;
                        printf("");
                        scanf("%s", sendbuf.buf);
                        getchar();

                        if(strncmp(sendbuf.buf, "bye", 3) == 0)
                        {
                            pthread_cancel(tid);
                            break;
                        }
                        now = time(NULL);
                        tm_now = localtime(&now);
                        sprintf(filename, "%s与%s的聊天记录.txt", recvbuf.username, name);
                        fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
                        sprintf(buf, "%d:%d:%d send : %s\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, sendbuf.buf);
                        write(fd, buf, strlen(buf));
                        close(fd);

                        send(sockfd, &sendbuf, sizeof(sendbuf), 0);

                    }
                    break;
                }
                case '0':
                {
                    getchar();
                    memset(&sendbuf, 0, sizeof(sendbuf));
                    pthread_cancel(tid);
                    sendbuf.num = 5;    //处理聊天
                    sendbuf.option = -1;
                    ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
                    return 0;
                }
                case 10:  //回车键
                {
                    pthread_cancel(tid);
                    break;
                }
                default:
                {
                    pthread_cancel(tid);
                    printf(color_red"\t\t\t\t\t**Unkown Input!\n"color_none);
                    printf("\t\t\t\t\t                                            \n");
                    printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
                    fgets(enter, 20, stdin);
                    break;
                }
            }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值