2.4.3. 普通应答
下面的列表是一个服务器发送的普通应答。没有指定给任何命令,但是可以返回连接的结果,失效或者其他没有用的信息。
在普通应答中,代码1xx也许被期望的忽略或者显示;代码200或者201被NNTP服务器在最初包括参数时发送;代码400在服务器禁止服务时发送(比如操作请求);代码5xx表示命令由于某种原因不能被执行。
100 help text
190
through
199 debug output
200 server ready - posting allowed
201 server ready - no posting allowed
400 service discontinued
500 command not recognized
501 command syntax error
502 access restriction or permission denied
503 program fault - command not performed
3. 命令与回应细节
下面描述已经被公证了的NNTP服务器命令和相应的返回代码。
为了清晰,每个命令用大写字母显示。NNTP服务器并不对字母大小写敏感。其他参数一律采用小写字母,可选参数用方括号[、]包括。
本节介绍的所有命令必须为所有的NNTP服务器执行。
并没有禁止其他的附加命令;为了避免与后续修订版本的冲突,没有指定的自定义命令一律采用“X”开头的命令。
另外,那些自定义的命令不允许重新定义返回代码,使用附加的返回代码同时也被禁止。
3.1 ARTICLE, BODY, HEAD与STAT命令
有两种方式使用ARTICLE命令(与BODY,HEAD,STAT命令有关),每个使用不同方法的命令都可以接收到文章。当ARTICLE命令后面使用尖括号(<和>)作为参数时,第一种方法被使用;当使用数字作为参数或者没有参数指定,第二种方法被使用。
文件文本内容将被返回,关于返回格式,在早期文档中有定义。
HEAD和BODY命令与ARTICLE命令一样,不同的是,他们返回文章的标题行与内容。
STAT命令与ARTICLE命令相似,不同的是它不返回文本内容。当选择了新闻组中的消息号码以后,STAT命令发送服务器设置文章指针。返回经过确认以后的消息编号,这也许是一些值。使用STAT命令可以选择消息正确的编号但是可疑的值,选择以后并不改变“当前文件指针”。
3.1.1. ARTICLE (通过消息号码选择)
ARTICLE <message-id>
显示指定文件的文件头,一个空行,然后是文件正文部分。Message-id 是一个文章编号,它包括在文件头中。这是客户端希望获得的消息编号,可以通过NEWNEWS命令获得。提供引用的其他文章的消息编号,或者回复文章编号。(一个新闻内容可能为回复,译者注)
请注意,这个命令不能改变包括在其中的“当前文章指针”,在阅读文章之间,这是两个包括在文章内部的引用其他文件标识。由于语义的不同而决定正确的阅读顺序。一个新闻可能引用其它新闻组的内容。
3.1.2 ARTICLE (通过选择数字)
ARTICLE [nnn]
显示指定文件的文件头,一个空行,然后是文件正文部分。可选项nnn是一个当前新闻组中的文章数字编号,数字编号不得超出文章总数量,如果超界,当前文章将被选择。
如果正确的指定的参数nnn,包含在内部的“当前文章”指针将被设置。
[以上两种使用ARTICLE命令的方法],当前文件编号,message-id串,后面的文章内容将在随后的内容中被回送。
包括在尖括号(<和>)中的message-id串,是一个经过验证了的字符串,它来源于文章自身,在文章头部(RFC850中描述)中的message-id文件的支持信息。如果文章中不包括在文章头部,可以通过用尖括号包围0的方式简单的指定(<0>)。
Message-id是一个唯一的文章编号,可以使用新闻阅读程序跳过具有相同Message-id的被投递了两次的文章或者在不同的新闻组中重复投递的文章。
3.1.3 返回
220 n <a> article retrieved - head and boody follow (n 是文章编号,<a>为消息id)
221 n <a> article retrieved - head follows
221 n <a> article retrieved - body follows
222 n <a> article retrieved - body follows
223 n <a> article retrieved - request text separatele
412 no newsgroups has been selected
420 no current article has been selected
423 no such article number in this group
430 no such article fount
3.2. GROUP 命令
3.2.1. GROUP
GROUP ggg
参数ggg说明要选择的新闻组名称(如 net.news )。服务器上可用的新闻组名称可以使用LIST命令取得。
如果成功地选择了新闻组,本命令返回新闻组中文章的第一个、与最后一个文章编号与估算的文章数量。虽然文章估计数量非常有用,但是并不是必需的。它必须大于或等于文章数量。(实际上一些操作可以准确计算文章的数量,也可以通过最有一个编号减去第一个文章编号得到一个估计值。)
通过这个命令选择了有效的新闻组以后,内部文章指针被设置为本新闻组的第一个文章。如果选择的新闻组无效,以前选择的新闻组和当前文章编号继续保留。如果选择的新闻组为空的,当前文件指针将是一个不可确定的值。
注意,新闻组的名字不区分大小写。它必须匹配通过LIST命令获得的新闻组名称,否则返回一个错误的结果。
3.2.2. 返回
211 n f l s group selected (其中:n=估计文章数量,f=首文章编号,l=最后一个文章编号,s=新闻组名称)
411 no such news group
3.3. HELP命令
3.3.1. HELP
HELP
提供服务器上可执行命令的简短说明,帮助信息以文本的方式返回,并且以句号作为帮助文本的结束符。
3.3.2. 返回
100 help text follows
3.4 IHAVE命令
3.4.1. IHAVE
IHAVE <messageid>
IHAVE命令告诉服务器客户端有一个编号为<messageid>文章准备发送。如果服务器希望返回一个希望客户端发送文章的指令,如果服务器不需要这个文章(比如说,这个文章已经在服务器上面有)它将返回给客户端不需要这个文章。
如果文章可以被发送,客户端可以发送整个文章,包括文章头部和文章体,以指定的文本格式发送。当文章发送完成以后,返回一个成功或者失败的结果。
与POST命令不同的是,这个命令用于传输已阅读文章到其他主机。一般的,它不能被个人用的新闻阅读程序使用。特别情况下,这个命令将通过设置标志、选项等调用服务器上的投递程序用于转发新闻文章到其他主机。
在服务器方面,如果测试文章信任度不够或者投递不能到达,将不投递或者转发文章。服务器将发送436或者437错误代码。
如果由于新闻组设置、磁盘空间不足、文章长度限制、混乱的文章头等原因,将造成文章拒绝投递。这些典型的限制条件一般被新闻服务器上面的软件设定,
3.4.2. 返回
235 article transferred ok
335 send article to be transferred. End with <CR-LF>.<CR-LF>
435 article not wanted - do not send it
436 transfer failed - try again later
437 article rejected - to not try again
重要提示:
由于一些新闻投递软将不能够马上知道文章投递是否已经到达或转发,他只承认已经成功的传输,然后在后台慢慢的检查文章数量。鉴于此,通过235代码可以察看文章的投递情况,然后慢慢的接收文章。这是一种成功地软件解决方案,也许一些程序将通过这些方案发送邮件给文章作者。
3.5. LAST命令
3.5.1. LAST
LAST
这个命令用来设置“当前文件指针”为现在的指针的前一个。如果已经指向了新闻组中的第一个文章,那么将返回一个错误消息,并且指针仍然指向第一个文章。
内部文件指针可以用这个命令设置。
这个命令返回包括当前文章编号、message-id串,没有其他文本信息。
3.5.2. 返回
223 n a article retrieved - request text separately (n=文章编号,a=不重复的文章id)
412 no newsgroup selected
420 no current article has been selected
422 no previous article in this group
3.6. LIST命令
3.6.1. LIST
返回一个新闻服务器上面的有效新闻组列表。每一个新闻组用下列文本格式送出:
group last first p
其中:<group>是新闻组的名称,<last>是新闻组中当前已经有的最有一个已知文件编号,
<first>为新闻组中第一个文章编号,<p>为新闻组的权限设置,要么是'y',要么是'n'。'y'表示可以投递,'n'表示禁止投递。
<last>和<first>始终是一个数字,可能有0开头。如果<last>小于<first>表示新闻组中目前没有内容。
注意:通过LIST命令可以查看新闻组的投递权限,不允许投递到一个受限的新闻组。在POST命令中介绍客户端投递的详细描述。一些新闻组由于设置了禁止投递的权限,因而不允许投递文章。因为文章投递要经过不受限制的邮件投递,这些投递权限的设置由NNTP服务器设置。
可能返回一个空的列表(比如仅仅收到一个以句号.结束的列表),这通常表示没有可以使用的新闻组。
3.6.2. 返回
215 list of newsgroups follows
3.7. NEWGROUPS命令
3.7.1. NEWGROUPS
NEWGROUPS date time [GMT] [<distributions>]
显示新闻组中从<日期、时间>开始以后创建的新闻组,返回格式与LIST相同。
日期date以6位数字的格式(YYMMDD)发送,YY为年份的最后两位数字,MM为月份的两位数字(如果需要,前面必须前导0,如03表示3月),DD表示月中的日期。其中YY被分配为离得最近的世纪(如:86=1986, 30=2030, 99=1999, 00=2000)。
时间必须指定,格式为HHMMSS,其中HH为24小时制的时间(00-24),MM为分钟(00-59),SS为秒(00-59),时间假定为服务器的时间,除非有"GMT"后随,使用方式依赖于0度经线的时区差。
可选参数"distributions"是一个用尖括号括起来的匹配组。如果指定的话,新的匹配的新闻组将被列表显示(如 'net' 匹配 'net.wombat'),如果需要多个匹配,在尖括号中用逗号分割。
请注意,这个命令可能返回一个只有一个句号结束的文本,这表示没有新的新闻组。
3.7.2. 返回
231 list of new newsgroups follows
3.8. NEWNEWS命令
3.8.1. NEWNEWS
NEWNEWS newsgroups date time [GMT] [<distribution>]
返回一个从指定日期以后已经投递或者回复的文章message-id列表。返回格式为每个message-id一行,以一个句号与CR-LF表示输出的结束。
日期与时间格式与NEWGROUPS命令相同。
如果newgroups包括星号("*"),将指定从一些或者所有新闻组中查找。这里的星号可以通配新闻组的名字(比如 net.micro* 将通配 net.micro.wombat, net.micro.apple等)。所以,如果仅仅是用一个星号的话,将查找所有新闻组中的新文章。(注意:星号"*"可以被任意放置,如:net.*.unix 匹配 net.wombat.unix与net.whocares.unix)
相反的,如果没有星号进行匹配newgroup名称,将仅仅搜索指定的新闻组中的新文章,新闻组名称必须指定,可以通过逗号(,)分割多个新闻组名字(名字中可以包括星号)。无逗号引用将使用列表中的最后一个新闻组。特别需要提出的事,请注意不要把行的长度超过512个字符。
使用感叹号("!")可以对匹配取反运算。可以取掉一些匹配大量的新闻组名字。例如:
newgroups被设置成 "net.*,mod.*,!mod.map.*"将指定所有“net.任意 和 mod.任意 除了 mod.map.任意”的新闻组,习惯上,感叹号放在第一个给定新闻组匹配的位置。
可选项参数"distributions"是一个匹配列表组,用尖括号括起来。如果指定了这个参数,匹配部分将指定匹配(如net 匹配net.wombat)的新闻文章的匹配类别列表,并且这些文章至少属于匹配列表新闻组中的一个。如果提供多于一个的新闻组名字,可以使用逗号分割这些名字,并用尖括号括起来。
使用IHAVE, NEWNEWS, NEWGROUPS命令中的distribute选项,在早期文档中也有描述。
请注意,这个命令可能返回一个只有一个句号结束的文本,这表示没有新的新闻。
3.8.2. 返回
230 list of new articles by message-id follows
3.9. NEXT命令
3.9.1. NEXT
NEXT
本命令用于设置当前文件指针为当前新闻组的下一个文章。如果再没有文章了,则返回一个出错消息,当前文件指针保持不变。
本命令用于设置当前文件指针为当前新闻组的下一个文章。
结果提示当前文章编号、消息编号串也被返回。没有其他文本信息。
3.9.2. 返回
223 n a article retrieved - request text separately (n=文章编号,a=不重复的文章id)
412 no newsgroup selected
420 no current article has been selected
421 no next article in this group
3.10. POST命令
3.10.1. POST
如果新闻组允许投递,返回340代码表示文章可以被投递。返回码440表示由于某些原因文章不能被投递。
如果允许投递,文章的格式必须依据RFC850中指定的格式投递,并且应该包括规定的各种文章头部信息。当完成从客户端到服务器传送文章头部与文章正文以后,服务器将返回传送成功或者失败的提示信息。
文章头部与正文部分格式应该使用被标准给定的格式发送:一个以句号完成的行表示文本结束。双句号开头的文本可以屏蔽原文中的单句号开始的行。
对投递来的文本,服务器不进行字符转换、限定输入行数或者其他限定。这样的话,我们的服务器仅仅传送这些消息文本到服务器。关于这方面的详细描述,参看RFC850中的规定。
后来很多的新闻组客户程序允许用户通过小型的编辑软件撰写自己的消息,并且自动传送信息到服务器,这些客户程序在连接到服务器以后会注意到服务器的通知消息。这些消息里面会提示客户端那些新闻组投递的权限,是否为只读新闻组。这样可以防止用户在投递完消息以后才知道服务器上面的这个新闻组不可以投递从而节省时间。客户机与服务器之间的文章传送将依赖于服务器端的配置。
3.10.2 返回
240 article posted ok
340 send article to be posted. End with <CR-LF>.<CR-LF>
440 posting not allowed
441 posting failed
(结果中,下列代码在最初的连接中返回,客户程序可以测试是否有发送权限) 200 server ready - post allowed, 201 server ready - no posting allowed
3.11. QUIT命令
3.11.1. QUIT
QUIT
服务器收到这个命令以后,关闭与客户机之间的连接。这是使用NNTP协议断开连接服务器的首选方法。
如果客户机简单的断开连接(由于时间超出或者其他原因导致),服务器将悄悄的断开与客户机之间的连接而不提示任何信息。
3.11.2. 返回
205 closing connection - goodbye!
3.12. SLAVE命令
3.12.1. SLAVE
指明客户机与服务器连接为从动方式,而非用户方式。
这个命令设定用户到从动辅助服务器的连接为单用户方式。它也可以用来指出优先提供给客户端的服务方式,因为它也许正在为很多的用户提供服务。它可能用来解决服务器端由于系统超负荷时关闭哪些连接,然后把从动辅助服务器连接到客户端。实际操作过程中,可以使用这个命令把连接转移到从动辅助服务器上面,从而决定优先使用从动辅助服务器。实际操作中,可以把服务器从一个主机转换到另外一个主机。在不把从动辅助服务器首先转让给用户的NNTP服务器上,可以首先使用这个命令。
3.12.2 返回
202 slave status noted
4 一个简单的会话过程
这儿有一个假定的过程勇于从NNTP新闻服务器上完成一些特定的任务。其中C表示从客户端发送给服务器的命令,S表示服务器对客户端的回应。
4.1. 例 1 - 用NEXT命令访问下一个文章
S: (listens at TCP port 119)
C: (requests connection on TCP port 119)
(客户端询问服务器可以使用的新闻组列表)
C: LIST
S: 215 list of news groups follows
S: net.wombats 00543 00501 y
S: net.unix-wizards 10125 10011 y
S: (其他更多的信息)
S: net.idiots 00100 00001 n
S: .
(客户端选择新闻组)
C: GROUPS net.unix-wizards
S: 211 104 10011 10125 net.unix-wizards group selected
(there are 104 articles on file, from 10011 to 10125)
(客户端选择一个文章阅读)
C: STAT 10110
S: 223 10110 <23445@sdcsvax.ARPA> article retrieved - statistics
only (article 10110 selected, its message-id is
<23445@sdcsvax.ARPA>)
(客户端查看文章头)
C: HEAD
S: 221 10110 <23445@sdcsvax.ARPA> article retrieved - head follows
(文件头部显示在这儿)
S: .
(客户端希望阅读文章正文)
C: BODY
S: 222 10110 <23445@sdcsvax.ARPA> article retrieved - body follows
(文件正文显示在这儿)
S: .
(客户端选择下一个文章)
C: NEXT
S: 223 10113 <21495@nudebch.uucp> article retrieved - statistics only (现在选择10113作为当前文件指针)
(客户端完成任务)
C: QUIT
S: 205 goodbye.
4.2. 例2 - 使用ARTICLE命令完整的访问文章
S: (listens at TCP port 119)
C: (requests connection on TCP port 119)
S: 201 UCB-VAX netnews server ready -no posting allowed
C: GROUP msgs
S: 211 103 402 504 msgs Your new group is msgs
(有103篇文章,编号从402到504)
C: ARTICLE 401
S: 423 No such article in this newsgroups
C: QUIT
S: 205 Imaginary Institute news server ceasing service. Bye!
4.4. 例4 - 用POST发送文章
S: (listens at TCP port 119)
C: (requests connection on TCP port 119)
S: 200 BANZAIVAX news server ready, posting allowed.
C: POST
S: 340 Continue posting; Period on a line by itself to end
C: (通过RFC850格式传输文章)
C: .
S: 240 Article posted successfully.
C: QUIT
S: 205 BANZAIVAX closing connection. Goodbye.
4.5. 例5 - 在连接期间中断
S: (listens at TCP port 119)
C: (requests connection on TCP port 119)
S: 201 genericvax news server ready, no posting allowed.
(假设已经会谈了一段时间,并且已经选择了新闻组)
C: NEXT
S: 223 1013 <5734@mcvax.UUCP> Article retrieved; text separate.
C: HEAD
C: 221 1013 <5734@mcvax.UUCP> Article retrieved; head follows.
S: (发送文章头部,但是中途由于某种原因连接出错了,将出现。)
S: (ends current line with a CR-LF pair)
S: .
S: 400 Connection closed by operator. Goodbye.
S: (closes connection)
4.6. 例6 - 使用新闻服务器发送新闻到其他服务器上
S: (listens at TCP port 119)
C: (requests connection on TCP port 119)
S: 201 Foobar NNTP server ready (no posting)
(询问从2 am, May 15, 1985以后添加的新闻组)
C: NEWGROUPS 850515 020000
S: 235 New newsgroups since 850515 follow
S: net.fluff
S: net.lint
S: .
(询问从2 am, May 15, 1985以后添加的所有新闻)
C: NEWNEWS * 850515 020000
S: 230 New news since 850515 020000 follows
S: <1772@foo.UUCP>
S: <87623@baz.UUCP>
S: <17872@GOLD.CSNET>
S: .
(查阅文件 <1772@foo.UUCP>)
C: ARTICLE <1772@foo.UUCP>
S: 220 <1772@foo.UUCP> All of article follows
S: (sends entire message)
S: .
(查阅文件 <87623@baz.UUCP>
C: ARTICLE <87623@baz.UUCP>
S: 220 <87623@baz.UUCP> All of article follows
S: (sends entire message)
S: .
(查阅文件 <17872@GOLD.CSNET>
C: ARTICLE <17872@GOLD.CSNET>
S: 220 <17872@GOLD.CSNET> All of article follows
S: (sends entire message)
S: .
(客户端希望转发最近的文章)
C: IHAVE <4105@ucbvax.ARPA>
S: 435 Already seen that one, where you been?
(客户端完成任务)
C: QUIT
S: 205 Foobar NNTP server bids you farewell.
4.7. 命令与返回综述
下列命令与返回被NNTP服务设计为公认的。
4.7.1. 命令序列
ARTICLE
BODY
GROUP
HEAD
HELP
IHAVE
LAST
LIST
NEWGROUPS
NEWNEWS
NEXT
POST
QUIT
SLAVE
STAT
4.7.2. 返回
100 help text follows
199 debug output
200 server ready - posting allowed
201 server ready - no posting allowed
202 slave status noted
205 closing connection - goodbye!
211 n f l s group selected
215 list of newsgroups follows
220 n <a> article retrieved - head and body follow
221 n <a> article retrieved - head follows
222 n <a> article retrieved - body follows
223 n <a> article retrieved - request text separately
230 list of new articles by message-id follows
231 list of new newsgroups follows
235 article transferred ok
240 article posted ok
335 send article to be transferred. End with <CR-LF>.<CR-LF>
340 send article to be posted. End with <CR-LF>.<CR-LF>
400 service discontinued
411 no such news group
412 no newsgroup has been selected
420 no current article has been selected
421 no next article in this group
422 no previous article in this group
423 no such article number in this group
430 no such article found
435 article not wanted - do not send it
436 transfer failed - try again later
437 article rejected - do not try again.
440 posting not allowed
441 posting failed
500 command not recognized
501 command syntax error
502 access restriction or permission denied
503 program fault - command not performed
I have a process (C program) which generates a child and waits for
it to return. What I would like to do is to be able to run the
child process interactively for a while before kicking itself into
the background so I can return to the parent process (while the
child process is RUNNING in the background). Can it be done? And
if it can, how?
Please reply by E-mail. Thanks in advance.
Hon-Man Wong
5.主要参考文献
[1] Crocker, D., "Standard for the Format of ARPA Internet Text Messages", RFC-822, Department of Electrical Engineering, University of Delaware, August, 1982.
[2] Horton, M., "Standard for Interchange of USENET Messages", RFC-850, USENET Project, June, 1983.
[3] Postel, J., "Transmission Control Protocol- DARPA Internet Program Protocol Specification", RFC-793, USC/Information Sciences Institute, September, 1981.
[4] Postel, J., "Simple Mail Transfer Protocol", RFC-821, USC/Information Sciences Institute, August, 1982.
6.感谢
作者希望真诚表示由于对此说明做出贡献的许多人,并且特别到致谢Erik Fair与Chuq von Rospach , 没有他们的灵感,就没有整个事件。
7. 特别说明
<1> UNIX是贝尔实验室的一个商标.
全文完
RFC977 - Network News Transfer Protocol 网络新闻传送协议NNTP