web增加“BBS网络聊天室”功能

该博客介绍了在web下增加BBS网络聊天室功能,注册用户登陆后可使用,此聊天程序能与telnet模式同步。还给出了相关代码,如proto.h、bbsmain.c等文件的修改,以及bbschat.c中各函数的实现,包括聊天主函数、注册函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发信人: chutium (秋天|阿新是谁?), 信区: BBSDev
标  题: web下增加 BBS网络聊天室 功能
发信站: 郑大绿城 BBS (Mon Sep  6 07:37:55 2004), 本站(bbs.zzu.edu.cn)

必须是注册用户才能使用本功能

登陆后,在 谈天说地 -> BBS网络聊天室 打开即可
这个聊天程序可以与telnet模式下的聊天室同步,用户可同时在telnet或web彼此聊天。


1.proto.h
diff proto.h proto.h.bak
458,459d457
< /* bbschat.c */
< int bbschat_main(void);


2.bbsmain.c
diff bbsmain.c bbsmain.c.bak
59c59
<       {bbschat_main, {"bbschat", NULL}},
---
>       //{bbschat_main, {"bbschat", NULL}},


3.bbsleft.c
150,153d151
< if (currentuser->userlevel & PERM_CHAT) {
< printf
<     ("&nbsp;&nbsp;<a href=bbschat target=f3>BBS网络聊天室</a><br>/n");
< }


4.bbschat.c
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include "bbslib.h"
static int chat_fd;
static int test=0;
static char genbuf[1024];

int bbschat_main() {
char t[80];
int pid;
html_header(1);
if(!loginok || isguest) {
http_fatal("错误,请先登录");
}
changemode(CHAT2);
strsncpy(t, getparm("t"), 80);
pid=atoi(getparm("pid"));
if(pid==0) reg();
if(pid>0)
if(kill(pid, 0)!=0) {
printf("<script>top.location='about:您已经断线或已有1个窗口进入聊天室了.'</script>");
exit(0);
}
        if(!strcmp(t, "frm")) show_frm(pid);
if(!strcmp(t, "chatsnd")) chatsnd(pid);
if(!strcmp(t, "frame_input")) frame_input(pid);
if(!strcmp(t, "chatrefresh")) {test=1;chatrefresh(pid);}
printf("err cmd");
return 0;
}

int reg() {
int n, pid;
if((pid=fork())) {
sprintf(genbuf, "bbschat?pid=%d&t=frm", pid);
redirect(genbuf);
http_quit();
}
for(n=0; n<1024; n++) close(n);
pid=getpid();
agent(pid);
exit(0);
}

int show_frm(int pid) {
printf("<frameset rows=0,0,*,48,16 frameborder=0>"
"<frame name=hide src=''>"
"<frame name=hide2 src=''>"
"<frame name=main src=''>"
"<frame scrolling=auto marginheight=1 framespacing=1 name=input src=bbschat?t=frame_input&pid=%d>"
"<frame scrolling=no marginwidth=4 marginheight=1 framespacing=1 name=foot src=bbsfoot>"
"</frameset>"
"</html>", pid);
http_quit();
return 0;
}

int frame_input(int pid) {
printf("<script>
function r1() {
top.hide2.location='bbschat?t=chatrefresh&pid=%d';
setTimeout('r1()', 10000);
}
setTimeout('r1()', 500);
</script>
<body onload='document.form1.in1.focus()'>
<nobr>
<form onsubmit='add_cc()' name=form1 action=bbschat?pid=%d&t=chatsnd method=post target=hide>
&nbsp;Input: <input name=in1 maxlength=60 size=56>
<input type=submit value=发送>
<script>
var cc, cc2;
cc='';
function add_cc0(x1, x) {
cc2=x1;
cc=x;
}
function do_quit() {
if(confirm('您真的要退出了吗?')) {
form1.in1.value='/b';
form1.submit();
}
}
function do_help() {
open('/chathelp.html', '_blank', 
'toolbar=yes,location=no,status=no,menubar=no,scrollbar=auto,resizable=yes,width=620,height=400');
}
function do_alias(x) {
form1.in1.value=x;
form1.submit();
}
function do_room() {
xx=prompt('请输入包厢名称','');
if(xx=='' || xx==null) return;
form1.in1.value='/j '+ xx;
form1.submit();
}
function do_user() {
form1.in1.value='/l';
form1.submit();
}
function do_r() {
form1.in1.value='/r';
form1.submit();
}
function do_w() {
form1.in1.value='/w';
form1.submit();
}
function do_msg() {
xx=prompt('给谁丢小纸条','');
if(xx=='' || xx==null) return;
yy=prompt('什么内容','');
if(yy=='' || xx==null) return;
form1.in1.value='/m '+xx+' '+yy;
form1.submit();
}
function do_n() {
xx=prompt('你想改成什么名字?','');
if(xx=='' || xx==null) return;
form1.in1.value='/n '+xx;
form1.submit();
}
function do_pic() {
xx=prompt('请输入图片的URL地址:','http://');
if(xx=='http://' || xx=='' || xx==null) return;
form1.in1.value='<img src='+xx+'>';
form1.submit();
}
</script>
<select onChange='do_alias(this.options[this.selectedIndex].value);this.selectedIndex=0;'>
        <option value=' ' selected>聊天动作</option>
        <option value='//hehe'>呵呵的傻笑</option>
<option value='//faint'>要晕倒了</option>
<option value='//ep'>要睡着了</option>
<option value='//:D'>乐滋滋的</option>
<option value='//so'>就这样</option>
<option value='//shake'>摇摇头</option>
<option value='//luck'>真幸运啊</option>
<option value='//tongue'>吐吐舌头</option>
<option value='//blush'>脸红了</option>
<option value='//applaud'>热烈鼓掌</option>
<option value='//cough'>咳嗽一下</option>
<option value='//happy'>好高兴啊</option>
<option value='//hungry'>肚子饿了</option>
<option value='//strut'>大摇大摆</option>
<option value='//think'>想一想</option>
<option value='//?'>疑惑不已</option>
<option value='//bearbug'>热情拥抱</option>
<option value='//bless'>祝福</option>
<option value='//bow'>鞠躬</option>
        <option value='//caress'>抚摸</option>
        <option value='//cringe'>企求宽恕</option>
        <option value='//cry'>放声大哭</option>
        <option value='//comfort'>安慰一下</option>
<option value='//clap'>热烈鼓掌</option>
        <option value='//dance'>翩翩起舞</option>
     <option value='//drivel'>流口水</option>
     <option value='//farewell'>再见</option>
   <option value='//giggle'>呆笑</option>
     <option value='//grin'>咧嘴笑</option>
       <option value='//growl'>大声咆哮</option>
/*
hand      heng      hug       haha      heihei    joycup    kick
kiss      koko      laugh     mm        nod       nudge     oh        pad
pat       papaya    pinch     punch     pure      puke      report    shrug
sigh      slap      smooch    snicker   sniff     spank     squeeze   thank
tickle    wave      welcome   wink      xixi      zap

【 Verb + Message:动词 + 要说的话 】   例://sing 天天天蓝
ask       chant     cheer     chuckle   curse     demand    frown     groan
grumble   hum       moan      notice    order     ponder    pout      pray
request   shout     sing      smile     smirk     swear     tease     whimper
yawn      yell
*/
        </select>
<select name=ccc onChange='add_cc0(this, this.options[this.selectedIndex].value)'>
<option value='' selected>白色</option>
<option value='%s'><font color=green>红色</font></option>
<option value='%s'><font color=red>绿色</font></option>
        <option value='%s'><font color=blue>蓝色</font></option>
        <option value='%s'><font color=blue>天蓝</font></option>
        <option value='%s'><font color=yellow>黄色</font></option>
        <option value='%s'><font color=red>品红</font></option>
<option value='%s'>大字</option>
</select>
<select onChange='do_func(this.selectedIndex);this.selectedIndex=0;'>
  <option selected>聊天室功能</option>
<option>进入包厢</option>
<option>查看包厢名</option>
<option>本包厢有谁</option>
<option>看有谁在线</option>
<option>丢小纸条</option>
<option>改聊天代号</option>
<option>贴图片</option>
<option>清除屏幕</option>
<option>背景反色</option>
<option>离开聊天室</option>
        </select>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='/chathelp.html' target=_blank>[聊天室帮助]</a>
&nbsp;<a href='javascript:do_quit()'>[离开 郑州大学BBS 聊天室]</a>
<script>
function do_func(n) {
if(n==0) return;
if(n==1) return do_room();
if(n==2) return do_r();
if(n==3) return do_w();
if(n==4) return do_user();
if(n==5) return do_msg();
if(n==6) return do_n();
if(n==7) return do_pic();
if(n==8) return do_c();
if(n==9) return do_css2();
if(n==10) return do_quit();
}
var css1;
css1='http://"MY_BBS_DOMAIN"/bbschat.css';
function do_c() {
top.main.document.close();
                top.main.document.writeln('<link rel=stylesheet type=text/css href='+css1+'><body><pre><font class=c37>');
}
function do_css2() {
if(css1=='http://"MY_BBS_DOMAIN"/bbschat.css')
css1='http://"MY_BBS_DOMAIN"/bbschat2.css';
else
css1='http://"MY_BBS_DOMAIN"/bbschat.css';
top.main.document.writeln('<link rel=stylesheet type=text/css href='+css1+'><body><pre><font class=c37>');
}
function add_cc() {
  xxx=form1.in1.value;
if(xxx=='/h') {
do_help();
form1.in1.value='';
return; 
}
if(xxx=='/c') {
do_c();
form1.in1.value='';
return;
}
if(xxx=='') return;
  if(xxx.indexOf('/')<0) {
  form1.in1.value=cc+xxx;
  }
/*  if(cc=='%I') {
  cc='';
  cc2.selectedIndex=0;
  }*/
  }
</script>
</form></body>

", pid, pid, "%R", "%G", "%B", "%C", "%Y", "%M", "%I");
http_quit();
return 0;
}

int chatsnd(int pid) {
char in1[255], filename[256];
FILE *fp;
strsncpy(in1, getparm("in1"), 60);
sprintf(filename, "tmp/%d.in", pid);
fp=fopen(filename, "a");
fprintf(fp, "%s/n/n", in1);
fclose(fp);
chatrefresh(pid);
return 0;
}

char *cco(char *s) {
        static char buf[512];
        char *p=buf, co[20];
        bzero(buf, 512);
        while(s[0]) {
                if(s[0]!='%') {
                        p[0]=s[0];
                        p++;
                        s++;
                        continue;
                }
                bzero(co, 20);
                if(!strncmp(s, "%R", 2)) strcpy(co, "/033[31m");
                if(!strncmp(s, "%G", 2)) strcpy(co, "/033[32m");
                if(!strncmp(s, "%B", 2)) strcpy(co, "/033[34m");
                if(!strncmp(s, "%C", 2)) strcpy(co, "/033[36m");
                if(!strncmp(s, "%Y", 2)) strcpy(co, "/033[33m");
                if(!strncmp(s, "%M", 2)) strcpy(co, "/033[35m");
                if(!strncmp(s, "%N", 2)) strcpy(co, "/033[0m");
                if(!strncmp(s, "%W", 2)) strcpy(co, "/033[37m");
                if(!strncmp(s, "%I", 2)) strcpy(co, "/033[99m");
                if(co[0]) {
                        strncpy(p, co, strlen(co));
                        p+=strlen(co);
                        s+=2;
                        continue;
                }
                p[0]=s[0];
                p++;
                s++;
        }
        return buf;
}

int chatrefresh(int pid) {
char filename[256];
int t1;
FILE *fp;
        kill(pid, SIGINT);
        usleep(150000);
        if(kill(pid, 0)!=0) {
                printf("<script>top.location='javascript:close()';</script>");
                exit(0);
        }
sprintf(filename, "tmp/%d.out", pid);
t1=time(0);
while(abs(t1-time(0))<8 && !file_exist(filename)) {
sleep(1);
continue;
}
fp=fopen(filename, "r");
if(fp){
while(1) {
int i;
char buf2[512];
if(fgets(buf2, 255, fp)<=0) break;
sprintf(genbuf, "%s", cco(buf2));
for(i=0; genbuf[i]; i++) if(genbuf[i]==10 || genbuf[i]==13) genbuf[i]=0;
if(!strncmp(genbuf, "/init", 5)) {
printf("<script>/n");
printf("top.main.document.write(/"");
printf("<link rel=stylesheet type=text/css href='http://"MY_BBS_DOMAIN"/bbschat.css'><body id=body1 bgColor=black><p
printf("/");");
printf("/n</script>/n");
continue;
}
if(!strncmp(genbuf, "/t", 2)) {
printf("<script>top.document.title='BBS茶馆--话题: ");
hprintf("%s", genbuf+2);
printf("'</script>");
sprintf(buf2, "本包厢的话题是: [/033[1;33m%s/033[37m]", genbuf+2);
strcpy(genbuf, buf2);
}
if(!strncmp(genbuf, "/r", 2)) {
sprintf(buf2, "本包厢的名称是: [/033[1;33m%s/033[37m]", genbuf+2);
strcpy(genbuf, buf2);
}
if(!strncmp(genbuf, "/", 1)) {
genbuf[0]='>';
genbuf[1]='>';
}
for(i=0; i<strlen(genbuf); i++) {
if(genbuf[i]==10 || genbuf[i]==13) genbuf[i]=0;
if(genbuf[i]==34) genbuf[i]=39;
}
printf("<script>/n");
printf("top.main.document.writeln(/"");
fhhprintf(stdout, "%s", genbuf);
printf(" <font class=c37>");
printf("/");");
printf("top.main.scrollBy(0, 99999);/n");
if(test==0) printf("top.input.form1.in1.value='';/n");
printf("</script>/n");
}
fclose(fp);
}
unlink(filename);
printf("<br>");
http_quit();
return 0;
}

void foo() {
FILE *fp;
char filename[80], buf[256];
sprintf(filename, "tmp/%d.in", getpid());
fp=fopen(filename, "r");
if(fp) {
while(1) {
if(fgets(buf, 250, fp)<=0) break;
write(chat_fd, buf, strlen(buf));
}
fclose(fp);
}
unlink(filename);
alarm(60);
}

void abort_chat() {
int pid=getpid();
        char filename[200];
sprintf(filename, "tmp/%d.out", pid);
        unlink(filename);
        sprintf(filename, "tmp/%d.in", pid);
        unlink(filename);
        exit(0);
}

int agent(int pid) {
        int i, num;
  FILE *fp;
char filename[80];
struct sockaddr_in blah;
sprintf(filename, "tmp/%d.out", pid);
        bzero((char *)&blah, sizeof(blah));
        blah.sin_family=AF_INET;
        blah.sin_addr.s_addr=inet_addr("127.0.0.1");
        blah.sin_port=htons(7202);
        chat_fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(connect(chat_fd, (struct sockaddr *)&blah, 16)<0) return -1;
        signal(SIGINT, (void *)foo);
signal(SIGALRM, (void *)abort_chat);
alarm(60);
  sprintf(genbuf, "/! %d %d %s %s %d/n", 
u_info->uid, currentuser->userlevel, currentuser->userid, currentuser->userid, 0);
  write(chat_fd, genbuf, strlen(genbuf));
read(chat_fd, genbuf, 2);
if(!strcasecmp(genbuf, "OK")) exit(0);
fp=fopen(filename, "w");
fprintf(fp, "/init/n");
fclose(fp);
  while(1) {
  num=read(chat_fd, genbuf, 2048);
                        if (num<=0) break;
                        for(i=0; i<num; i++)
                                if(genbuf[i]==0) genbuf[i]=10;
genbuf[num]=0;
  fp=fopen(filename, "a");
fprintf(fp, "%s", genbuf);
fclose(fp);
        }
abort_chat();
return 0;
}

--
※ 来源:.郑大绿城 BBS bbs.zzu.edu.cn.[FROM: 221.14.170.57] 
一、实验目的 1.掌握通信规范的制定及实现。 2.练习较复杂的网络编程,能够把协议设计思想应用到现实应用中。 二、实验内容和要求 1.进一步熟悉VC++6编程环境; 2.利用VC++6进行较复杂的网络编程,完成网络聊天室的设计及编写; 三、实验(设计)仪器设备和材料 1.计算机及操作系统:PC机,Windows; 2.网络环境:可以访问互联网; 四、 TCP/IP程序设计基础 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(VC6.0下): 第一部分 服务器端 一、创建服务器套接字(create)。 二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。 三、接受来自用户端的连接请求(accept)。 四、开始数据传输(send/receive)。 五、关闭套接字(closesocket)。 第二部分 客户端 一、创建客户套接字(create)。 二、与远程服务器进行连接(connect),如被接受则创建接收进程。 三、开始数据传输(send/receive)。 四、关闭套接字(closesocket)。 CSocket的编程步骤:(注意我们一定要在创建MFC程序第二步的时候选上Windows Socket选项,其中ServerSocket是服务器端用到的,ClientSocket是客户端用的。) (1)构造CSocket对象,如下例: CSocket ServerSocket; CSocket ClientSocket; (2)CSocket对象的Create函数用来创建Windows Socket,Create()函数会自行调用Bind()函数将此Socket绑定到指定的地址上面。如下例: ServerSocket.Create(823); //服务器端需要指定一个端口号,我们用823。 ClientSocket.Create(); //客户端不用指定端口号。 (3)现在已经创建完基本的Socket对象了,现在我们来启动它,对于服务器端,我们需要这个Socket不停的监听是否有来自于网络上的连接请求,如下例: ServerSocket.Listen(5);//参数5是表示我们的待处理Socket队列中最多能有几个Socket。 (4)对于客户端我们就要实行连接了,具体实现如下例: ClientSocket.Connect(CString SerAddress,Unsinged int SerPort);//其中SerAddress是服务器的IP地址,SerPort是端口号。 (5)服务器是怎么来接受这份连接的呢?它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。如下例: CSocket ReceiveSocket; ServerSocket.Accept(ReceiveSocket); (6)如果想在两个程序之间接收或发送信息,MFC也提供了相应的函数。如下例: ServerSocket.Receive(String,Buffer); //String是你要发送的字符串,Buffer是发送字符串的缓冲区大小。ServerSocket.Send(String,Butter);//String是你要接收的字符串,Buffer是接收字符串的缓冲区大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值