头文件:
#ifndef _CHATROOM1_H_
#define _CHATROOM1_H_
//************库函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
#include <sqlite3.h>
#include <time.h>
#include <strings.h>
#include <semaphore.h>
#include <termios.h>
#include <signal.h>
//************宏定义
#define PORT 8888
#define SUCCESS 10000000
#define FAILURE 10000001
#define RESIGER 1
#define LOGIN 2
#define OK 3 //发送成功
#define ERROR 4
#define FIND 5
#define SAME 6
#define SEND 7 //发送消息
#define UN 8 //不在线
#define MSG 9 //收到悄悄话
#define NUM 10 //查看在线人数
#define EXIT 11
#define GROUP 12
#define ERR 13 //群聊没人在线
#define ES 14 //表情
#define PS 15 //常用语
#define VIP 16
#define TALK 17 //解禁
#define SHUTUP 18 //禁言
#define OKK 19
#define OUTLINE 20
#define OKKK 21
#define SENDFILE 22
#define UNRE 23
#define REOK 24
//**************线程
pthread_t tid = 0;
//*************结构体
struct online // 在线链表
{
int sockfd;
char name[20];
struct online* next;
};
typedef struct online* LinkList;
struct senduser // 用户信息表
{
char id[20];
char name[20];
char toname[20];
char password[20];
char code[20]; //密保
char msg[200];
char onlinenum[30][30]; //在线的人
char filename[20];
char filemsg[200];
int e_s;
int p_s;
int vip; //1是vip 0则不是
int state; //1是被禁言 0则不是
int number; //人数
int cmd;
};
#endif
服务器:
#include "chatroom1.h"
int InitList(LinkList *l)
{
(*l) = (LinkList)malloc(sizeof(struct online));
(*l)->next = NULL;
}
int main()
{
//*******************初始化****************
sqlite3 *ppdb;
char sql[200] = {0};
int opt = 1, i = 0, j;
int sockfd, ret, fd[100] = {0};
struct senduser Recvbuf = {0};
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
fd_set Readfd, Tmpfd;
int maxfd;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("socket");
exit(1);
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = PF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.119");
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
printf("start server!\n");
//************初始化链表******************
LinkList online;
InitList(&online);
//******************创建开启数据库*****************************************
ret = sqlite3_open("user.db",&ppdb);
if(ret != SQLITE_OK)
{
perror("open");
exit(1);
}
printf("sqlite3 success!\n");
sprintf(sql, "create table if not exists user(id text primary key, password text, name text, code text, vip integer, state integer);");
ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);
if(ret != SQLITE_OK)
{
perror("exec1");
exit(1);
}
printf("create user db success!\n");
//******************绑定***************************************
ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(-1 == ret)
{
perror("bind");
exit(1);
}
ret = listen(sockfd, 8);
if(-1 == ret)
{
perror("listen");
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");