📄 socketchat.h
字号:
/*
Version: 0.2.0(stable)
Author: Computer_xu
Email: Computer_xu@sina.com
HomePage: http://www.socketchat.com
LastModify: 2001-05-04 (yyyy-mm-dd)
*/
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <crypt.h>
#include <netdb.h>
#include <mysql.h>
#include <errmsg.h>
#include <arpa/inet.h>
#ifndef SIGCLD
#define SIGCLD SIGCHLD
#endif
#define MAXSOCKADDR 128
#define DefaultHTML "login.htm"
#ifndef PTHREAD_THREADS_MAX
/*注意:低于2.4.0的linux版本请不要修改这个定义,
这个定义在低于2.4.0的linux版本上有效 */
#define PTHREAD_THREADS_MAX 1024
#endif
typedef struct actface /* 表情动作数据 */
{
unsigned int actid; /* Index No. */
char *name; /* /action */
char *action; /* show in IE */
char *msg1,*msg2; /* toself msg and to other msg */
int flag; /* 快捷操作支持(在用户端的下拉菜单中显示) */
unsigned long int time; /* 使用的次数 */
struct actface *next;
} ActFace;
/* Split 结构: 用于实现Perl split功能 */
typedef struct splitlink
{
char *msg;
struct splitlink *next;
} SPLIT;
typedef struct mydb
{
MYSQL *mysql;
char *host;
char *user;
char *passwd;
char *db;
unsigned int port;
char *unix_socket;
unsigned int client_flag;
} MyDB;
typedef struct doccache /* 文件缓存 */
{
char *filename; /* 文件名字 */
char *filedata; /* 文件数据 */
off_t size; /* 大小(字节为单位) */
time_t lasttime; /* 最后修改时间 */
struct doccache *next;
} DocCache;
typedef struct banlist {
char *ban;
char mode; /* mode=1 ==> ban = id, mode=2 ==> ban = ip */
time_t time; /* ban time */
time_t end; /* end time */
int roomid; /* -1 is all room */
struct banlist *next;
} BANLIST;
typedef struct formdata /* 表单数据 */
{
char *name;
char *value;
unsigned long int other;
struct formdata *next;
} FormData;
typedef struct querydata /* Query数据 */
{
char *name;
char *value;
struct querydata *next;
} QueryData;
typedef struct requestinfo /* 请求信息 */
{
char *name;
char *value;
struct requestinfo *next;
} RequestInfo;
typedef struct requestdata
{
RequestInfo *Request;
QueryData *Query;
FormData *Form;
} RequestData;
/* 定义聊天信息数据结构 */
typedef struct chatmsg
{
unsigned int roomid;
char id[21];
char toid[21];
unsigned int face;
unsigned int action;
char msg[2048];
unsigned int hidden;
struct chatmsg *next;
} CHATMSG;
/* 定义用户数据结构 */
typedef struct userinfo
{
char userid[21];
char nickname[21];
char password[21];
char sex[11];
unsigned int status;
char readme[401];
char email[101];
int bekick; /* 被踢的次数,达到KICKED则踢出 */
char sid[49]; /* session id userid+password */
unsigned int roomid;
int level; /* 级别 */
int n_manager; /* 管理员编号 */
char ip[17]; /* ip address */
struct userinfo *next;
/* status 16 bits, default=0x000e
15 在线(online)
14 1 包箱开,0 包箱关
13 直接踢人,ChatAdmin(站长,15级) 0x2000
12 群体踢人时具有50%的能力,ChatMaster(站内管理员,14级) 0x1000
11 群体踢人时具有20%的能力,RoomOwner(室主,13级) ---> 对应roomid 0x0800
10 看到IP 0x0400
09 看到私聊内容 0x0200
08
07
06
05
04
03* 可以查询其他用户的信息
02* 可以群体踢人
01* 普通用户,可以聊天(以注册)
00 只能看别人说话(未注册, guest)
*/
} USERINFO;
/* 定义房间信息数据结构 */
typedef struct roominfo
{
int mode; /* mode = 0, 系统房间 mode = 1, 用户自建房间 */
unsigned int roomid; /* from 1 to max */
unsigned int usernum; /* Online User Num */
char roomname[41];
char welcome[201]; /* 进入房间后显示的欢迎信息 */
char topic[201]; /* 房间主题简介 */
char password[21];
char managelist[10][21]; /* 最多有10名管理员,每个房间 */
struct roominfo *next;
} ROOMINFO;
/* 连接句柄状态结构 */
typedef struct socket_info
{
int pid;
int socketfd;
int status; /* status=0 未用, status=1 已用 */
time_t lasttime; /* 最后一次发送信息的时间 */
CHATMSG *last;
USERINFO *user;
struct socket_info * next;
} SOCKET_INFO;
/* 线程状态结构 */
typedef struct pthread_info
{
pthread_t pid;
int status;
struct pthread_info * next;
} PTHREAD_INFO;
typedef struct sysinformation
{
unsigned int nPort; /* 侦听端口 6666 */
unsigned int MsgBufLen; /* 聊天信息队列长度 4096 */
unsigned int MsgLeftWarning; /* 聊天信息队列余量警戒线 128 */
unsigned int nKicked; /* 被踢次数达到此数量则被踢出聊天室 10 */
unsigned int PthreadBufLen; /* 线程队列长度 200 */
unsigned int PthreadLeftWarning; /* 线程队列余量警戒线 20 */
unsigned int SocketBufLen; /* 用户连接句柄队列长度 200 */
unsigned int SocketLeftWarning; /* 用户连接句柄队列余量警戒线 20 */
CHATMSG *MSG_END; /* 指向最后说的一句话 */
ROOMINFO *ROOM_HEAD; /* 指向第一个房间的信息 */
unsigned int roomnum; /* 房间数量 0*/
USERINFO *USER_HEAD; /* 指向第一个用户数据 */
unsigned long int usernum; /* 注册用户数量 0*/
unsigned int onlineuser; /* 在线用户 0*/
unsigned int maxuser; /* 历史最高在线 0 */
PTHREAD_INFO *PTHREAD_HEAD; /* 指向线程状态数据的第一条记录 */
SOCKET_INFO *SOCKET_HEAD; /* 指向连接句柄状态数据的第一条记录 */
DocCache *Cache_HEAD; /* HTML文件缓存 */
ActFace *action; /* 动作 */
unsigned int action_num;
unsigned int linkcount; /* 响应请求计数 */
} SYSINFO;
extern void *Malloc(unsigned int);
extern void *Realloc(void *, unsigned int);
extern void Free(void *);
extern FILE *Fopen(char *, char *);
extern SPLIT * split(char *, char *);
extern SPLIT * free_split(SPLIT *);
extern char * ExChange(char *, char *, char *);
extern void del_ch(char *, char);
extern int StrCmp(const char *, const char *);
extern int StrnCmp(const char *, const char *, unsigned int );
extern unsigned int Strlen(const char *s);
extern char *AddToCache(char *, unsigned long *);
extern void DelFromCache(char *);
extern char *GetFileData(char *, unsigned long *);
extern void Func_Login(int connfd, RequestData *);
extern void Func_Enter(int connfd, RequestData *);
extern void Func_Logout(int connfd, RequestData *);
extern void Func_OnlineUserList(int connfd, RequestData *);
extern void Func_FindUser(int connfd, RequestData *);
extern int Func_ChatMessage(int connfd, RequestData *);
extern void Func_Say(int connfd, RequestData *);
extern void Func_Cmd(char *, char *, char *, char *, char *, char *);
extern void Func_Act(char *, char *, char *, char *);
extern void a2c(char *);
extern FormData * GetFormData(char *);
extern char * GetFormVarValue(FormData *,char *);
extern FormData * FreeFD(FormData *);
extern QueryData * GetQueryData(char *);
extern char * GetQueryVarValue(QueryData *,char *);
extern QueryData * FreeQD(QueryData *);
extern RequestInfo *GetRequestInfo(int ,char *);
extern char * GetRIVarValue(RequestInfo *,char *);
extern RequestInfo * FreeRI(RequestInfo *);
extern RequestData * GetRequestData(int);
extern RequestData * FreeRD(RequestData *);
extern void ForceSend();
extern void AddWords(unsigned int , char *, char *, unsigned int , char *, char *, char *, unsigned int );
extern void *SendData(void *);
extern MyDB * CreateMyDB(char *, char *, char *, char *);
extern void OpenMyDB(MyDB *);
extern void ReOpenMyDB(MyDB *);
extern int QueryMyDB(MyDB *, char *, int );
extern void ErrorMyDB(MyDB *);
extern MyDB * FreeMyDB(MyDB *);
extern MYSQL_RES *MySqlStoreResult(MyDB *);
extern int chkusrpw(char *, char *);
extern unsigned int GetUserStatus(char *);
extern unsigned int LevelRight(int , char *);
extern USERINFO *NewUserInfo();
extern int AddUserOnline(char *, char *, char *,char *, char *, char *);
extern int Login(char *, char *, char *,char *, char *, char *);
extern char *GetID(char *);
extern char *GetNN(char *);
extern USERINFO *GetUP(char *);
extern char *GetRN(int );
extern ROOMINFO *GetRP(int );
extern void OutPutUserList(int ,int );
extern void OutPutRoomList(int );
extern char *GenUID(char *);
extern void IncSocketBuf();
extern int AddSocket(int, USERINFO *);
extern void DelSocket(USERINFO *);
extern void AntiTimeout();
extern char * GetSocketIP(int);
extern unsigned int GetSocketPort(int);
extern void GetTimeString(char *);
extern void sig_quit();
extern void InitSystem();
extern void *thread_main(void *);
extern void thread_make(PTHREAD_INFO *);
extern void WriteHeader(int );
extern void WriteRedirect(int , char *);
extern int WebChild(int );
extern int Mcount;
extern int sockfd;
extern pthread_mutex_t cache_mutex;
extern BANLIST *BanList;
extern pthread_mutex_t msg_mutex;
extern pthread_cond_t msg_cond;
extern pthread_mutex_t addwords_mutex;
extern MyDB *sqlfd;
extern pthread_mutex_t user_mutex;
extern pthread_mutex_t addsocket_mutex;
extern SYSINFO sysinfo;
extern pthread_mutex_t acclock;
extern char *r200, *r302, *notfound, *header, *end, *version;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -