荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 使用inetd建立server
发信站: BBS 荔园晨风站 (Thu Jan 21 23:10:36 1999), 转信

Inetd
    UNIX操作系统中,有许多基于TCP/IP之上的网络server,如:telne
td、ftpd等。这些进程有一个共同的功能:监听某一服务端口,当客户
请求服务时,产生(fork)子进程为客户提供服务。虽然这些daemon只
在client连接建立后才消耗进程时间,但这些进程使用了大量的内存
和CPU时隙。为了解决这一问题,UNIX提出了"超级服务器"的概念,称
作inetd(internet dam on)。
    inetd是一个daemon进程,它在系统启动时开始运行,并且只能运
行一个进程。inetd使用一个进程为多个server服务,即由inetd代替s
erver监视端口,server本身并不在系统中运行,从而减轻系统的负荷
。当连接请求到达时,由inetd决定由哪个server提供服务,并且为连
接请求fork子进程运行server。对不同的服务请求,inetd采取不同的
服务方式,如果服务请求是面向连接请求,则inetd立刻返回继续监听
端口。当服务请求是无连接请求时,inetd等待e rver返回,在此期间
不接受任何连接请求。server退出后,inetd返回继续监听。使用inet
不仅减少了空闲进程的数量,而且由于由超级服务器建立网络连接,使
server完全不必与网络打交道,只需要使用标准输入输出与client通
信。由于不需要调用socket库函数,server编写更加容易,文件长度更
小。

    参数配置文件
    inetd在启动时,主要从/etc/inetd.conf和/etc/services文件中
读取配置参数。下面分别介绍这两个文件的格式。
    /etc/services文件中的每一行代表系统提供的网络服务和相应
的端口名和协议名。每一行的格式是:<服务名> <端口号/协议名> <
别名>。
    下面是该文件中的一段。
    echo  7/tcp
    echo  7/udp
    discard 9/tcp sink nul
    systat 11/tcp users
    ftp  21/tcp
    telnet 23/tcp
    smtp  25/tcp
    time  37/tcp timeserver
    rlp  39/udp resource
    whois 43/tcp nicname
    domain 53/tcp nameserver
    /etc/inetd.conf文件中的每一行各段含义如下:
    ·服务名 由/etc/services文件指定;
    ·socket类型 是stream类型或者dgram类型;
    ·协议 由/etc/protocols文件指定,一般为tcp和udp;
    ·wait|nowait   只用于datagram sockets, stream sockets
应指定为 nowait
    ·用户 启动server的用户名;
    ·server程序   inetd运行的server的路径名;
    ·server程序参数 server程序使用的参数。
    下面是inetd.conf文件的一部分。
    ftp  stream tcp nowait root /etc/ftpd  ftpd -l
    telnet stream tcp nowait root /etc/telnetd telnetd
    tftp dgram udp wait root /etc/tftpd tftpd
    login stream tcp nowait root /etc/rlogind rlogind
    shell stream tcp nowait root /etc/remshd remshd
    exec stream tcp nowait root /etc/rexecd rexecd
    Inetd应用
    利用inetd我们可简单方便地建立server,不需要任何C语言编程
。下面我们使用UNIX中的命令who演示如何把who变为一个server。首
先,我们需要在文件/etc/services和/etc/ie td.conf中加几行。
    在/etc/services中加入如下内容:
    wserver  2100/tcp
    2100是我们为该服务设置的端口号,读者也可以选择其他的端口
号,只要不与其他服务端口号冲突即可。
    在/etc/inted.conf中加入如下内容:
    wserver  stream  tcp  nowait  root /bin/who  who
    编辑好文件后,服务还不能使用,因为inetd并不能自动发现文件
的改变而重新配置进程,需要我们向inetd发SIGHUP信号使之读文件。
在发送信号前必须先找到进程的ID。我们可以使用如下的命令:
    s06$ ps -ae | grep inetd
    显示结果为:
    164 ?    0:00 inetd
    杀掉164进程:
    s06$ kill -HUP 164
    现在使用netstat命令显示网络状态,我们会发现inetd正代替这
个新的服务监听端口。
    s06$ netstat -a | head
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q Local Address  Foreign Address   (st
ate)
    tcp 0  0  *.wserve  *.*       LISTEN
    tcp 0  0  s06.login  s04.1022     ESTABLISHED
    tcp 0  3  s06.login  s04.1023     ESTABLISHED
    tcp 0  0  s06.3167  192.9.200.206  ESTABLISHED
    tcp 0  0  s06.3166  192.9.200.206  ESTABLISHED
    tcp 0  0  s06.3165  192.9.200.206  ESTABLISHED
    tcp 0  0  s06.3164  192.9.200.206  ESTABLISHED
    tcp 0  0  s06.3162  192.9.200.206  ESTABLISHED
    虽然server已经开始工作。但我们还必须有客户端工具。对于cl
ient端,我们也可以利用现成的UNIX命令:telnet 。通常情况下,elne
t使用标准端口23连接到telnetd服务器,但我们可以为它指定一个端
口。telnet使用方法是:telnet <主机名 ><端口号>。例如telnetlo
calhost 1220命令将连接到本机的1220端口。使用telnet可以向serv
er输入文本并接受返回的文本。因此,telnet可以作为测试文本方式
协议的工具。
    现在我们可以检验server的工作情况。首先我们进入其他主机,
如s04,使用telnet从s4 登录到另一主机s06,在telnet命令中指定服
务端口号2100。
    s04$ telnet s06 2100
    Trying...
    Connected to s06.
    Escape character is ‘^〗'.
    cat   console   Jul 14 08:16
    cat   ttyp9    Jul 14 15:02
    cria  ttypa    Jul 14 15:04
    dony  ttypb    Jul 14 13:15
    ccc   pty/ttys1  Jul 14 15:19
    cria  ttype    Jul 14 14:04
    robert ttypf    Jul 14 10:44
    cria ttyp8     Jul 14 15:00
    Connection closed by foreign host.
    新的网络服务开始正常工作。
    本文所述的UNIX操作系统为HP-UX 9.07。

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店