⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketchat.h

📁 一个C语言的聊天室源代码
💻 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 + -