用xinetd实现小型网络服务

linux 里带了一个 xinetd ,可以用来很方便地实现一些小型的网络服务。处理网络链接,fork 子进程等等都交给它来办,而我们自己只需要操作标准输入输出的程序就可以了。

先写一个简单的程序,我这里就写个php程序,其实用什么都是可以的,然后放在 /path/to/test-xinetd.php :
<?php
$in = fopen(‘php://stdin’, ‘r’);
$out = fopen(‘php://stdout’, ‘w’);
while ($r = fgets($in)) {
    $r = trim($r);
    if ($r == ‘exit’|| $r == ‘quit’) {
        break;
    }
    $nums = preg_split(‘/s+/’, $r);
    $result = array_reduce($nums, create_function(‘$a, $b’, ‘return $a + $b;’));
    fputs($out, “$resultn”);
}
fclose($in);
fclose($out);

这个程序读取输入的每一行,按空白分割,然后把这些都加起来。说白了就是做个加法。在输入 exit 或者 quit 的时候退出。可以先跑一下,看看效果。

然后就是用 xinetd 来把它变成一个服务了。

在 /etc/xinetd.d 里新增一个文件,比如叫 test ,在里面填上配置

service test
{
disable = no
socket_type = stream
protocol = tcp
port = 8888
user = root
server = /usr/bin/php
server_args     = /path/to/test-xinetd.php
wait = no
instances = 50
}
这里 disable = no 表示把这个服务启用;wait = no 是用多线程模式运行, instances 是最大实例数。其他几个参数就不用多解释了,看名字就知道。更多的配置可以去看底下的相关资料。

然后还需要在 /etc/services 里加上一条

test    8888/tcp

重启一下 xinetd,netstat -lntp 看一下 8888 端口是不是 xinetd 在监听了。

如果正常,就可以 telnet 127.0.0.1 8888 来看看了。

 

 

相关资料:
http://www.linuxfocus.org/English/November2000/article175.shtml
http://linux.vbird.org/linux_basic/0560daemons.php

4 thoughts on “用xinetd实现小型网络服务

  1. 灼冰 December 31, 2008 / 9:09 pm

    新年快乐。。。幸福 平安

  2. DigitalSonic December 30, 2008 / 5:42 pm

    看了这个才明白你那天在群里贴的图是个什么意思。。。

  3. 崔玉松 December 30, 2008 / 12:20 pm

    汗一下楼下的,啥叫什么这么模块啊

  4. 花开 December 30, 2008 / 10:51 am

    赞!xinetd这么模块啊!

Leave a comment