📄 253.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="246.htm">上一层</a>][<a href="254.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: SocketChat 技术支持文档 <br>
发信站: UNIX编程 (2001年09月27日12:54:41 星期四), 站内信件 <br>
<br>
:http://www.socketchat.com <br>
:给写聊天室的朋友参考 <br>
SocketChat 技术支持文档 <br>
声明 <br>
本系统的发布和开发是以OpenSource为基础的 <br>
原始版本的版权归Computer_Xu所有 <br>
任何个人或组织都可以在此程序的基础之上修改此程序 <br>
以扩展功能和提高性能 <br>
您需要做的就是把修改后的源代码通过E-mail发送给我 <br>
我将会及时的公布您的开发成果 <br>
便于大家之间更好的交流和学习 <br>
如果你开发的程序用于商业用途,不方便公开源代码 <br>
也请您通知我,或者提供演示版本 <br>
让大家能够看到这个系统的性能 <br>
站在巨人的肩膀上我能够看得更远 <br>
1.文件说明 <br>
[WEB] WEB页面的HTML文档 <br>
[SOURCE] 系统主要程序 <br>
*.c *.h 程序 <br>
Makefile make文件 <br>
[DOC] 相关文档 <br>
getpost.txt 一个get和post的数据实例 <br>
address.txt 部分参考文档的连接 <br>
readme.doc 本文档 <br>
database.txt 采用的SQL数据库结构(暂定) <br>
cgi.c cgi.h 我写的C-CGI函数库 <br>
bugs-YYYY-MMDD.txt 错误修正报告 <br>
history.txt 历史更新表 <br>
2.系统安装 <br>
所有操作均基于Linux,如果您使用其它的Unix系统您可能需要用到Pth库,可以从我的 <br>
主页上下载,建议使用GNU的C编译器。 <br>
请根据系统Mysql的开发环境的安装位置修改source/Makefile文件中INC和LIB变量。 <br>
A. 从我的主页(http://socketchat.yeah.net)下载最新版的源程序 <br>
B. 把schat.zip上载到linux机器上 <br>
C. 增加一用户chatadmin <br>
D. unzip schat.zip <br>
E. 成为root <br>
F. cd source <br>
G. make <br>
H. make install <br>
I. make clean <br>
I. make clean <br>
J. 按照doc/database.txt的语句,建立MySql数据库 <br>
3.启动系统 <br>
使用chatadmin登陆 <br>
cd web <br>
./socketchat <br>
注意:如果这时出现错误: <br>
error in loading shared libraries: libmysqlclient.so.6: cannot open shared o <br>
bject file: No such file or directory <br>
说明你的Mysql开发库的位置没有连接到系统开发库的目录请根据Mysql开发库的版本修 <br>
改下列指令的路径,然后把Mysql开发库连接到系统开发库的目录里。 <br>
ln -s /usr/local/lib/mysql/libmysqlclient.so.6.0.0 /lib/libmysqlclient.so <br>
ln -s /usr/local/lib/mysql/libmysqlclient.so.6.0.0 /lib/libmysqlclient.so.6 <br>
ln -s /usr/local/lib/mysql/libmysqlclient.so.6.0.0 /lib/libmysqlclient.so.6. <br>
0.0 <br>
然后再浏览器地址栏里输入:http://YourHostIp:6666/login.htm <br>
4.系统流程 <br>
main <br>
{ <br>
初始化 <br>
创建向用户发送信息的线程 <br>
创建一定数量的线程用于相应用户端的web请求 <br>
设置信号处理程序 <br>
主进程挂起 <br>
} <br>
以下系统说明为0.0.3版本,分模块后的说明暂未提供,现有的函数改动不大,只是新增 <br>
了几个数据库接口的函数,所以以下大部分的内容,对0.0.4版本仍然有效。 <br>
新的0.0.4版本,修改了用户认证的部分(mysqlfunc.* 和 roomuser.*),完善了缓存 <br>
处理部分(cache.*)。 <br>
由于新版本的几个函数还没有完全考虑好,以后可能或有变动,所以这部分的文档可能 <br>
要等到0.0.6版本才会增加进来。 <br>
5.系统说明 第一部分 结构说明 <br>
A. SPLIT结构:配合split函数用于实现将一个字符串分割成多个字符串 <br>
B. USERINFO用户信息结构: <br>
Userid[20] 用户唯一标识 <br>
Nickname[20] 昵称 <br>
Password[20] 密码 <br>
Sex[10] 性别 <br>
Status 状态 <br>
status 16 bits, default=0000000000001110b(0x000e) <br>
15 在线(online) <br>
14 1 包箱开,0 包箱关 <br>
13 直接踢人,ChatAdmin <br>
12 群体踢人时具有50%的能力,ChatMaster <br>
11 群体踢人时具有20%的能力,RoomOwner对应roomid <br>
10 看到IP <br>
09 看到私聊内容 <br>
08 <br>
07 <br>
06 <br>
05 <br>
04 <br>
03 可以查询其他用户的信息 <br>
02 可以群体踢人 <br>
01 普通用户,可以聊天(以注册) <br>
00 只能看别人说话(未注册, guest) <br>
Readme 简介,自我介绍 <br>
Realname 真实性名 <br>
Born_year 出生的年 <br>
Born_month 出生的月 <br>
Born_day 出生的日 <br>
Email 电子邮件 <br>
Bekick 被踢的次数(达到一定的数量则被提出聊天室) <br>
Sid 确认用户端连接的session id <br>
Roomid 所在房间的编号 <br>
Ip 用户的ip地址 <br>
C. ROOMINFO房间信息结构 <br>
Mode =0 系统房间,=1用户开设的房间 <br>
Roomid 从1到Max,房间唯一标识 <br>
Usernum 在线用户数量 <br>
Roomname 房间名字 <br>
Welcome 进入房间后显示的欢迎词 <br>
Topic 房间主题简介 <br>
Password 房间密码 <br>
Managelist 管理员列表 <br>
D. CHATMSG 聊天信息结构(环形链表) <br>
Roomid 指明发送和显示这条信息的房间ID <br>
Id 说话人的ID <br>
Toid 收到这句话的ID <br>
Face 表情 <br>
Action 动作 <br>
Msg[400] 所说的话 <br>
Hidden =1私聊,=0公开 <br>
E. PTHREAD_INFO线程状态结构 <br>
Pid 线程id <br>
Status 线程状态 <br>
F. SOCKET_INFO连接句柄状态结构 <br>
Pid 处理此连接的线程ID <br>
Socketfd 连结句柄 <br>
Status 状态( =0 未用,=1使用中 ) <br>
Lasttime 最后一次发送信息的时间 <br>
Last 指向最后发送的一条信息 <br>
User 指向使用此连接的用户信息 <br>
G. DocCache文件缓存结构 <br>
Filename 文件名字 <br>
Filedata 文件内容 <br>
Size 文件长度 <br>
H. FormData表单数据结构 <br>
Name 表单的变量名 <br>
Value 对应的值 <br>
Other 保留 <br>
I. QueryData Query数据结构 <br>
Name Query变量名 <br>
Value 对应的值 <br>
J. ActFace表情动作数据结构 <br>
Name 未定 <br>
Value 未定 <br>
K. Sysinfo 系统数据封装结构(其后是默认值) <br>
nPort 侦听端口 6666 <br>
MsgBufLen 聊天信息队列长度 4096 <br>
MsgLeftWarning 聊天信息队列余量警戒线 128 <br>
NKicked 被踢次数达到此数量则被踢出聊天室 10 <br>
PthreadBufLen 线程队列长度 200 <br>
PthreadLeftWarning 线程队列余量警戒线 20 <br>
SocketBufLen 用户连接句柄队列长度 200 <br>
SocketLeftWarning 用户连接句柄队列余量警戒线 20 <br>
*MSG_END 指向最后说的一句话 <br>
*ROOM_HEAD 指向第一个房间的信息 <br>
roomnum 房间数量 0 <br>
*USER_HEAD 指向第一个用户数据 <br>
usernum 注册用户数量 0 <br>
onlineuser 在线用户 0 <br>
maxuser 历史最高在线 0 <br>
*PTHREAD_HEAD 指向线程状态数据的第一条记录 <br>
*SOCKET_HEAD 指向连接句柄状态数据的第一条记录 <br>
*Cache_HEAD HTML文件缓存 <br>
*FormData_HEAD 表单数据 <br>
*QueryData_HEAD Query_String数据 */ <br>
*face 表情 <br>
face_num 表情的总数量 <br>
*action 动作 <br>
action_num 动作的总数量 <br>
6.系统说明 第二部分 函数说明 <br>
A.void * Malloc(unsigned int size); <br>
内存分配 <br>
B.void * Realloc(void *p,unsigned int size); <br>
内存重新分配 <br>
C.FILE * Fopen(char *filename, char *mode); <br>
打开文件 <br>
D.SPLIT * split(char *string,char *substr); <br>
把以substr为分割符号的字符串string分割为多个字符串 <br>
E.SPLIT * free_split(SPLIT * link); <br>
释放SPLIT结构占用的内存 <br>
F.char * ExChange(char *str,char *str1,char *str2); <br>
把str中的str1替换为str2 <br>
G.void del_ch(char *string,char ch); <br>
删除string中包含的字符ch <br>
H.char * AddToCache(char *filename); <br>
增加文件filename到Cache,并返回文件内容 <br>
I. char * GetFileData(char *filename); <br>
获取文件内容 <br>
J. void AntiTimeout(); <br>
防止吊线(当300秒没有任何人说话,浏览器就不会收到任何消息,到时就会关闭Socke <br>
t通道,造成断线) <br>
K.void IncSocketBuf(); <br>
增加套接口队列,以容纳更多的用户 <br>
L.void AddSocket(int socketfd, USERINFO *user); <br>
把socketfd,user加入到套接口队列中 <br>
M. har * GetSocketIP(int connfd); <br>
取得套接口connfd的IP地址字符串 <br>
N. nsigned int GetSocketPort(int connfd); <br>
取得套接口connfd的端口 <br>
O. void GetTimeString(char *p); <br>
取得当前时间的字符串 <br>
P. void AddWords(unsigned int roomid, char *id, char *toid, unsigned int fa <br>
ce, unsigned int action, char *msg, unsigned int hidden); <br>
增加一句话到聊天信息队列 <br>
Q. void ForceSend(); <br>
强制发送队列中的数据到用户端 <br>
R. void * thread_main(void *arg); <br>
线程预处理函数(真正线程的壳,调用真正的线程) <br>
S. void thread_make(PTHREAD_INFO *p); <br>
线程创建函数 <br>
T. int WebChild(int); <br>
真正的线程(负责相应客户端的HTTP请求) <br>
U. void * SendData(void* connfd); <br>
像套接口队列中的所有套接口发送聊天信息数据 <br>
V. void a2c(char *); <br>
FormData *GetFormData(char *content_data); <br>
char * GetFormVarValue(FormData *rp,char *var); <br>
QueryData *GetQueryData(char *string); <br>
char * GetQueryVarValue(QueryData *rp,char *var); <br>
这一组是处理表单和QUERY_STRING数据的函数 <br>
W. int chkusrpw(char *id,char *pw,char *sid); <br>
用户认证 <br>
char * GetID(char *nn); 通过匿称获取用户ID <br>
char * GetNN(char *id); 通过用户ID获取匿称 <br>
USERINFO *GetUP(char *nn); 通过匿称获取用户信息数据节点 <br>
char * GetRN(char *id); 通过房间ID获取房间名字 <br>
ROOMINFO *GetRP(char *id); 通过房间ID获取房间信息数据节点 <br>
这是一组用户与房间信息的函数 <br>
X.void sig_quit(); 处理退出信号 <br>
Void InitSystem(); 初始化系统 <br>
7.系统说明 第三部分 线程锁 <br>
保证任一时刻只有一个线程阻塞在Accept,避免惊群产生的 <br>
pthread_mutex_t mlock=PTHREAD_MUTEX_INITIALIZER; <br>
在没有数据更新的时候让发送数据线程进入睡眠的 <br>
pthread_mutex_t msg_mutex=PTHREAD_MUTEX_INITIALIZER; <br>
唤醒发送数据线程的 <br>
pthread_cond_t msg_cond=PTHREAD_COND_INITIALIZER; <br>
防止写Cache函数重入的 <br>
pthread_mutex_t cache_mutex=PTHREAD_MUTEX_INITIALIZER; <br>
防止写聊天信息函数重入的 <br>
pthread_mutex_t addwords_mutex=PTHREAD_MUTEX_INITIALIZER; <br>
防止写套接口函数重入的 <br>
pthread_mutex_t addsocket_mutex=PTHREAD_MUTEX_INITIALIZER; <br>
重入: <br>
某些函数使用了全局变量,在修改这些全局变量的时候其他的函数是不能修改这个全局 <br>
变量的,直到这个函数运行结束。 <br>
惊群: <br>
当线程进入睡眠状态后,他一旦接受到唤醒的信号就会转为活动状态,如果很多的线程 <br>
同时转为活动状态,这时只能由一个线程被唤醒,所以,醒来的线程又都重新进入睡眠 <br>
。在线程唤醒的过程中,系统内核忙于切换线程的状态,就会消耗大量的系统资源,接 <br>
着99%的线程又转回睡眠状态,系统资源又在一次的被大量消耗。在线人数越多的系统, <br>
如果不避免惊群的话,就会严重的降低系统的性能。 <br>
<br>
<br>
-- <br>
Target Locked:Guru In Darkness. <br>
我只是一只静静卧着的狮子。。。 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.210] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="246.htm">上一层</a>][<a href="254.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -