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

📄 253.htm

📁 unix高级编程原吗
💻 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 + -