站长中国
设为首页 | 站长论坛

站长论坛 站长下载
您所在的位置: 站长中国 > 站长学院 > 网络编程 > cgi专区 >  正文

ecserver.pl 源代码
  2007年10月14日23:52:06  评论(0条) 字体:[ ]
相关热点: 源代码 print ARGV form if die TYPE Server BGCOLOR
下面的代码有用到unix/linux的系统功能所以不能在NT上使用。
运行这个代码,你需要在相同目录下面放一个文本文件chat.log
聊天内容将保存在这个文件内。代码调用unix/linux处理log的function
写入/读取聊天内容。
至于多进程,好像socket自己就可以处理。。。那个listen()你自己看一下。
Perl我是几乎什么都不懂的。所以只好您老人家自己研究了。:)
搞明白了别忘了教小弟几招。
另外,nt平台上可以用vc写chatserver嘛。(这个我更不懂了)
#!/usr/bin/perl
# EveryChat Server Edition Beta 1
#
# This is beta code.  You may not
# upload, post, mirror, share, sell
# or otherwise redistribute this
# code in full or in part without
# written permission from the
# author.
#
# By downloading this code, you
# are granted permission to use
# this code on a single server or
# physical machine provided you
# agree with this license agreement.
#
# This code is provided "AS-IS"
# without any warrantees or
# guarantees of any kind.
#
# This code is protected under US
# and international copyright laws.
#
# (c) 1999 EverySoft
# ALL RIGHTS RESERVED

$servername = 'http://';
$ARGV[0] ||= 'localhost';
$servername .= $ARGV[0];
$ARGV[1] ||= '8080';
$servername .= ":$ARGV[1]";
$ARGV[2] ||= './chat.log';
$ARGV[3] ||= 'EveryChat Server Edition';

$|=1;
use Socket;
use Carp;
use POSIX;

my $proto = getprotobyname('tcp');
socket(Server, PF_INET, SOCK_STREAM, $proto)    || die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))  || die "setsockopt: $!";
bind(Server, sockaddr_in($ARGV[1], INADDR_ANY))    || die "bind: $!";
listen(Server,SOMAXCONN)      || die "listen: $!";

my $waitedpid = 0;
my $paddr;

$SIG{CHLD} = sub {wait();};
sub checksocket {
my $dummy;
undef $!;
$dummy=<STDIN>;
if (!(defined($dummy)) && !($!)) {
  close TAIL;
  die("Socket Closed...\n");
}
}

sub spawn {
my $coderef = shift;
my $pid;
if (!defined($pid = fork)) {
  print "cannot fork: $!";
  return;
} elsif ($pid) {
  return; # I'm the parent
}
open(STDIN,  "<&Client")   || die "can't dup client to stdin";
open(STDOUT, ">&Client")   || die "can't dup client to stdout";
exit &$coderef();
}

sub printlines {
open TAIL, "tail -f $ARGV[2] |";
while ($go == 1) {
  print "<TABLE BGCOLOR=#EEEEEE CELLSPACING=2 CELLPADDING=3 BORDER=0 WIDTH=100%><TR><TD>" . <TAIL> . "</TD></TR></TABLE><SCRIPT Language=JavaScript1.2><!--\nself.scrollBy(0,640);\n//--></SCRIPT>\n";
  &checksocket;
}
close TAIL;
}

sub getform {
$formstring = shift;
foreach $elem (split(/&|=/,$formstring)) {
  $elem =~ tr/+/ /;       # pluses become spaces
  $elem =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
  push @data, $elem;
}
%form=@data(%form=@data);
}

sub server {
$go=1;
while ($go && defined ($buf = <STDIN>)) {
  if ($buf =~ /GET/) {
   print "HTTP/1.1 200 OK\nServer: EveryChat/1.0.0 (Unix)\nConnection: close\nContent-Type: text/html\n\n";
   if ($buf =~ /realtime/) {
    print "<BODY BGCOLOR=#FFFFFF>\n";
    print "<TABLE BGCOLOR=#EEEEEE CELLSPACING=2 CELLPADDING=3 BORDER=0 WIDTH=100%><TR><TD><FONT COLOR=#AA0000><B>Welcome to $ARGV[3]!</B></FONT></TD></TR></TABLE>\n";
    fcntl(STDIN, F_SETFL(), O_NONBLOCK()) || die "Can't make socket nonblocking: $!\n";
    &printlines;
   }
   elsif ($buf =~ /chatform/) {
    print "<BODY BGCOLOR=#FFFFFF>
    <FORM METHOD=GET ACTION=$servername/post><NOBR>
    <CENTER>Name: <INPUT TYPE=TEXT NAME=name> <INPUT TYPE=HIDDEN NAME=login VALUE=1><INPUT TYPE=SUBMIT VALUE=Enter!></CENTER>
    </NOBR></FORM></BODY>\n";
    $go=0;
   }
   elsif ($buf =~ /post\?(\S+)/) {
    &getform($1);
    if ($form{'logout'}) {
     print "<BODY BGCOLOR=#FFFFFF>
     <CENTER>Thanks for visiting $ARGV[3]</CENTER>
     </BODY>\n"
    }
    else {
     print "<BODY BGCOLOR=#FFFFFF onLoad=\"document.msgform.message.focus();\">
     <FORM METHOD=GET ACTION=$servername/post NAME=msgform><NOBR>
     <CENTER><INPUT TYPE=HIDDEN NAME=name VALUE=\"$form{'name'}\">Message: <INPUT TYPE=TEXT NAME=message SIZE=40> <INPUT TYPE=SUBMIT VALUE=Post!> <INPUT TYPE=SUBMIT NAME=logout VALUE=Logout></CENTER>
     </NOBR></FORM></BODY>\n";
    }
    $time = localtime(time);
    open MESSAGES, ">>$ARGV[2]";
    print MESSAGES "<FONT COLOR=#0000AA><B><$form{'name'}></B></FONT> $form{'message'}\n" if $form{'message'};
    print MESSAGES "<FONT COLOR=#00AA00>*** <B>$form{'name'}</B> entered the room on $time</FONT>\n" if $form{'login'};
    print MESSAGES "<FONT COLOR=#00AA00>*** <B>$form{'name'}</B> left the room on $time</FONT>\n" if $form{'logout'};
    close MESSAGES;
    $go=0;
   }
   else {
    print "<FRAMESET ROWS=*,50>
    <FRAME SRC=$servername/realtime SCROLLING=AUTO>
    <FRAME SRC=$servername/chatform SCROLLING=NO>
    </FRAMESET>\n";
    $go=0;
   }
  }
}
}


for ( $waitedpid = 0; ($paddr = accept(Client,Server)) || $waitedpid; $waitedpid = 0, close Client) {
next if $waitedpid and not $paddr;
spawn \&server;
}

 
责任编辑:

收藏本文 打印 打印本文  推荐本文 告诉好友 投稿 投稿邮箱

站长排行

学院

新闻

专栏

盈利

[揭密网络黄链]中国留学生买凶专破日本
JSP语法(6)
超强弹出窗口代码,什么都挡不住
FLASH视觉特效实例之地震效果
贴吧发帖机使用教程(绝对原创)
关于数据分页(转自www.codeproject.co
ASP实现文件直接下载
Photoshop制作光感超酷效果水晶球
 遍历ASP.NET页面控件
永远的后门[经典]+查不出的后门
淘宝网卖家公然叫卖“艳照门”照片集
驳《百度Hi面世对腾讯有利》
Google绿色专家质疑黑色背景网页节省资
国内各IT企业办公环境揭秘(多图)
阿里妈妈广告卖主全攻略
站长创业源动力 主流站长站赏析
推荐阅读:80年小子的创业道理
Discuz!6.0猛将出击 最强论坛程序酷炫
我的网络,我的团队:专访李文明
百度新闻频道改版十天 流量止跌反弹翻
ECSHOP模板制作参考文档
悬挂阿里妈妈会否被百度惩罚
阿里妈妈是否是中小站长的救世主?
最强网店ECShop发新版 众多酷炫功能给
ECSHOP模板下载
土豆网,优酷网,爆米花等视频网站采集
DedeCms模板安装/制作概述
网上商店系统巅峰对决 ECShop vs ShopE
艰难的走在创业的路上 第一天
编程中国全站采集规则
性福联盟 一个不尊重站长的联盟
大脚:日赚100元—揭露最新firefox欺骗
大脚:垃圾站超级赚钱法之二—突破“站
大脚:垃圾站超级赚钱法之——前言
迅雷联盟、快车联盟收入对比
经理人必看的十个管理网站
Google Adsense的秘密 第二版
西联汇款兑付城市查询
不用SEO取得成功的10个步骤
关于做GOOGLE的五条经验
站长学院  网页设计 建站教程 图形图象 网络编程

Photoshop CS3
Photoshop CS3
不用Photoshop
不用Photoshop

DIV+CSS的开发方式 听听另外的
虚拟主机建站动易里快速生成的
VBScript特效代码 满屏幕乱跑
牛气!一个菜鸟站长的超强网站
创建、维护一个个人博客的“投
让网站流量稳步飙升的秘籍
网站推广的基本思想

新闻线索

如果你有站长界人事变动、重组并购、变革技术出现,以及产品投诉等重要新闻线索,请告诉我们,我们会给予特别关注。
0631-3653338
站长中国编辑部
站长中国24小时新闻热线: 13256307008