基于Linux系统的TCP协议的即时通信系统

该博客介绍了如何在Linux系统中使用TCP协议开发一个即时通信系统,包括用户注册、登录、私聊、群聊、查看在线好友、修改密码、管理员权限管理(禁言、解禁、踢人)以及发送离线消息等功能。通过解析客户端命令,服务器与数据库交互来管理用户状态和消息传递。
摘要由CSDN通过智能技术生成

最近几天写了这个聊天室。一开始写的有点混乱,也有一些地方待改进。
实现功能:
1、注册用户:
当服务器解析到客户端传过来的命令是“注册”时,生成一个随机数作为账号,和用户名,密码插入到数据库中的注册列表中。
2、用户登录:
当服务器解析到客户端传过来的命令是“登录”时,到数据库中的注册列表中查找用户id和密码是否吻合;如果吻合,则创建一个结点保存用户的信息,插入到“在线链表”中。此外,到数据库中的离线消息列表中查看是否有“离线消息”,如果有直接打印。
3、私聊:
当服务器解析到客户端传过来的命令是“私聊”时,会首先判断此客户端是否被禁言,如果被禁言则没有发言权限,如果没有被禁言,则服务器会遍历“在线链表”,找到接收客户端。
4、群聊:
此用户没有被禁言,可以给除自己外,所有在线用户一次发送消息。
5、查看在线好友:
遍历在线链表
6、修改密码:
7、管理员的权限:
禁言(被禁言可以接收消息)、解禁、踢人(就是将用户从在线链表中删除)。
8、发送离线消息:
保存到数据库中的离线消息列表中。
部分代码如下:
client.c

#include "myhead.h"

int flag = 0;
int log_2_flag = 0;

int admin = 0;

void *read_msg(void *argc);

int main(int argc, char **argv)
{
    //参数入口检查;
    if(argc != 2)
    {
    perror("argc");
    return -1;
    }
    int socketfd = 0;
    int ret = 0;

    struct sockaddr_in sock_server = {
  0};

    socketfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == socketfd)
    {
    perror("socket");
    return -1;
    }
    printf("socket success...\n");

    //用sock_server提醒你们这边连接的是服务器端的IP地址和端口号;
    sock_server.sin_family = AF_INET;
    sock_server.sin_port = htons(MYPORT);
    //sock_server.sin_addr.s_addr = inet_addr(MYADDR);
    sock_server.sin_addr.s_addr = inet_addr(argv[1]);

    ret = connect(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));
    if(ret == -1)
    {
        perror("connect");
        return -1;
    }
    printf("connect success...\n");

    int sendcnt = 0;
    int recvcnt = 0; 

    //char sendbuff[20] = {0};

    struct message Msg = {
  0};

    pthread_t th = 0;

    if (pthread_create(&th, NULL, read_msg, &socketfd) != 0)
    {
        perror("Client: pthread_create");
    return -1;
    }

    while(1)
    {
        bzero(&Msg, sizeof(Msg));

        Interface_1(); 
        scanf("%d", &Msg.action1);
        if(3 == Msg.action1)
        {
            break;
        }

    switch(Msg.action1)
    {
        case 1:
                Log(&Msg);
            sendcnt = write(socketfd, &Msg, sizeof(struct message));
            if (-1 == sendcnt)
            {
                perror("send");
                return -1;
                }
                sleep(1);

                while(1 == flag)
                {
                    bzero(&Msg, sizeof(Msg));
                    if(0 == flag)
                    {
                        break;
                    }
                    sleep(1);
                    Interface_2();
                    scanf("%d", &Msg.action2);
                    if(0 == flag)
                    {
                        break;
                    }
                    switch(Msg.action2)
                    {
                        case 1:
                            printf("在线好友:\n");
                        sendcnt = write(socketfd, &Msg, sizeof(struct message));
                        if (-1 == sendcnt)
                        {
                            perror("send");
                            return -1;
                            }
                            break;
                        case 2:
                            printf("请选择你想要私聊的对象:\n");
                            scanf("%d", &Msg.toid);
                            printf("请输入你想要对%d说的话:\n", Msg.toid);
                            scanf("%s", Msg.information);
                        sendcnt = write(socketfd, &Msg, sizeof(struct message));
                        if (-1 == sendcnt)
                        {
                            perror("send");
                            return -1;
                            }
                            break;
                        case 3:
                            printf("请输入你想对大家说的话:\n");
                            scanf("%s", Msg.information);
                        sendcnt = write(socketfd, &Msg, sizeof(struct message));
                        if (-1 == sendcnt)
                        {
                            perror("send");
                            return -1;
                            }
                            break;
                        case 4:
                            Log_2(&Msg);
                        sendcnt = write(socketfd, &Msg, sizeof(struct message));
                        if (-1 == sendcnt)
                        {
                            perror("send");
                            return -1;
                            }
                            sleep(1);

                            if(1 == log_2_flag)
                            {
                                printf("账号,密码正确!\n");
                                Alter_psw(&Msg);
                                sendcnt = write(socketfd, &Msg, sizeof(struct message));
                                if (-1 == sendcnt)
                                {
                                    perror("send");
                                    return -1;
                                }
                                printf("密码修改成功,请重新登录!\n");
                                break;
                            }
                            printf("账号,密码有误!\n");
                            flag = 0;
                        case 5:
                            printf("请输入管理员密码:\n");
                            scanf("%s", Msg.buff);
       
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值