﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Prayer-随笔分类-SOCKET</title><link>http://www.cppblog.com/prayer/category/9100.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Thu, 21 Mar 2019 07:39:44 GMT</lastBuildDate><pubDate>Thu, 21 Mar 2019 07:39:44 GMT</pubDate><ttl>60</ttl><item><title>使用telnet发送带附件的邮件</title><link>http://www.cppblog.com/prayer/archive/2011/12/13/162027.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 13 Dec 2011 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/13/162027.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162027.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/13/162027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162027.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<p>[root@localhost ~]# telnet smtp.126.com 25<br />Trying 202.108.5.141...<br />Connected to smtp.126.com (202.108.5.141).<br />Escape character is '^]'.<br />220 126.com Anti-spam GT for Coremail System (126com[071018])<br />ehlo <font face="宋体">###</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#35;&#35;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">@126.com</a> //###代表你的126邮箱用户名<br />250-mail<br />250-AUTH LOGIN PLAIN<br />250-AUTH=LOGIN PLAIN<br />250 8BITMIME<br />auth login<br />334 dXNlcm5hbWU6<br />###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //###代表你的126邮箱用户名的base64编码<br />334 UGFzc3dvcmQ6<br />###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //###代表你的126邮箱密码的base64编码<br />235 Authentication successful<br />mail from:&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#35;&#35;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">###@126.com</a>&gt; <a>//###@126.com</a>代表你的126邮箱地址<br />250 Mail OK<br />rcpt to:&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#35;&#35;&#64;&#109;&#97;&#105;&#108;&#46;&#112;&#115;&#121;&#99;&#104;&#99;&#110;&#46;&#99;&#111;&#109;">###@mail.psychcn.com</a>&gt; <a>//###@mail.psychcn.com</a><br />250 Mail OK<br />data<br />354 End data with &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;<br />subject: How to use telnet to send mail<br />Content-Type: multipart/mixed; boundary=a<br />--a<br />Content-Disposition: attachment; filename="1.txt"&nbsp;&nbsp; //附件<br />--a<br />.<br />250 Mail OK queued as smtp4,jdKowLB7CjgufrJIgl6YIA==.63330S2 1219657375<br />quit<br />221 Bye<br />Connection closed by foreign host.</p></div><br /><img src ="http://www.cppblog.com/prayer/aggbug/162027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-13 14:21 <a href="http://www.cppblog.com/prayer/archive/2011/12/13/162027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用telnet进行SMTP的验证</title><link>http://www.cppblog.com/prayer/archive/2011/12/13/162021.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 13 Dec 2011 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/13/162021.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162021.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/13/162021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162021.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162021.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<div class="code">=========先计算BASE64编码的用户名密码，认证登录需要用到=========== <br />[crazywill@localhost crazywill]$ perl -MMIME::Base64 -e 'print encode_base64("crazywill");'<br />Y3Jhenl3aWxs<br /><br />[crazywill@localhost crazywill]$ perl -MMIME::Base64 -e 'print encode_base64("mypassword");'<br />bXlwYXNzd29yZA==<br /></div>
<div class="code">======================开始SMTP发信操作==========================<br />[crazywill@localhost crazywill]$ telnet smtp.163.com 25 #telnet登录25端口<br />Trying 202.108.5.81... <br />Connected to smtp.163.com. <br />Escape character is '^]'. <br />220 163.com Coremail SMTP(Anti Spam) System <br />EHLO smtp.163.com # 握手 :) <br />250-mail <br />250-PIPELINING <br />250-AUTH LOGIN PLAIN <br />250-AUTH=LOGIN PLAIN <br />250 8BITMIME <br />AUTH LOGIN # 开始认证登录 <br />334 dXNlcm5hbWU6 <br />crazywill <br />334 UGFzc3dvcmQ6 <br />mypassword <br />535 Error: authentication failed # 直接用户名密码不能登录 <br />AUTH LOGIN <br />334 dXNlcm5hbWU6 <br />Y3Jhenl3aWxs <br />334 UGFzc3dvcmQ6 <br />bXlwYXNzd29yZA== <br />235 Authentication successful # 使用Base64编码则成功登录 <br />MAIL FROM:&lt;test@163.com&gt; # 邮件发送方 <br />553 You are not authorized to send mail, authentication is required # 不可伪造发送邮件 <br />MAIL FROM:&lt;crazywill@163.com&gt; # 邮件发送方 <br />250 Mail OK <br />RCPT TO:&lt;crazywill@163.com&gt; # 邮件的接收方，若有多个收件人，则重复这一语句多次。 <br />250 Mail OK <br />DATA # 邮件体内容 <br />354 Please start mail input. <br />TO: crazywill@163.com # 此处的TO，FROM，等内容，可以随便造假 :) 可以骗人但骗不了懂得查看邮件源码的。 <br />FROM: cccc@163.com <br />SUBJECT: test by telnet/smtp <br /><br />test, just a test. # 邮件正文内容，与Header部分空一行开始写 <br />. # 邮件写完，以一个句点加回车结果。 <br />250 Mail OK queued as smtp10,wKjADQ2ApxRnnqBE0CWaEw==.38326S3 # 返回250 表示发送成功。 <br />NOOP # 空语句，不执行任何操作，一般用来保持和服务器连接，不要掉线 <br />250 OK <br />QUIT # 退出 <br />221 Closing connection. Good bye. <br />Connection closed by foreign host. <br />[crazywill@localhost crazywill]$ <br /><br /><br />======================开始POP3收信操作========================== <br /><br />[crazywill@localhost crazywill]$ telnet pop.163.com 110 #telnet登录110端口 <br />Trying 202.108.5.104... <br />Connected to pop.163.com. <br />Escape character is '^]'. <br />+OK Welcome to coremail Mail Pop3 Server (163com[20050206]) <br />USER crazywill # 用户名 <br />+OK core mail <br />PASS mypassword # 登录密码 <br />+OK 254 message(s) [27676669 byte(s)] <br />STAT # 查看邮箱状态 <br />+OK 254 27676669 <br />LIST # 邮件列表 <br />+OK 254 27676669 <br />1 2468 <br />2 21945 <br />3 33136 <br />4 2071 <br />5 3364 <br />6 18906 <br />7 3136 <br />8 24764 <br />................. <br /><br />TOP 254 0 # 查看指定邮件的邮件头，0表示查看整个邮件头，其它正整数表示限制返回多少行。 <br />+OK core mail <br />Received: from smtp.63.com (unknown [58.252.70.158]) <br />by smtp5 (Coremail) with SMTP id wKjREDrA9gIfFqlEjCnRAg==.29062S4; <br />Mon, 03 Jul 2006 21:07:18 +0800 (CST) <br />TO: crazywill@163.com <br />FROM : cccc@163.com # 这里即前面发信时伪造的一个假发送人信息，平时正常操作只显示这个。 <br />SUBJECT: test by telnet/smtp # 邮件主题 <br />Message-Id: &lt;44A91687.0E6F6C.07562&gt; <br />Date: Mon, 3 Jul 2006 21:07:19 +0800 (CST) <br />Sender: crazywill@163.com # 这里是真正的发送人，不可伪造。 <br /><br /><br />. <br />RETR 254 # 获取指定邮件 <br />+OK 354 octets <br />Received: from smtp.63.com (unknown [58.252.70.158]) <br />by smtp5 (Coremail) with SMTP id wKjREDrA9gIfFqlEjCnRAg==.29062S4; <br />Mon, 03 Jul 2006 21:07:18 +0800 (CST) <br />TO: crazywill@163.com <br />FROM : cccc@163.com <br />SUBJECT: test by telnet/smtp <br />Message-Id: &lt;44A91687.0E6F6C.07562&gt; <br />Date: Mon, 3 Jul 2006 21:07:19 +0800 (CST) <br />Sender: crazywill@163.com <br /><br />test, just a test. <br />. <br /><br />DELE 254 # 删除第254封邮件 <br />+OK core mail <br />STAT # 查看邮箱状态 <br />+OK 253 27676315 <br />QUIT # 退出 <br />+OK core mail <br />Connection closed by foreign host. <br />[crazywill@localhost crazywill]$ <br /><br /><br />=============================================================== <br /><br />QUESTION: <br />如何发送给多人，如何CC，BCC？ <br /><br />ANSWER: (此答案由SnifferPro监听OUTLOOK发送多人邮件分析出来的) <br />同一封信发送/抄送给多人，在MAIL FROM:&lt;...&gt; 后，多次使用 RCPT TO:&lt;...&gt; <br />每次一个邮件地址，需要发给多少人就 RCPT TO 多少次。 <br /><br />在DATA里面写的CC，BCC，TO，等信息只起显示作用，与实际发送人接收人无关。 <br /><br />CC与BCC的差别：同样都是RCPT TO指定收件人，但是邮件客户端程序，不会将BCC的收件人写到DATA要传送的数据里。</div>
<div class="code">&nbsp;</div>
<div class="code"><strong>使用IMAP</strong></div>
<div class="code">[crazywill@localhost crazywill]$ <span style="color: #0000ff">telnet 192.168.0.1 143</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #telnet登录IMAP协议的143端口<br />Trying 192.168.0.1...<br />Connected to xxxxxx<br />Escape character is '^]'.<br />* OK&nbsp;xxxxxxx System IMap Server Ready<br /><span style="color: #0000ff">A01 LOGIN abc 123</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #用户登录<br />A01 OK LOGIN completed<br /><span style="color: #0000ff">A02 LIST "" *&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #列出所有信箱列表<br />* LIST () "/" "INBOX"<br />* LIST () "/" "Drafts"<br />* LIST () "/" "Sent Items"<br />* LIST () "/" "Trash"<br />* LIST () "/" "Junk E-mail"<br />* LIST () "/" "Virus Items"<br />* LIST () "/" "&amp;XfJT0ZABkK5O9g-"<br />* LIST () "/" "&amp;g0l6Pw-"<br />* LIST () "/" "&amp;XfJT0ZABkK5O9g-/DailyReport"<br />* LIST () "/" "Jira"<br />* LIST () "/" "Admin"<br />* LIST () "/" "&amp;V4NXPpCuTvY-"<br />A02 OK LIST Completed<br /><span style="color: #0000ff">A03 Select INBOX</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #选择收件箱<br />* 37 EXISTS<br />* 0 RECENT<br />* OK [UIDVALIDITY 1] UIDs valid<br />* FLAGS (\Answered \Seen \Deleted \Draft)<br />* OK [PERMANENTFLAGS (\Answered \Seen \Deleted \Draft)] Limited<br />A03 OK [READ-WRITE] SELECT completed<br /><span style="color: #0000ff">A04 Search ALL</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #查询收件箱所有邮件<br />* OK X-SEARCH in progress<br />* OK X-SEARCH in progress<br />* OK X-SEARCH in progress<br />* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37<br />A04 OK SEARCH completed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 列出符合条件的邮件序号(ALL表示列出当前信箱INBOX中的所有邮件)<br /><span style="color: #0000ff">A05 Search new</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #查询收件箱所有新邮件<br />* OK X-SEARCH in progress<br />* OK X-SEARCH in progress<br />* OK X-SEARCH in progress<br />* SEARCH<br />A05 OK SEARCH completed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #找不到任何新邮件<br /><span style="color: #0000ff">A06 Fetch 5 full</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #获取第5封邮件的邮件头<br />* 5 FETCH (INTERNALDATE "27-Jun-2006 14:00:27 +0800" FLAGS (\Seen) ENVELOPE ("Tue, 27 Jun 2006 13:56:51 +0800" "test " (("xxxxxx" NIL "xxxx" "xxxxxx")) (("xxxxxx" NIL "xxxx" "xxxxxx")) (("xxxxxx" NIL "xxxx" "xxxxxx")) ((NIL NIL "xxx" "xxxxx")) NIL NIL NIL "&lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#48;&#48;&#48;&#102;&#48;&#49;&#99;&#54;&#57;&#57;&#97;&#101;&#36;&#55;&#99;&#53;&#48;&#49;&#52;&#97;&#48;&#36;&#54;&#98;&#48;&#49;&#97;&#56;&#99;&#48;&#64;&#120;&#120;&#120;&#120;&#120;&#120;&#46;&#120;&#120;"><font color="#1a8bc8">000f01c699ae$7c5014a0$6b01a8c0@xxxxxx.xx</font></a>&gt;") BODY (("text" "plain" ("charset" "gb2312") NIL NIL "base64" 14 2) ("text" "html" ("charset" "gb2312") NIL NIL "base64" 420 7) "alternative") RFC822.SIZE 1396)<br />A06 OK Fetch completed<br /><span style="color: #0000ff">A07 Fetch 5 rfc822</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #获取第5封邮件的完整内容<br />* 5 FETCH (RFC822 {1396}<br />[这里是邮件内容，太长，略...]<br />A07 OK Fetch completed<br /><span style="color: #0000ff">A08 Fetch 5 flags</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #查询第5封邮件的标志位<br />A08 OK Fetch completed<br /><span style="color: #0000ff">A09 Store 5 +flags.silent (\deleted)</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设置标志位为删除<br />A09 OK STORE completed<br /><span style="color: #0000ff">A10 Expunge</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #永久删除当前邮箱INBOX中所有设置了\deleted标志的信件<br />A10 OK EXPUNGE completed<br /><span style="color: #0000ff">A11 noop&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 空语句<br />A11 OK NOOP completed<br /><br /><br /><span style="color: #0000ff">A20 LOGOUT&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #退出<br />* BYE IMAP4rev1 Server logging out<br />A20 OK LOGOUT completed<br />Connection closed by foreign host.<br />[crazywill@localhost crazywill]$<br /></div></div><script type="text/javascript">
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
var isLogined = false;
var cb_blogId = 33492;
var cb_entryId = 1320266;
var cb_blogApp = "rootq";
var cb_blogUserGuid = "c38e3d0b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2008/10/27 11:08:00';
</script><img src ="http://www.cppblog.com/prayer/aggbug/162021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-13 13:52 <a href="http://www.cppblog.com/prayer/archive/2011/12/13/162021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getservbyname()</title><link>http://www.cppblog.com/prayer/archive/2011/12/13/162014.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 13 Dec 2011 04:17:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/13/162014.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162014.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/13/162014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162014.html</trackback:ping><description><![CDATA[简述： 
<div class="spctrl"></div>　　返回对应于给定服务名和协议名的相关服务信息。 
<div class="spctrl"></div>　　#include &lt;windows.h&gt; 
<div class="spctrl"></div>　　struct servent FAR * PASCAL FAR getservbyname(const char 
<div class="spctrl"></div>　　Far * name, const char FAR *proto); 
<div class="spctrl"></div>　　name： 一个指向服务名的指针。 
<div class="spctrl"></div>　　proto： 指向协议名的指针（可选）。如果这个指针为空，getservbyname()返回第一个name与s_name或者某一个s_aliases匹配的服务条目。否则getservbyname()对name和proto都进行匹配。 
<div class="spctrl"></div>　　注释： 
<div class="spctrl"></div>　　getservbyname()返回与给定服务名对应的包含名字和服务号信息的servent结构指针。结构的声明如下： 
<div class="spctrl"></div>　　struct servent { 
<div class="spctrl"></div>　　char FAR * s_name; 
<div class="spctrl"></div>　　char Far * FAR * s_aliases; 
<div class="spctrl"></div>　　short s_port; 
<div class="spctrl"></div>　　char FAR * s_proto; 
<div class="spctrl"></div>　　}; 
<div class="spctrl"></div>　　结构的成员有： 
<div class="spctrl"></div>　　成员 用途 
<div class="spctrl"></div>　　s_name 正规的服务名。 
<div class="spctrl"></div>　　s_aliases 一个以空指针结尾的可选服务名队列。 
<div class="spctrl"></div>　　s_port 连接该服务时需要用到的端口号，返回的端口号是以网络<a href="http://baike.baidu.com/view/567601.htm" target="_blank"><font color="#136ec2">字节顺序</font></a>排列的。 
<div class="spctrl"></div>　　s_proto 连接该服务时用到的协议名。 <img src ="http://www.cppblog.com/prayer/aggbug/162014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-13 12:17 <a href="http://www.cppblog.com/prayer/archive/2011/12/13/162014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ISO8583规范</title><link>http://www.cppblog.com/prayer/archive/2010/10/13/129769.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 13 Oct 2010 12:03:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/13/129769.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/129769.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/13/129769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/129769.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/129769.html</trackback:ping><description><![CDATA[<div class=blog_content>ISO8583接口的详细资料 <br>　　ISO8583包（简称8583包）是一个国际标准的包格式，最多由128个字段域组成，每个域都有统一的规定，并有定长与变长之分。8583包前面一段为位图，用来确定包的字段域组成情况。其中位图是8583包的灵魂，它是打包解包确定字段域的关键，而了解每个字段域的属性则是填写数据的基础。 <br><br><br>　　1、 位图描述如下： <br>　　位图位置：1 <br>　　格式：定长 <br>　　类型：B16（二进制16位，16*8=128bit） <br>　　描述： <br>　　如将位图的第一位设为'1'，表示使用扩展位图（128个域），否则表示只使用基本位图（64个域）。 <br>　　如使用某数据域，应在位图中将相应的位设位'1'，如使用41域，需将位图的41位设为'1'。 <br>　　选用条件：如使用65到128域，需设位图域第一位为'1' <br><br>　　2、每个域的定义如下： <br>　　typedef struct ISO8583 <br>　　{ <br>　　　　int　　 bit_flag;　　　　　 /*域数据类型0 -- string, 1 -- int, 2 -- binary*/ <br>　　　　char　　*data_name;　　　　 /*域名*/ <br>　　　　int　　 length;　　　　　　 /*数据域长度*/ <br>　　　　int　　 length_in_byte;　　 /*实际长度（如果是变长）*/ <br>　　　　int　　 variable_flag;　　　/*是否变长标志0：否 2：2位变长, 3：3位变长*/ <br>　　　　int　　 datatyp;　　　　　　/*0 -- string, 1 -- int, 2 -- binary*/ <br>　　　　char　　*data;　　　　　　　/*存放具体值*/ <br>　　　　int　　 attribute;　　　　　/*保留*/ <br>　　} ISO8583; <br>　　　　 <br>　　ISO8583 Tbl8583[128] = <br>　　{ <br>　　　　/* FLD 01 */ {0,"BIT MAP,EXTENDED", 8, 0, 0, 2, NULL,0}, <br>　　　　/* FLD 02 */ {0,"PRIMARY ACCOUNT NUMBER", 22, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 03 */ {0,"PROCESSING CODE", 6, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 04 */ {0,"AMOUNT, TRANSACTION", 12, 0, 0, 1, NULL,0}, <br>　　　　/* FLD 05 */ {0,"NO USE", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 06 */ {0,"NO USE", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 07 */ {0,"TRANSACTION DATE AND TIME", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 08 */ {0,"NO USE", 8, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 09 */ {0,"NO USE", 8, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 10 */ {0,"NO USE", 8, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 11 */ {0,"SYSTEM TRACE AUDIT NUMBER", 6, 0, 0, 1, NULL,0}, <br>　　　　/* FLD 12 */ {0,"TIME, LOCAL TRANSACTION", 6, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 13 */ {0,"DATE, LOCAL TRANSACTION", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 14 */ {0,"DATE, EXPIRATION", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 15 */ {0,"DATE, SETTLEMENT", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 16 */ {0,"NO USE", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 17 */ {0,"DATE, CAPTURE", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 18 */ {0,"MERCHANT'S TYPE", 4, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 19 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 20 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 21 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 22 */ {0,"POINT OF SERVICE ENTRY MODE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 23 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 24 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 25 */ {0,"POINT OF SERVICE CONDITION CODE", 2, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 26 */ {0,"NO USE", 2, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 27 */ {0,"NO USE", 1, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 28 */ {0,"field27", 6, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 29 */ {0,"NO USE", 8, 0, 1, 0, NULL,0}, <br>　　　　/* FLD 30 */ {0,"NO USE", 8, 0, 1, 0, NULL,0}, <br>　　　　/* FLD 31 */ {0,"NO USE", 8, 0, 1, 0, NULL,0}, <br>　　　　/* FLD 32 */ {0,"ACQUIRER INSTITUTION ID. CODE", 11, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE", 11, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 34 */ {0,"NO USE", 28, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 35 */ {0,"TRACK 2 DATA", 37, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 36 */ {0,"TRACK 3 DATA",104, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 37 */ {0,"RETRIEVAL REFERENCE NUMBER", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 38 */ {0,"AUTH. IDENTIFICATION RESPONSE", 6, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 39 */ {0,"RESPONSE CODE", 2, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 40 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 41 */ {0,"CARD ACCEPTOR TERMINAL ID.", 8, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 42 */ {0,"CARD ACCEPTOR IDENTIFICATION CODE", 15, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 43 */ {0,"CARD ACCEPTOR NAME LOCATION", 40, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 44 */ {0,"ADDITIONAL RESPONSE DATA", 25, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 45 */ {0,"NO USE", 76, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 46 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 47 */ {0,"field47", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 48 */ {0,"ADDITIONAL DATA --- PRIVATE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 49 */ {0,"CURRENCY CODE,TRANSACTION", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 50 */ {0,"CURRENCY CODE,SETTLEMENT", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 51 */ {0,"NO USE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 52 */ {0,"PERSONAL IDENTIFICATION NUMBER DATA", 8, 0, 0, 2, NULL,0}, <br>　　　　/* FLD 53 */ {0,"SECURITY RELATED CONTROL INformATION", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 54 */ {0,"ADDITIONAL AMOUNTS",120, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 55 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 56 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 57 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 58 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 59 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 60 */ {0,"NO USE", 5, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 61 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 62 */ {0,"NO USE", 11, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 63 */ {0,"NO USE", 11, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 64 */ {0,"MESSAGE AUTHENTICATION CODE FIELD", 8, 0, 0, 2, NULL,0}, <br>　　　　/* FLD 65 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 66 */ {0,"NO USE", 1, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 67 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 68 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 69 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 70 */ {0,"SYSTEM MANAGEMENT INformATION CODE", 3, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 71 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 72 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 73 */ {0,"NO USE", 6, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 74 */ {0,"NUMBER OF CREDITS", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 75 */ {0,"REVERSAL NUMBER OF CREDITS", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 76 */ {0,"NUMBER OF DEBITS", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 77 */ {0,"REVERSAL NUMBER OF DEBITS", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 78 */ {0,"NUMBER OF TRANSFER", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 79 */ {0,"REVERSAL NUMBER OF TRANSFER", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 80 */ {0,"NUMBER OF INQUIRS", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 81 */ {0,"AUTHORIZATION NUMBER", 10, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 82 */ {0,"NO USE", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 83 */ {0,"CREDITS,TRANSCATION FEEAMOUNT", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 84 */ {0,"NO USE", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 85 */ {0,"DEBITS,TRANSCATION FEEAMOUNT", 12, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 86 */ {0,"AMOUNT OF CREDITS", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 87 */ {0,"REVERSAL AMOUNT OF CREDITS", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 88 */ {0,"AMOUNT OF DEBITS", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 89 */ {0,"REVERSAL AMOUNT OF DEBITS", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 90 */ {0,"ORIGINAL DATA ELEMENTS", 42, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 91 */ {0,"FILE UPDATE CODE", 1, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 92 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 93 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 94 */ {0,"SERVICE INDICATOR", 7, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 95 */ {0,"REPLACEMENT AMOUNTS", 42, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 96 */ {0,"NO USE", 8, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 97 */ {0,"AMOUNT OF NET SETTLEMENT", 16, 0, 0, 0, NULL,0}, <br>　　　　/* FLD 98 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 99 */ {0,"SETTLEMENT INSTITUTION ID", 11, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 100 */ {0,"RECVEING INSTITUTION ID", 11, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 101 */ {0,"FILENAME", 17, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 102 */ {0,"ACCOUNT IDENTIFICATION1", 28, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 103 */ {0,"ACCOUNT IDENTIFICATION2", 28, 0, 2, 0, NULL,0}, <br>　　　　/* FLD 104 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 105 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 106 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 107 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 108 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 109 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 110 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 111 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 112 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 113 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 114 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 115 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 116 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 117 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 118 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 119 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 120 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 121 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 122 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 123 */ {0,"NEW PIN DATA", 8, 0, 3, 2, NULL,0}, <br>　　　　/* FLD 124 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 125 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 126 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 127 */ {0,"NO USE", 999, 0, 3, 0, NULL,0}, <br>　　　　/* FLD 128 */ {0,"MESSAGE AUTHENTICATION CODE FIELD", 8, 0, 0, 2, NULL,0}, <br>　　}; <br>　　　　　　 <br>　　３、变长，定长域说明 <br>　　如第二域：域名为主帐号， <br>　　数据类型为string <br>　　长度为22（是长长度不得超过此数） <br>　　是个２位变长域 <br>　　由于是２位变长，在打包时需在数据域前加上数据的实际长度，如为19位，则表示为： <br>　　19＋数据值（即前两位为长度） <br><br>　　如第三域：域名为处理码， <br>　　数据类型为string <br>　　长度为６ <br>　　是个定长域 <br>　　必须填满６位。 <br>　　 <br>　　附A:ISO8583各域段的说明 <br>　　1，信息类型（message type)定义 <br>　　位图位置：－ <br>　　格式：定长 <br>　　类型：N4 <br>　　描述： <br>　　数据包的第一部分，定义数据包的类型。 <br>　　数据类型由数据包的发起者设定，应遵循以下要求： <br>　　数据包开始部分必须是信息类型； <br>　　对不支持的信息类型能给出拒绝应答。 <br>　　0100授权交易 <br>　　0110授权交易答复 <br>　　0200金融交易 <br>　　0210金融交易答复 <br>　　0240查询交易 <br>　　0250查询交易答复 <br>　　0400冲正交易 <br>　　0410冲正交易答复 <br>　　0800管理交易 <br>　　0810管理交易答复 <br><br>　　2，位图(Bit Map) - 基本位图和扩展位图 <br>　　位图位置：1 <br>　　格式：定长 <br>　　类型：B16 <br>　　描述： <br>　　如将位图的第一位设为'1'，表示使用扩展位图，否则表示只使用基本位图。 <br>　　如使用某数据域，应在位图中将相应的位设位'1'，如使用41域，需将位图的41位设为'1'。 <br>　　选用条件：如使用65到128域，需设位图域为'1' <br><br>　　3，Bit02主帐号(Primary Account Number ) <br>　　位图位置：02 <br>　　格式：变长,LLVAR <br>　　类型：N..22 <br>　　描述： <br>　　唯一的确认一个用户交易的基本帐号。 <br>　　由于银行电子服务系统涉及多个应用系统，而帐号长度最多为22位，故将原标准的19长度改为22位。 <br><br>　　Bit03 处理代码 （Processing Code ) <br>　　位图位置：03 <br>　　格式：定长 <br>　　类型：N6 <br>　　描述：用于描述交易对客户帐户造成何种影响的代码。 <br>　　处理代码和信息码一起可唯一定义一种交易的类型。 <br>　　处理代码由以下三部分组成： <br>　　位置描述 <br>　　1－2交易动作码 <br>　　3－4付出帐户类型，用于借记类，如查询、代收费、转场交易。 <br>　　5－6收入帐户类型，用于代收费、转帐等。 <br><br>　　其中： <br>　　ff : 付出帐户 <br>　　tt： 收入帐户 <br>　　* 视主机而定 <br><br>　　5，Bit04 交易金额 （Amount, Transaction) <br>　　位图位置：04 <br>　　格式：定长 <br>　　类型：N12 <br>　　描述：帐户人要求交易的交易金额，不含任何处理和交易费用。 <br>　　金额的表示和货币代码有关，应能表示相应货币的最小单位。参ISO4217有关货币代码定义。 <br>　　如&#8220;000000000100&#8221;用于表示美元，表示1.00元；如用于表示意大利货币，则表示100里拉。对于查询等交易，应设交易金额为&#8220;000000000000&#8221;。 <br><br>　　6，Bit06交易日期和时间（Transmission Date and Time） <br>　　位图位置：07 <br>　　格式：定长，MMDDhhmmss <br>　　类型：N10 <br>　　描述：本地交易日期和时间 <br>　　 <br>　　7，Bit11系统跟踪号（Systems Trace Audit Number) <br>　　位图位置：11 <br>　　格式：定长 <br>　　类型：N6 <br>　　描述：终端交易的跟踪号码。 <br>　　交易发起终端填写，和&#8220;交易日期、时间&#8221;、信息类型等合在一起可唯一定义某一个终端的唯一一笔交易。即是说，在同一天，对一终端，同一类交易的系统跟踪号应保证不同。系统跟踪号在交易过程中不能修改。使用此域来匹配请求和通知类交易的返回。 <br>　　应用系统使用此域来检查收到的授权、金融、自动冲正、结算、管理和网管等类交易的应答包是否是其请求包的应答。 <br>　　系统跟踪号不用于匹配自动冲正交易，也不用于在预授权消费时匹配前面的预授权交易。参90域。 <br>　　对于银行电子服务系统，其系统跟踪号是交易流水号。 <br><br>　　8，Bit12本地交易时间（Time ,Local Transaction） <br>　　位图位置：12 <br>　　格式：定长，hhmmss <br>　　类型：N6 <br>　　描述：交易在终端上发生的时间。 <br>　　本地交易时间在交易处理过程中不能改变。在自动冲正，存贮转发时，本地交易时间不能改变。 <br>　　 <br>　　9，Bit13本地交易日期(Date ,Local Transaction) <br>　　位图位置：13 <br>　　格式：定长,MMDD <br>　　类型：N4 <br>　　描述：交易在终端上发生的时间。 <br>　　本地交易时间不能改变，在自动冲正、存储转发交易时，本地交易时间也不能改变。 <br><br>　　10，Bit14有效期(Date ,Expiration) <br>　　位图位置：14 <br>　　格式：定长,YYMM <br>　　类型：N4 <br>　　描述：卡的有效期，年年月月 <br>　　由于卡类写磁格式不同，收单行可能提不出卡的有效期，授权机构从卡的二磁道中提取卡的有效期。如卡，无二磁道，收单行应要求手工录入卡的有效期。 <br>　　选用条件：100、200、400等交易如没有2、3磁道时，一定要有此域。 <br>　　 <br>　　11，Bit15结算日期(Date ,Settlement) <br>　　位图位置：15 <br>　　格式：定长，MMDD <br>　　类型：N4 <br>　　描述： <br>　　银行电子服务系统和主机结算的时间，格式月月日日。结帐日期前发生的交易参加当天结算。 <br>　　在结算时，结帐日期也用于计算处理、交易费用。 <br><br>　　12，Bit17获取日期(Date ,Capture) <br>　　位图位置：17 <br>　　格式：定长，MMDD <br>　　类型：N4 <br>　　描述：从主机获取交易的记帐日期。通常用于主机和商户清算。 <br>　　 <br>　　13，Bit18商户类型（Merchant's Type) <br>　　位图位置：18 <br>　　格式：定长 <br>　　类型：N4 <br>　　描述：定义商户产品和服务类型的代码 <br>　　商户类型用于金融、授权交易，用于指定服务点的类型。它主要有以下用途： <br>　　决定预授权交易得到确认的最长时间； <br>　　控制合法限额； <br>　　为交易授权处理，控制网络操作规则； <br>　　欺诈检测； <br>　　用于商户分类报表； <br>　　交易费用处理。 <br><br>　　根据ISO8583标准，应使用相应的国家标准。 <br>　　商户类型代码表如下： <br>　　商户类型代码行业类型说明 <br>　　4215邮递服务 <br>　　4511民航 <br>　　4722旅游 <br>　　4782过桥费 <br>　　4789其他运输服务 <br>　　4614电信服务 <br>　　5542加油站 <br>　　5812餐馆 <br>　　5999购物 <br>　　6010金融机构－人工现金支付 <br>　　6011金融机构－自动现金支付 <br>　　6012金融机构－各类服务 <br>　　7011酒店、旅馆 <br>　　7299各类个人服务：洗衣、美容、 <br>　　7399各类商业服务：停车场、租车、广告、其他服务 <br>　　7699各类维修服务：维修、洗车、拖车 <br>　　7996娱乐：电影、剧院、体育、游戏 <br>　　8099医疗服务 <br>　　8111法律服务 <br>　　8999各类专业服务：会计、教育、装修、工程 <br>　　 <br>　　选用条件：服务点终端发起的交易一定要有此域。 <br><br>　　14，Bit22服务点输入方式(Point-of-Service Entry Mode) <br>　　位图位置：22 <br>　　格式：定长 <br>　　类型：N3 <br>　　描述：在服务终端上定义PIN和PAN的输入方式。 <br>　　服务点输入方式包含以下两个方面组合而成： <br>　　位置描述 <br>　　1－2在服务终端上PAN有效期输入方式 <br>　　3－3在服务终端上PIN的输入方式 <br>　　PAN的输入方式编码如下： <br>　　PAN输入方式描述 <br>　　00不知 <br>　　01手工 <br>　　02读磁卡 <br>　　03条码扫描仪（BAR） <br>　　04光学符号阅读器（OCR） <br>　　05集成电路卡（IC卡） <br>　　 <br>　　PIN的输入方式编码如下： <br>　　PIN输入方式描述 <br>　　0不知 <br>　　1终端能接收PIN <br>　　2终端不能接收PIN <br>　　 <br>　　选用条件：服务点终端发起的交易一定要有此域。 <br>　　 <br>　　15，Bit25服务点条件代码(Point-of-Service Condition Code) <br>　　位图位置：25 <br>　　格式：定长 <br>　　类型：N2 <br>　　描述：定义交易发生的服务点类型 <br>　　用法说明：下面是CYBERBANK支持的服务点条件代码。 <br>　　服务点条件代码服务点终端类型 <br>　　2自动柜员机（ATM） <br>　　10银行终端（10） <br>　　14POS <br>　　20电话银行 <br>　　 <br>　　16，Bit32收单机构标识码(Acquirer institution Identification) <br>　　位图位置：32 <br>　　格式：LLVAR <br>　　类型：N..11 <br>　　描述：在金融交易中此域表示交易发生的银行机构的标识码。应答数据包必须和请求数据包此域相同。 <br>　　 <br>　　17，Bit33授权机构标识码(Forwarding Institution Identification Code) <br>　　位图位置：33 <br>　　格式：LLVAR <br>　　类型：N..11 <br>　　描述：在金融交易中此域表示帐户所在的银行机构的标识码 <br>　　在网管交易800/810中，本域含有交易发起机构的代码。 应答数据包必须和请求数据包此域相同。 <br>　　 <br>　　18，Bit35二磁道数据(Track 2 Data) <br>　　位图位置：35 <br>　　格式：LLVAR <br>　　类型：Z..37 <br>　　描述：写在卡二磁道的数据。数据组成遵循ISO7811－1985标准，数据中包含域分隔符，但不包含卡启始、结束符、LRC等。 <br>　　收卡行应检测卡的二磁道是否符合国际标准。 <br>　　为支持国际交换收单行应将二磁道中的分隔符换为&#8220;＝&#8221;。除此外不能对二磁道数据进行任何修改，如修改PAN的校验字、有效期、服务码等。 <br>　　 <br>　　19，Bit36三磁道数据(Track 3 Data) <br>　　位图位置：36 <br>　　格式：LLLVAR <br>　　类型：Z...104 <br>　　描述：写在卡三磁道的数据。数据应组成遵循ISO4909标准，数据中包含域分隔符，但不包含卡启始、结束符、LRC等。 <br>　　注意：长度说明为3位数字长。 <br>　　 <br>　　20，Bit37检索索引号(Retrieval Reference Number) <br>　　位图位置：37 <br>　　格式：定长 <br>　　类型：AN12 <br>　　描述：检索索引号用来在任何时间标识一个金融、授权、自动冲正交易。 <br>　　检索索引号不要求打印在持卡人的帐单上。它的主要目的是在收单行和授权行之间定义一个数据项用于跟踪和检索交易。授权机构可以将检索索引号打印在客户的对帐单上。 <br>　　检索索引号由收单行分配。 <br>　　选用条件：可包含在收单机构的交易请求中。如在交易请求中有，则应答数据中一定应原样返回。 <br><br>　　21，Bit38授权码(Authorization Identification) <br>　　位图位置：38 <br>　　格式：定长 <br>　　类型：AN6 <br>　　描述：交易授权机构返回的返回代码。 <br>　　授权码用于在服务点终端上信用卡授权； <br>　　授权机构按网络操作规定，可选使用本域。 <br>　　 <br>　　22，Bit39返回码(Response Code) <br>　　位图位置：39 <br>　　格式：定长 <br>　　类型：AN2 <br>　　描述：对一交易定义其处理结果的编码。 <br>　　返回码用于说明授权机构对金融（授权）交易的处理状态；也用来指明自动冲正交易的冲正原因；还用来指出目标主机已接收到文件修改、结算、管理、网管等交易请求。 <br>　　返回码应尽可能准确，应尽可能描述清楚所遇到的问题和状态。网络交换主机、收单行主机有可能会按不同的返回码收取不同的交易处理费用，并执行不同的处理过程。 <br><br>　　23，Bit41收卡单位终端标识码(Card Acceptor Terminal Identification) <br>　　位图位置：41 <br>　　格式：定长 <br>　　类型：ANS8 <br>　　描述：定义在收单单位中定义一个服务终端的标识码，在同一商户中服务终端标识码应唯一。 <br>　　 <br>　　24，Bit42收卡商户定义码(Card Acceptor Identification Code) <br>　　位图位置：42 <br>　　格式：定长 <br>　　类型：ANS15 <br>　　描述：在本地和网络中定义交易单位（商户）的编码。 <br>　　 <br>　　25，Bit43收卡商户位置(Card Acceptor Location) <br>　　位图位置：43 <br>　　格式：定长 <br>　　类型：ANS40 <br>　　描述：在本地和网络中定义收卡单位（商户）的国家、省。城市等。 <br>　　选用条件：如对外卡网络，一定要包含此域。 <br>　　 <br>　　26，Bit44附加返回数据(Additional ResponseData) <br>　　位图位置：44 <br>　　格式：LLVAR <br>　　类型：ANS..25 <br>　　描述：在金融（授权）交易中授权机构返回的其他信息。 <br>　　 <br>　　27，Bit48附加数据-私用(Additional Data-Private) <br>　　位图位置：48 <br>　　格式：LLLVAR <br>　　类型：ANS...999 <br>　　描述：银行电子服务系统使用此域作以下用途 <br>　　存放批量查询的返回数据 <br>　　其格式与输出格式表对应 <br>　　 <br>　　28，Bit49交易货币代码(Currency Code,Transaction) <br>　　位图位置：49 <br>　　格式：定长 <br>　　类型：AN3 <br>　　描述：按ISO4217定义的交易货币代码，用来表示&#8220;交易金额&#8221;（field04）所用的货币种类。 <br>　　交易货币代码是指在收单单位进行交易所用的交易种类。 <br>　　 <br>　　29，Bit50结算货币代码(Currency Code,Settlement) <br>　　位图位置：50 <br>　　格式：定长 <br>　　类型：AN3 <br>　　描述：按ISO4217定义的结算货币代码，用来表示结算金额、结算处理费、结算交易费等所用的货币种类。 <br>　　结算货币代码是指在进行结算和清算过程中所用的货币种类。 <br>　　 <br>　　30，Bit52用户密码(PIN)数据(PIN Data) <br>　　位图位置：52 <br>　　格式：定长 <br>　　类型：B16 <br>　　描述：用户在服务终端上交易用于识别用户合法性的一些数字。 <br>　　PIN在分行主机用分行主机密钥按ANSIX9.8标准加密，形成密文块。 <br>　　选用条件：如果在终端上输入了密码，就需要此域。 <br>　　 <br>　　31，Bit53密码相关控制信息(Security Related Control) <br>　　位图位置：53 <br>　　格式：定长 <br>　　类型：AN16 <br>　　描述：本域提供有关密码块的附加信息，用于指出用于PIN计算的PIN key，用于MAC计算的MAC key。 <br>　　本域格式如下表所示： <br>　　0－1格式代码2N&#8220;20&#8221; <br>　　2－3PIN加密算法2N&#8220;01&#8221;:DES <br>　　4－5密文块格式2N&#8220;01&#8221;:ANSI <br>　　6PIN密钥索引1N&#8216;1&#8217;或&#8216;2&#8217; <br>　　7MAC密钥索引1N&#8216;1&#8217;或&#8216;2&#8217; <br>　　8－11MAC检查数据4B <br>　　12－15填充4N <br><br>　　在BOC信用卡网络中PIN和MAC各使用两个密钥---'1'号和'2'密钥，交易中计算PIN和MAC时只能各用某一个KEY，同时需将所用的KEY索引号填写此域。 选用条件：如果有PIN域或MAC域，一定需有此域。 <br><br>　　32，Bit54附加金额(Additional Amounts) <br>　　位图位置：54 <br>　　格式：LLLVAR <br>　　类型：ANS...120 <br>　　描述：此域由授权行主机将客户的余额返回给收单终端，以显示或打印在客户回单上。 <br>　　在此域中最多可有6个余额返回，每个余额返回格式如下： <br>　　位置描述 <br>　　0－1处理码3－4或5－6位定义的帐号类型 <br>　　2－3金额类型：01－帐户金额 <br>　　02－可用金额 <br>　　03－拥有金额 <br>　　04－应付金额 <br>　　40－可用取款限额 <br>　　56－可用转帐限额 <br>　　4－6金额的货币代码 <br>　　7&#8216;D&#8217;－借记金额，&#8217;C&#8217;－贷记金额 <br>　　8－19余额数目 <br>　　 <br>　　六个余额中必须返回可用余额，在ATM、POS上显示可用余额 <br>　　 <br>　　33，Bit64信息确认码(MAC) <br>　　位图位置：64 <br>　　格式：定长 <br>　　类型：B16 <br>　　描述：数据包的最后一个域，用于验证信息来源的合法性，以及数据包中数据是否未被篡改。 <br>　　MAC的计算参ANSIX.99,(最后八字节未满八位者左补零，右补零？) <br>　　为提高效率，在发送者和接收者之间，只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域，它们将参加MAC的计算。 <br>　　 <br>　　1位图域名 <br>　　2基本帐号 <br>　　3处理代码 <br>　　4交易金额 <br>　　11系统跟踪号 <br>　　12本地交易时间 <br>　　13本地交易日期 <br>　　32收单机构代码 <br>　　38授权码 <br>　　39返回码 <br>　　41收单终端代码 <br>　　49交易货币代码 <br>　　95替换金额 <br>　　选用条件：只使用了1－64域的数据包使用此域。 <br>　　 <br>　　34，Bit70管理信息码(System Management Indormation Code) <br>　　位图位置：70 <br>　　格式：定长 <br>　　类型：N3 <br>　　描述： <br>　　 <br>　　用于定义和维护银行电子服务系统内部通讯网络状态和应用工作状态。 <br>　　网络管理信息代码用于管理清算日期"cutoff"，通讯"sign on/sign off"，"key exchange"等。 <br>　　支持以下一些网络管理信息码 <br>　　NMIC网络管理信息码动作 <br>　　001签到(Sign on) <br>　　002签退(Sign off) <br>　　101交换密钥(Key exchange) <br>　　201结帐日期切换(Cutoff) <br>　　202结帐日期切换完成 <br>　　301测试(Echo test) <br>　　 <br>　　35，Bit74贷记交易笔数(Transaction Number) <br>　　位图位置：74 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：贷记金融交易总的成功交易次数 <br>　　CYBERBANK软件在收到如下一个处理代码时会增加贷记交易次数。 <br>　　交易码交易服务 <br>　　00贷记，购物与服务 <br>　　01贷记，取现 <br>　　02贷记，调整(客户调整) <br>　　 <br>　　36，Bit75贷记自动冲正交易笔数(Credits,Reversal Number) <br>　　位图位置：75 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：贷记收单行自动冲正、&#8220;ChargeBack"等交易总的交易次数 <br>　　CYBERBANK软件在收到如下一个处理代码时会增加贷记自动冲正交易笔数 <br>　　交易码交易服务 <br>　　20贷记，退货 <br>　　21贷记，存款 <br>　　22贷记，调整（客户修改） <br>　　 <br>　　37，Bit76借记交易笔数(Debits,Number) <br>　　位图位置：76 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：借记金融交易总的成功交易次数 <br>　　CYBERBANK软件在收到如下一个处理代码时会增加借记交易次数。 <br>　　交易码交易服务 <br>　　00借记，购物与服务 <br>　　01借记，取现 <br>　　02借记，调整(客户调整) <br>　　 <br>　　38，Bit77借记自动冲正交易笔数(Debits,Reversal Number) <br>　　位图位置：77 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：借记收单行自动冲正、&#8220;ChargeBack"等交易总的交易次数 <br>　　CYBERBANK软件在收到如下一个处理代码时会增加借记重发交易次数，并在清算表报中反映。 <br>　　交易码交易服务 <br>　　20借记(!!!)，退货 <br>　　21借记，存款 <br>　　22借记，调整（客户修改） <br>　　 <br>　　39，Bit78转帐交易笔数(Transfers,Number) <br>　　位图位置：78 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：转帐的交易总次数。 <br>　　系统在收到如下一个处理代码的金融交易时会增加转帐交易的次数。 <br>　　交易码交易服务 <br>　　40客户相关帐户间转帐 <br>　　 <br>　　40，Bit79转帐自动冲正交易笔数(Transfers,Reversal Number) <br>　　位图位置：79 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：转帐的自动冲正交易总次数。 <br>　　系统在收到如下一个处理代码的自动冲正交易时会增加转帐自动冲正交易的次数。 <br>　　交易码交易服务 <br>　　40客户相关帐户间转帐 <br>　　 <br>　　41，Bit80查询交易笔数(Inquiries,Number) <br>　　位图位置：80 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：成功的查询交易次数。 <br>　　系统软件在收到如下一个处理代码时会增加查询交易次数。 <br>　　交易码交易服务 <br>　　30查询可用金额 <br>　　 <br>　　42，Bit81授权交易笔数(Authorization,Number) <br>　　位图位置：81 <br>　　格式：定长 <br>　　类型：N10 <br>　　描述：成功的授权交易总额 <br>　　在收到一个授权交易时系统将授权交易笔数加一。 <br>　　 <br>　　43，Bit83贷记交易费金额(Credits,Transaction FeeAmount) <br>　　位图位置：83 <br>　　格式：定长 <br>　　类型：N12 <br>　　描述：净交易费用，如交易金额为正。 <br>　　 <br>　　44，Bit85借记交易费金额(Debits,Transaction FeeAmount) <br>　　位图位置：85 <br>　　格式：定长 <br>　　类型：N12 <br>　　描述：净交易费用，如交易金额为负。 <br>　　 <br>　　45，Bit86贷记交易金额(Credits,Amount) <br>　　位图位置：86 <br>　　格式：定长 <br>　　类型：N16 <br>　　描述：贷记金融交易总的交易金额，不含任何费用。 <br>　　系统在收到如下一个处理代码时会增加贷记交易金额，并在清算表报中反映。 <br>　　交易码交易服务 <br>　　20贷记，退货 <br>　　21贷记，存款 <br>　　22贷记，调整（客户修改） <br>　　 <br>　　46，Bit87贷记自动冲正金额(Credits,Reversal Amount) <br>　　位图位置：87 <br>　　格式：定长 <br>　　类型：N16 <br>　　描述：信用卡自动冲正交易的总金额，不含任何费用。 <br>　　 <br>　　47，Bit88借记交易金额(Debits,Amount) <br>　　位图位置：88 <br>　　格式：定长 <br>　　类型：N16 <br>　　描述：借记金融交易总的交易金额，不含任何费用。 <br>　　系统在收到如下一个处理代码时会增加借记交易金额，并在清算表报中反映。 <br>　　交易码交易服务 <br>　　00借记，购物与服务 <br>　　01借记，取现 <br>　　02借记，调整(客户调整) <br>　　 <br>　　48，Bit89借记自动冲正交易金额(Debits,Reversal Amount) <br>　　位图位置：89 <br>　　格式：定长 <br>　　类型：N16 <br>　　描述：借记自动冲正交易的总金额，不含任何费用。 <br>　　 <br>　　49，Bit90原交易的数据元素(Original Data Elements) <br>　　位图位置：90 <br>　　格式：定长 <br>　　类型：N42 <br>　　描述：存放原交易的一些数据，用于修改或自动冲正。 <br>　　数据由以下五部分组成： <br>　　位置描述 <br>　　1－4信息类型码 <br>　　设为原交易的信息类型代码 <br>　　5－10系统跟踪号 <br>　　原交易系统跟踪号 <br>　　11－20交易日期和时间 <br>　　原交易的交易日期和时间 <br>　　21－31原收单机构 <br>　　原交易的收单机构 <br>　　不足11位的机构代码，左补&#8216;0&#8217; <br>　　32－42原向前机构 <br>　　原交易的收单机构 <br>　　不足11位的机构代码，左补&#8216;0&#8217; <br>　　 <br>　　50，Bit91文件修改编码(File Update Code) <br>　　位图位置：91 <br>　　格式：定长 <br>　　类型：AN1 <br>　　描述：用此域指示某文件怎样维护。 <br>　　CYBERBANK支持以下一些修改代码： <br>　　1增加记录 <br>　　2改变记录 <br>　　3删除记录 <br>　　5查询 <br>　　7增加文件 <br>　　 <br>　　选用条件： <br>　　 <br>　　51，Bit94服务指示码(Service Indicator) <br>　　位图位置：94 <br>　　格式：定长 <br>　　类型：AN7 <br>　　描述：指示文件修改服务。 <br>　　 <br>　　选用条件： <br>　　 <br>　　52，Bit95代替金额(Replacement Amounts) <br>　　位图位置：95 <br>　　格式：定长 <br>　　类型：N42!!! <br>　　描述：客户修改或部分取消已完成的交易，最后实际发生的交易金额， <br>　　交易的原交易金额存放在90域。 <br>　　本域由以下4部分组成 <br>　　Sub-ElementAmountAttribute <br>　　交易实际金额N12 <br>　　结算实际金额N12 <br>　　实际交易费用X＋N8 <br>　　实际结算费用X＋N8 <br>　　 <br>　　53，Bit97净结算金额(Net Settlement Amount) <br>　　位图位置：97 <br>　　格式：定长 <br>　　类型：X+N16 <br>　　描述：此域为净结帐金额。 <br>　　502交易中用于发送当天的净结算金额 <br>　　例：&#8220;C0000000020000000&#8221;，表示贷方（'＋'？）200000.00元。 <br>　　&#8220;D0000000020000000&#8221;，表示借方（'－'？）200000.00元。 <br>　　 <br>　　 <br>　　54，Bit99结算机构码(Settlement Institution Identification) <br>　　位图位置：99 <br>　　格式：LLVAR <br>　　类型：N..11 <br>　　描述：此域存放接收清算信息的机构代码。 <br>　　返回数据包此域必须和请求数据包一致。 <br>　　 <br>　　55，Bit100接收机构码（Receiving Institution Identification) <br>　　位图位置：100 <br>　　格式：LLVAR <br>　　类型：N..11 <br>　　描述：金融交易此域存放授权机构代码。 <br>　　网管类交易，800/820交易，此域存放请求的目的机构代码。 <br>　　返回数据包此域必须和请求数据包一致。 <br>　　 <br>　　56，Bit101文件名(FileName) <br>　　位图位置：101 <br>　　格式：LLVAR <br>　　类型：ANS..17 <br>　　描述：发送机构设置的文件名。 <br>　　 <br>　　57，Bit102帐号1(Account Identification1) <br>　　位图位置：102 <br>　　格式：LLVAR <br>　　类型：ANS..28 <br>　　描述：一个特定的客户帐号。帐号1用来描述受借记、转出、支付等交易影响的帐户。 <br>　　选用条件：转帐时使用。 <br>　　 <br>　　58，Bit103帐号2(Account Identiication2) <br>　　位图位置：103 <br>　　格式：LLVAR <br>　　类型：ANS..28 <br>　　描述：交易的补充信息，如：第二货币号、利率代码、起止日期等。 <br>　　定义如下表 <br>　　0000000000000000000000000000000000000000000000000 <br>　　位置长度描述 <br>　　00－2122帐户 <br>　　22－276发卡机构号 <br>　　 <br>　　如果此域存在，将按此机构代码作为路由信息。 <br>　　选用条件：机构间转帐时使用。 <br>　　 <br>　　 <br>　　60，Bit123新密码数据(New PIN Data) <br>　　位图位置：123 <br>　　格式：LLLVAR <br>　　类型：B...16 <br>　　描述：修改密码交易时存放新密码。 <br>　　格式参考52域 <br>　　选用条件：修改密码交易时必须有此域。 <br>　　 <br>　　61，Bit128信息确认码(MAC) <br>　　位图位置：128 <br>　　格式：定长 <br>　　类型：B16 <br>　　描述：数据包的最后一个域，用于验证信息来源的合法性，以及数据包中数据是否未被篡改。 <br>　　MAC的计算参ANSIX.99 <br>　　为提高效率，在发送者和接收者之间，只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域，它们将参加MAC的计算。 <br>　　 <br>　　位图域名 <br>　　2基本帐号 <br>　　3处理代码 <br>　　4交易金额 <br>　　11系统跟踪号 <br>　　12本地交易时间 <br>　　13本地交易日期 <br>　　32收单机构代码 <br>　　38授权码 <br>　　39返回码 <br>　　41收单终端代码 <br>　　49交易货币代码 <br>　　95替换金额 <br>　　 <br>　　选用条件：使用65－128数据域的数据包需使用此域。 <br><br>　　typedef struct <br>　　{ <br>　　　　long　　sync_counter; <br>　　　　char　　keytype; <br>　　} AB8583_Security_Ctrl_Info; <br>　　 <br>　　typedef struct <br>　　{ <br>　　　　char　　length[4]; <br>　　　　struct <br>　　　　{ <br>　　　　　　char　　account_type[3]; <br>　　　　　　char　　amount_type[3]; <br>　　　　　　char　　currency_code[4]; <br>　　　　　　double　amount; <br>　　　　} ledger_balance_amount; <br>　　　　 <br>　　　　struct <br>　　　　{ <br>　　　　　　char　　account_type[3]; <br>　　　　　　char　　amount_type[3]; <br>　　　　　　char　　currency_code[4]; <br>　　　　　　double　amount; <br>　　　　} available_balance_amount; <br>　　} AB8583_Balance_Amount; <br>　　 <br>　　typedef struct <br>　　{ <br>　　　　　　char　　encryption_key_used; <br>　　　　　　char　　mac_key_used; <br>　　　　　　char　　message_effect; <br>　　　　　　char　　no_of_unlogged_txns; <br>　　} AB8583_Message_Indicator; <br>　　 <br>　　typedef struct <br>　　{ <br>　　　　　　char　　auth_function_code; <br>　　　　　　char　　auth_mode; <br>　　　　　　char　　auth_id_response_code[7]; <br>　　　　　　char　　service_business_code[5]; <br>　　　　　　char　　invoice_number[11]; <br>　　} AB8583_Auth_Operation_Code; <br>　　 <br>　　typedef struct <br>　　{ <br>　　　　　　char　　org_message_type[5]; <br>　　　　　　char　　org_system_trace_number[7]; <br>　　　　　　char　　org_transaction_date_time[11]; <br>　　　　　　char　　org_acqr_inst_id_code[12]; <br>　　　　　　char　　ora_forw_inst_id_code[12]; <br>　　} AB8583_Original_Data_Elements; <br>　　 <br>　　typedef struct <br>　　{ <br>　　　　　　double　actual_amount_of_transaction; <br>　　　　　　double　actual_amount_of_settlement; <br>　　　　　　double　actual_amount_of_transaction_fee; <br>　　　　　　double　actual_amount_of_settlement_fee; <br>　　} AB8583_Replacement_Amounts; <br>　　 <br>　　 <br>　　BIT DATA_NAME TYPE <br>　　typedef struct <br>　　{ <br>　　　　char　　message_type[5]; <br>　　　　/*** <br>　　　　MESSAGE_TYPE_IDENTIFICATION N4 <br>　　　　0100 授权类请求消息(授权,撤消授权,余额查询) <br>　　　　0110 授权类应答消息(授权,撤消授权,余额查询) <br>　　　　0200 金融类请求消息(取款,存款,消费,退款) <br>　　　　0210 金融类应答消息(取款,存款,消费,退款) <br>　　　　0420 冲正类报告消息(取款,存款,消费,退款,授权) <br>　　　　0430 冲正类应答消息(取款,存款,消费,退款,授权) <br>　　　　0524 对帐类报告消息(ATM结算对帐,POS结算对帐) <br>　　　　0534 对帐类应答消息(ATM结算对帐,POS结算对帐) <br>　　　　0800 网络业务管理类请求消息(重置密钥) <br>　　　　0810 网络业务管理类应答消息(重置密钥) <br>　　　　0820 网络业务管理类报告消息(状态设置,广播通知,申请重置密钥) <br>　　　　0830 网络业务管理类应答消息(状态设置,广播通知,申请重置密钥) <br>　　　　****/ <br>　　　　 <br>　　　　char　　primary_account_number[20]; <br>　　　　/* 2 PRIMARY_ACCOUNT_NUMBER N...19(LLVAR) */ <br>　　　　char　　processing_code[7]; <br>　　　　/* 3 PROCESSING_CODE N6 */ <br>　　　　double　amount_of_transactions; <br>　　　　/* 4 AMOUNT_OF_TRANSACTIONS N12 */ <br>　　　　double　amount_of_settlement; <br>　　　　/* 5 AMOUNT_OF_SETTLEMENT N12 */ <br>　　　　char　　transmission_date_and_time[11]; <br>　　　　/* 7 TRANSMISSION_DATE_AND_TIME N10 */ <br>　　　　long　　system_trace_audit_number; <br>　　　　/* 11 SYSTEM_TRACE_AUDIT_NUMBER N6 */ <br>　　　　char　　time_of_local_transaction[7]; <br>　　　　/* 12 TIME_OF_LOCAL_TRANSACTION N6 */ <br>　　　　char　　date_of_local_transaction[5]; <br>　　　　/* 13 DATE_OF_LOCAL_TRANSACTION N4 */ <br>　　　　char　　date_of_settlement[5]; <br>　　　　/* 15 DATE_OF_SETTLEMENT N4 */ <br>　　　　char　　date_of_capture[5]; <br>　　　　/* 17 DATE_OF_CAPTURE N4 */ <br>　　　　char　　business_type[4]; <br>　　　　/* 18 BUSINESS_TYPE AN3 */ <br>　　　　char　　point_of_service_entry_mode[4]; <br>　　　　/* 22 POINT_OF_SERVICE_ENTRY_MODE N3 */ <br>　　　　char　　point_of_service_PIN_capture_code[3]; <br>　　　　/* 26 POINT_OF_SERVICE_PIN_CAPTURE_CODE N2 */ <br>　　　　double　fee_of_transaction; <br>　　　　/* 28 FEE_OF_TRANSACTION N8 */ <br>　　　　double　fee_of_settlement; <br>　　　　/* 29 FEE_OF_SETTLEMENT X+N8 */ <br>　　　　char　　acquiring_institution_id_code[12]; <br>　　　　/* 32 ACQUIRING_INSTITUTION_IDENTIFICATION_CODE N..11(LLVAR) */ <br>　　　　char　　forwarding_institution_id_code[12]; <br>　　　　/* 33 FORWARDING_INSTITUTION_IDENTIFICATION_CODE N..11(LLVAR) */ <br>　　　　char　　track_2_data[38]; <br>　　　　/* 35 TRACK_2_DATA Z...37(LLVAR) */ <br>　　　　char　　track_3_data[105]; <br>　　　　/* 36 TRACK_3_DATA Z...104(LLLVAR) */ <br>　　　　long　　retrieval_reference_number; <br>　　　　/* 37 RETRIEVAL_REFERENCE_NUMBER AN12 */ <br>　　　　char　　auth_id_response[7]; <br>　　　　/* 38 AUTHORIZATION_IDENTIFICATION_RESPONSE AN6 */ <br>　　　　char　　response_code[3]; <br>　　　　/* 39 RESPONSE_CODE AN2 */ <br>　　　　char　　card_acceptor_terminal_id[9]; <br>　　　　/* 41 CARD_ACCEPTOR_TERMINAL_IDENTIFICATION ANS8 <br>　　　　前两位的定义如下: <br>　　　　51 ATM终端 <br>　　　　52 银行POS <br>　　　　53 商户POS */ <br>　　　　char　　card_acceptor_id_code[16]; <br>　　　　/* 42 CARD_ACCEPTOR_IDENTIFICATION_CODE ANS15 */ <br>　　　　char　　card_acceptor_name_location[41]; <br>　　　　/* 43 CARD_ACCEPTOR_NAME_LOCATION ANS40　*/ <br>　　　　char　　additional_response_data[26]; <br>　　　　/* 44 ADDITIONAL_RESPONSE_DATA ANS..25(LLVAR) */ <br>　　　　char　　broadcasted_message[1000]; <br>　　　　/* 48 BROADCASTED_MESSAGE ANS...999 */ <br>　　　　char　　currency_code_of_transaction[4]; <br>　　　　/* 49 CURRENCY_CODE_OF_TRANSACTION AN3 */ <br>　　　　char　　currency_code_of_settlement[4]; <br>　　　　/* 50 CURRENCY_CODE_OF_SETTLEMENT AN3 */ <br>　　　　char　　PIN[8]; <br>　　　　/* 52 PIN_DATA B64 */ <br>　　　　AB8583_Security_Ctrl_Info　 security_ctrl_info; <br>　　　　/* 53 SECURITY_RELATED_CONTROL_INformATION N16 <br>　　　　SYNC_COUNTER N8 <br>　　　　密钥同步计数器 <br>　　　　RESERVED N7 <br>　　　　KEY_TYPE N1 <br>　　　　1 用于交换中心和成员行机构之间的PIN加密解密 <br>　　　　2 用于交换中心和成员行机构之间的MAC计算 <br>　　　　3 用于成员行和终端之间的PIN加密解密 */ <br>　　　　AB8583_Balance_Amount　 balance_amount; <br>　　　　/* 54 BALANCE_AMOUNT AN43 <br>　　　　LENGTH N3(040) <br>　　　　LEDGER_BALANCE_AMOUNT <br>　　　　ACCOUNT_TYPE N2(CC=30,SC=10) <br>　　　　AMOUNT_TYPE N2(01) <br>　　　　CURRENCY_CODE AN3(156) <br>　　　　AMOUNT X+N12 <br>　　　　AVAILABLE_BALANCE_AMOUNT <br>　　　　ACCOUNT_TYPE N2(CC=30,SC=10) <br>　　　　AMOUNT_TYPE N2(01) <br>　　　　CURRENCY_CODE AN3(156) <br>　　　　AMOUNT X+N12 */ <br>　　　　char　　second_account_number[20]; <br>　　　　/* 55 SECOND_ACCOUNT_NUMBER N...19(LLVAR) */ <br>　　　　AB8583_Message_Indicator　　message_indicator; <br>　　　　/* 60 MESSAGE_INDICATOR N...005(LLLVAR) <br>　　　　ENCRYPTION_KEY_USED N1 <br>　　　　PIN加密/解密所使用的密钥标识,定义如下: <br>　　　　0 不加密 <br>　　　　1 旧密钥 <br>　　　　2 新密钥 <br>　　　　MAC_KEY_USED N1 <br>　　　　0 不加密 <br>　　　　1 旧密钥 <br>　　　　2 新密钥 <br>　　　　MESSAGE_EFFECT N1 <br>　　　　0 消息用于生产环境 <br>　　　　1 消息用于测试环境 <br>　　　　2 ATM取款交易对帐标志 <br>　　　　3 保留 <br>　　　　4 银行POS取款交易对帐标志 <br>　　　　5 银行POS存款交易对帐标志 <br>　　　　6 商用POS消费交易对帐标志 <br>　　　　7 商用POS退款交易对帐标志 <br>　　　　NO_OF_UNLOGGED_TXNS N2 */ <br>　　　　AB8583_Auth_Operation_Code　auth_operation_code; <br>　　　　/* 61 AUTHORIZATION_OPERATION_CODE N...022(LLLVAR) <br>　　　　AUTHORIZATION_FUNCTION_CODE N1 <br>　　　　0 授权 <br>　　　　1 撤消授权 <br>　　　　2 消费 <br>　　　　3 退款 <br>　　　　4 取款 <br>　　　　5 查询 <br>　　　　AUTHORIZATION_MODE N1 <br>　　　　0 不需授权 <br>　　　　1 需授权 <br>　　　　AUTH_ID_RESPONSE_CODE N6 <br>　　　　SERVICE_BUSINESS_CODE N4 <br>　　　　INVOICE_NUMBER N10 */ <br>　　　　char　　authorizing_agent_institution_id_code[12]; <br>　　　　/* 62 AUTHORIZING_AGENT_INSTITUTION_IDENTIFICATION_CODE N...011(LLLVAR) */ <br>　　　　char　　destination_institution_id_code[12]; <br>　　　　/* 63 DESTINATION_INSTITUTION_IDENTIFICATION_CODE N...011(LLLVAR) <br>　　　　64 */ <br>　　　　char　　settlement_code; <br>　　　　/* 66 SETTLEMENT_CODE N1 */ <br>　　　　char　　network_management_information_code[4]; <br>　　　　/* 70 NETWORK_MANAGEMENT_INformATION_CODE N3 */ <br>　　　　char　　date_of_action[7]; <br>　　　　/* 73 DATE_OF_ACTION N6 */ <br>　　　　long　　number_of_credits; <br>　　　　/* 74 NUMBER_OF_CREDITS N10 */ <br>　　　　long　　reversal_number_of_credits; <br>　　　　/* 75 REVERSAL_NUMBER_OF_CREDITS N10 */ <br>　　　　long　　number_of_debits; <br>　　　　/* 76 NUMBER_OF_DEBITS N10 */ <br>　　　　long　　revsersal_number_of_debits; <br>　　　　/* 77 REVERSAL_NUMBER_OF_DEBITS N10 */ <br>　　　　long　　number_of_transfer; <br>　　　　/* 78 NUMBER_OF_TRANSFER N10 */ <br>　　　　long　　reversal_number_of_transfer; <br>　　　　/* 79 REVERSAL_NUMBER_OF_TRANSFER N10 */ <br>　　　　long　　number_of_inquiries; <br>　　　　/* 80 NUMBER_OF_INQUIRIES N10 */ <br>　　　　double　processing_fee_amount_of_credits; <br>　　　　/* 82 PROCESSING_FEE_AMOUNT_OF_CREDITS N12 */ <br>　　　　double　processing_fee_amount_of_debits; <br>　　　　/* 84 PROCESSING_FEE_AMOUNT_OF_DEBITS N12 */ <br>　　　　double　amount_of_credits; <br>　　　　/* 86 AMOUNT_OF_CREDITS N16 */ <br>　　　　double　reversal_amount_of_credits; <br>　　　　/* 87 REVERSAL_AMOUNT_OF_CREDITS N16 */ <br>　　　　double　amount_of_debits; <br>　　　　/* 88 AMOUNT_OF_DEBITS N16 */ <br>　　　　double　reversal_amount_of_debits; <br>　　　　/* 89 REVERSAL_AMOUNT_OF_DEBITS N16 */ <br>　　　　AB8583_Original_Data_Elements　 original_data_elements; <br>　　　　/* 90 ORIGINAL_DATA_ELEMENTS N42 <br>　　　　冲正交易所用的原始数据记录,内容如下: <br>　　　　ORIGINAL_DATA_ELEMENTS <br>　　　　ORG_MESSAGE_TYPE N4 <br>　　　　ORG_SYSTEM_TRACE_NUMBER N6 <br>　　　　ORG_TRANSACTION_DATA_TIME N10 <br>　　　　ORG_ACQR_INST_ID_CODE N11 <br>　　　　ORG_FORW_INST_ID_CODE N11 */ <br>　　　　AB8583_Replacement_Amounts　replacement_amounts;　 <br>　　　　/* 95 REPLACEMENT_AMOUNTS AN42 */ <br>　　　　char　　message_securty_code[8]; <br>　　　　/* 96 MESSAGE_SECURTY_CODE B64 */ <br>　　　　doublea mount_of_net_settlement; <br>　　　　/* 97 AMOUNT_OF_NET_SETTLEMENT X+N16　*/ <br>　　　　char　　settlement_institution_id_code[12]; <br>　　　　/* 99 SETTLEMENT_INSTITUTION_IDENTIFICATION_CODE N...11(LLVAR) */ <br>　　　　char　　receiveing_institution_id_code[12]; <br>　　　　/* 100 RECEIVEING_INSTITUTION_IDENTIFICATION_CODE N...11(LLVAR) */ <br>　　　　char　　sender_institution_id_code[12]; <br>　　　　/* 120 SENDER_INSTITUTION_IDENTIFICATION_CODE N...11(LLVAR) */ <br>　　　　long　　sender_reference_number; <br>　　　　/* 121 SENDER_REFERENCE_NUMBER AN12 */ <br>　　　　char　　MAC[8]; <br>　　　　/* 128 MESSAGE_AUTHENTICATION_CODE B64 */ <br>　　} <br></div>
<script type=text/javascript><!--
google_ad_client = "pub-1076724771190722";
/* JE个人博客468x60 */
google_ad_slot = "5506163105";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</script>
<script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script>
<script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script>
<script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script>
<script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script>
<img src ="http://www.cppblog.com/prayer/aggbug/129769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-13 20:03 <a href="http://www.cppblog.com/prayer/archive/2010/10/13/129769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX里有关TCP/IP的命令</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107672.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107672.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107672.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107672.html</trackback:ping><description><![CDATA[<h3>AIX里有关TCP/IP的命令</h3>
网卡：<br>smit chgenet,chgtok,chgfddi,opschange,mktty:adptr架构快速路径<br>smit mkinet,ppp:slip与ppp快速路径<br>ifconfig:config界面（加参数-a）<br>位置：<br>/etc/hosts 静态主机表<br>/etc/resolv.conf 位址解析的名称服务器<br>/etc/named.boot 名称服务器架构<br>/etc/named.ca 根名称服务器快取<br>/etc/named.data 位址列表<br>/etc/named.rev 反转指标列表<br>nslookup 查询名称服务器资讯<br>网络路由：<br>route 管理路由<br>netstat -rn 列出定义的路由<br>routed 路由(daekmin rip)<br>gated 路由(daekmin rip、egp、hello)<br>/etc/gateways 已知网关<br>/etc/networks 已知网路<br>服务：<br>/etc/services<br>/etc/inetd.conf<br>TCP/IP群组子系统:<br>/etc/rc.net<br>startsrc -g tcpip 启动全部的tcpip子系统 <br>startsrc -s inetd 启动主要internet<br>除错：<br>iptrace 启动封包追踪<br>ipreport 追踪结果格式化输出<br>netstat 网络统计<br>ping 检查是否可以到达
<img src ="http://www.cppblog.com/prayer/aggbug/107672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 17:38 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107670.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107670.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107670.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107670.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107670.html</trackback:ping><description><![CDATA[级别： 中级
<p>&#160;</p>
<p>蒋 莹滢 (jiangyy@cn.ibm.com), 软件工程师, IBM<br>殷 一鸣 (yinym@cn.ibm.com), 软件工程师, IBM<br></p>
<p>2009 年 1 月 31 日</p>
<blockquote>随着互联网技术的不断发展，传统的 IPv4 地址已不能满足用户的需要。新一代的 IPv6 协议也日益被广泛的接受和使用，越来越多的软件系统都要求支持 IPv6 网络协议。然而现有网络环境对 IPv6 的支持仍然非常有限，这给软件的开发和测试都带来了一定的困难。本文将介绍如何使用 Apache 在现有的 IPv4 网络中构建模拟的 IPv6 环境。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><span class=atitle>在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境</span></p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br><img height=6 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><span class=atitle>1 IPv6简介</span></p>
<p>IPv6（Internet Protocol Version 6）作为 IPv4 的升级版本，它是作为一共软件升级安装在设备和<br>操作系统中。为什么需要使用 IPv6，一个最直接的答案就是目前广泛应用的 IPv4 已经无法提供足够的 IP 地址来满足迅速增长的网络。IPv4 采用32位地址长度，只有大约43亿个地址，很快就将被分配完毕。而 IPv6 采用128位的地址长度，几乎可以不受限制的提供地址。当然扩大地址空间只是 IPv6 的众多优势中的重要一项，除此之外，IPv6 还能够提高网络的整体吞吐量、改善服务质量（QoS）、安全性有更好的保证、支持即插即用和移动性、更好实现多播功能等等。</p>
<p>从1992年 IPNG 工作组成立，经历了十几年的发展，虽然 IPv6 离达到与 IPv4 相同的水平仍有距离，但已经有越来越多的支持 IPv6 的设备投入使用，越来越多的软件系统开始支持 IPv6。现在 IPv6 已经可以提供 DNS，Web，Email，Ftp，Telnet 等基本服务。Windows，Sun，Apple 等操作系统也都已经或即将支持 IPv6 协议。IBM 也一直致力于 IPv6 的发展，早在1997年 IBM 就发布了支持 IPv6 的 AIX。如今 DB2，Lotus，Rational，Tivoli 和 WebSphere 也都在逐步支持 IPv6 的应用。</p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br><img height=6 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><span class=atitle>2 在 IPv4 环境中模拟 IPv6 网络</span></p>
<p>正如上节中所述，目前许多与网络应用相关的软件已经加入了对 IPv6 的支持，更有大量的软件正在处于对 IPv6 支持的开发阶段。但是就开发而言，目前许多开发环境并没有对 IPv6 提供很好的支持，尤其当所开发的应用需要经过较老的路由甚至公共网络时。如果希望通过升级网络设备来支持开发环境，将是一笔不小的花费，有时甚至是不现实的（比如短期内升级公共网络支持 IPv6）。</p>
<p>研究如何在现有的 IPv4 网络环境中模拟出 IPv6 环境，使得开发和测试工作能够顺利进行，显得尤为重要。下面介绍一种在 Linux 平台上通过 Apache 服务器来模拟 IPv6 的 HTTP/HTTPS 网络开发测试环境。</p>
<p><span class=smalltitle>2.1 IPv6 网络要求及现有的网络环境</span></p>
<p>图1显示了典型的 HTTP 网络应用，如果需要对这样的网络应用提供 IPv6 的支持，开发和测试人员可能会碰到如下三种情形：</p>
<p>客户端和服务器运行于同一个局域网中，如图1-a</p>
<p>客户端和服务器运行于同一个 Intranet 中，它们之间的网络通路需要经过路由，如图1-b</p>
<p>客户端和服务器分别处于不同的地域，它们之间由 Internet 提供连接，如图1-c。</p>
<br><strong>图 1. 三种典型的 HTTP 网络应用</strong><br><img height=196 alt="三种典型的 HTTP 网络应用" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129941.jpg" width=553> <br>
<p>在这三种不同的情形下，IPv6 的网络环境要求是不同的。对于情形1，只需客户端和服务器所运行的操作系统支持 IPv6 即可通过 IPv6 协议进行通信，若需要提供 Global 地址的通信，则可以通过在局域网内的某台机器上运行一个软件 IPv6 路由来支持，因此其针对 IPv6 的开发和测试相对简单。 对于情形2，由于客户端和服务器之间经过运行于 IP 层的路由，因此要求网络通路上经过的所有路由器均支持 IPv6。 这可能是一个不小的挑战，因为很多 Intranet 环境并没有提供支持 IPv6 的路由。对于情形3，这就要求 Internet 提供 IPv6的支持，就短期看来，Internet 提供全面的 IPv6 支持还不太可能。</p>
<p>因此，在情形2和情形3的环境中，网络硬件支持将成为开发和测试支持 IPv6 的网络应用程序的最大障碍，在2.2节中将给出如何运用现有的 IPv4 网络来进行 IPv6 应用程序的开发和测试，同时又保证其在真实的 IPv6 环境中正常运行。</p>
<p><span class=smalltitle>2.2 利用现有 IPv4 网络模拟 IPv6 环境</span></p>
<p><strong>2.2.1 模拟环境构建的基本原理</strong></p>
<p>图2 - 图3显示了 IPv6 模拟环境的框图，这里存在两种情形，但具体的配置是类似的。<br>对于开发客户端 IPv6 应用程序，其框图如图2；而对于开发服务器端 IPv6 应用程序，其框图如图3。其基本原理就是利用代理技术将原来被 IPv4 网络阻断的客户端或服务器端映射到位于同一局域网内的代理服务器上，这样&#8220;客户端&#8221;与&#8220;服务器端&#8221;就可以进行基于 IPv6 的网络通信了。 在图2中，我们需要代理服务器与客户端运行于同一局域网中，在客户端看来，此代理服务器是一个具备了 IPv6 支持能力的&#8220;服务器&#8221;，即使真正的服务器端并没有支持 IPv6 ，也可以进行客户端的开发和测试。在图3中，我们需要一台机器与服务器端运行于同一局域网中，在服务器端看来，此代理服务器是一个具备了 IPv6 支持能力的&#8220;客户端&#8221;。</p>
<br><strong>图 2. 利用代理将服务器端映射到与客户端同一局域网内</strong><br><img height=251 alt=利用代理将服务器端映射到与客户端同一局域网内 src="http://doc.chinaunix.net/uploadfile/200912/20091217104131477.jpg" width=554> <br><br><strong>图 3. 利用代理将客户端映射到与服务器端同一局域网内</strong><br><img height=208 alt=利用代理将客户端映射到与服务器端同一局域网内 src="http://doc.chinaunix.net/uploadfile/200912/20091217104134687.jpg" width=553> <br>
<p>下面仅以客户端的IPv6环境为例来讲述整个模拟环境的构建过程。</p>
<p><strong>2.2.2 环境的建立</strong></p>
<p>操作系统平台： Linux，内核需支持 IPv6，2.6以上版本最佳，</p>
<p>推荐使用 RedHat Enterprise Linux 5或SuSE Linux Enterprise Server 10</p>
<p>软件： radvd（Router ADVertisement Daemon），<br>这是一个运行于 Linux 平台之上的提供 IPv6 路由配置信息的软件，可以替代 IPv6 路由来进行无状态的地址自动配置。</p>
<p>Apache，这是目前应用最为广泛的 Web 服务器，要求版本2.0以上</p>
<p>openssl，运行于 Linux 平台上的提供实现 SSL v2/v3 协议的加解密工具包</p>
<p><strong>2.2.3 启动 radvd</strong></p>
<p>IPv6 的地址获取方式与 IPv4 有所不同。在 IPv4 中，主机 IP 地址的自动配置必须由 DHCP 服务器来支持，这被称为有状态的自动配置（StatefulAutoconfiguration）；而在 IPv6 中，除了 DHCP 的 v6版本，还引入了无状态的自动配置（ StatelessAutoconfiguration ）。这项新技术无需 DHCP 服务器支持，所有支持 IPv6 的路由器都监听各主机发送的自动配置请求包， IPv6 路由器对这类请求包的回复里面包含了一些 IPv6 地址的前缀（ prefix ）信息，主机在收到这样的包以后，可以根据自己的一些已有信息（比如 MAC 地址），生成自己的 IPv6 地址。</p>
<p>本文是在现有的 IPv4 网络环境中模拟 IPv6 环境，自然不存在物理的 IPv6 路由器，但是通过 Linux 平台上的 radvd 工具也可以模拟无状态自动配置，它同样可以监听局域网内各 IPv6 主机发送的自动配置请求并作出响应，这样，这些主机就可以获得各自的 IPv6 地址，并利用这些地址进行相互间的通信。而图X中的客户端正是使用这种方式与代理服务器通信的。</p>
<p>这里以 SLES10 平台上的 radvd-0.9-13.2 为例来说明 radvd 的配置和启动过程。</p>
<ol type=1>
    <li>从 SLES10 的安装光盘中找到 radvd-0.9-13.2.i586.rpm 进行安装 </li>
</ol>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>           # rpm -ivh radvd-0.9-13.2.i586.rpm
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<ol type=1>
    <li>配置运行 radvd 的主机的 IPv6 地址信息
    <p># ip a a 2002:9ba:b4e:6::1/64 dev ethX</p>
    <p># ip r a 2002:9ba:b4e:6::/64 dev ethX</p>
    </li>
</ol>
<p>这里的 ethX 表示的是此主机监听局域网数据包的网卡设备</p>
<ol type=1>
    <li>radvd 安装后其配置文件位于 /etc/radvd.conf ，在这个文件中加入配置信息 </li>
</ol>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>interface ethX
            {
            AdvSendAdvert on;
            MinRtrAdvInterval 5;
            MaxRtrAdvInterval 10;
            AdvDefaultPreference low;
            prefix 2002:9ba:b4e:6::/64
            {
            AdvOnLink on;
            AdvAutonomous on;
            AdvRouterAddr off;
            };
            };
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>同上，这里的 ethX 表示的是此主机监听局域网数据包的网卡设备。prefix 段表明了该局</p>
<p>域网配置 IPv6 地址的前缀。</p>
<ol type=1>
    <li>确保系统启动了对 IPv6 数据包的转发功能
    <p># sysctl -w net.ipv6.conf.all.forwarding=1</p>
    </li>
</ol>
<ol type=1>
    <li>启动 radvd
    <p># /etc/init.d/radvd start</p>
    </li>
</ol>
<p>在 radvd 启动成功后，通过 ps 命令可以看到系统中有一个 radvd 的 daemon 进程处于运行状态。若对局域网中的其他主机运行 ifconfig 命令可以看到这些主机已经自动配置了 IPv6 地址，其前缀（ prefix ）与 radvd 配置文件中的值一致。</p>
<p><strong>2.2.4 配置 Apache 服务器</strong></p>
<p>Apache 服务器是整个模拟 IPv6 环境的核心部分，它将监听来自 IPv6 网络连接的数据包，并将其通过 IPv4 网络转发到服务器端。这里使用了 Apache 服务器的 mod_proxy 模块，相信这一模块提供的 Forward Proxy 功能已为大家所熟知，并被广泛采用。这一模块同时还提供了 Reverse Proxy 功能，本文就采用了此技术来实现转发功能。运行 Reverse Proxy 的 Apache 服务器对于客户端而言就是一台实际的 Web 服务器，客户端将从该服务器获取和上传所有的数据，具体的配置方法如下文所述。</p>
<p>大多数的 Linux 平台已经安装了 Apache 服务器，对于已经安装了 Apache 服务器的平台，必须保证其支持 IPv6，并且加载了 mod_proxy和mod_ssl 模块。当然也可以从 Apache 的源代码开始编译一个新的 Apache 服务器。</p>
<p>首先需要确定 Apache 服务器监听 IPv6 地址，一般而言，在 httpd.conf 中有如下一条：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    Listen 80
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这表明该 Apache 服务器监听所有的主机地址，自然也包括 IPv6 的地址。若原 Apache 服务器配置了监听一些特定的地址，确保这些地址中包含代理服务器与客户端通信使用的 IPv6 地址。</p>
<p>对于代理服务器的配置，这里需要使用 Apache 服务器的 mod_proxy 模块中的 ProxyPass 指示字，在 Apache 配置文件中加入如下的配置语句。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>NameVirtualHost *:80
            &lt;VirtualHost *:80&gt;
            ServerAdmin webmaster@dummy-host.example.com
            ServerName ipv6-server-proxy
            ProxyRequests off
            &lt;Proxy *&gt;
            Order deny,allow
            Allow from all
            &lt;/Proxy&gt;
            ProxyPass /request http://www.server.com/request
            ErrorLog "logs/proxypass-error_log"
            CustomLog "logs/proxypass-access_log" common
            &lt;/VirtualHost&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这里的 ProxyPass 指示语的含义是所有对此 Apache 服务器的 /request 目录的访问都将转发到 http://www.server.com/request。若此 Apache 服务器的 IPv6 地址为2002:9ba:b4e:6::3，则客户端若访问</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>http://[2002:9ba:b4e:6::3]/request
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>实际获得的数据将来自于</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>http://www.server.com/request
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这样，在客户端看来，与其通信的服务器是一个支持 IPv6 的服务器端，而实际上是 Apache 代理将远程的服务器端映射到了本地的 IPv6 网络。在这种环境下，客户端就可以来开发和测试自身对 IPv6 的支持了，而无需考虑服务器端对此协议的支持。</p>
<p>上述语句添加的位置由 Apache 的配置文件结构决定，目前许多版本的 Apache 采用多个配置文件，即由一个主的配置文件 httpd.conf 来包含其他子项配置文件，如 httpd-vhosts.conf，httpd-ssl.conf 文件等，而不是所有的配置信息全部写在 httpd.conf 文件中。这里推荐将上述配置语句写入 httpd-vhosts.conf 文件中，然后在主配置文件 httpd.conf 文件加入下面这条包含此文件。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Include httpd-vhosts.conf
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这里默认 httpd-vhosts.conf 与 httpd.conf 在同一目录下，多数情况下要加入 httpd-vhosts.conf 的相对路径。</p>
<p>对于需要使用 HTTPS 连接的应用程序，其 Apache 服务器的配置有所不同，参见下一节2.2.5中的具体介绍。</p>
<p>在配置好以后，即可启动/重启 Apache 服务器来使得刚才的配置生效。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># /etc/init.d/httpd restart
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><strong>2.2.5 利用 openssl 生成 HTTPS 连接所需的认证信息</strong></p>
<p>由于运行 Reverse Proxy 的 Apache 服务器在客户端看来是一台实际的 Web 服务器，因此在进行 HTTPS 连接时，客户端需要验证其 SSL 签名的有效性。这样，我们需要在上述配置好的 Apache 服务器中加入 SSL 认证信息，才能保证客户端的 HTTPS 应用程序能够正常运行。</p>
<p>自签名（self-signed）的 SSL 认证文件的生成</p>
<p>首先是生成根证书文件 ca.crt</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># openssl genrsa -des3 -out ca.key 4096
            # openssl req -new -x509 -days 365 -key ca.key -out ca.crt
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>第一步是生成一个根证书的 key 文件，系统会要求输入 pass phase， 记下输入的密码，这一密码会在后面多次用到。而第二步则将使用这个 key 文件来生成根证书，这一步执行时系统会要求输入许多根证书的信息，值得注意的是 Common Name（CN），这一步中输入的 CN 值应与下一步生成服务器证书时输入的不同。</p>
<p>接着需要生成服务器证书签名请求（Certificate Signing Request）文件 server.csr，步骤与生成根证书文件类似。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># openssl genrsa -des3 -out server.key 4096
            # openssl req -new -key server.key -out server.csr
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>同样，在第二步中会要求输入一系列的服务器信息，这里的 Common Name（CN） 应与客户端访问该服务器时使用的地址相同，例如：</p>
<p>客户端使用 http://proxyhost.com/ 访问该服务器时，这里的 CN 应为 proxyhost.com</p>
<p>客户端使用 http://[2002:9ba:b4e:6::3]/ 访问该服务器时，这里的 CN 应为 [2002:9ba:b4e:6::3]</p>
<p>为何需要相同，是因为客户端的 HTTPS 连接程序会验证该服务器提供的证书有效性，若证书中的 CN 与实际客户端访问的主机名不同，客户端会抛出 INVALID_CN 错误。</p>
<p>最后，利用前面生成的根证书文件 ca.crt 来签署（Sign）服务器证书签名请求 server.csr。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># openssl x509 -req -days 365 -in server.csr -CA ca.crt \
            -CAkey ca.key -set_serial 01 -out server.crt
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>将上述生成的四个证书相关文件（ca.crt，ca.key，server.crt，server.key）拷入 Apache 的配置文件夹中，接下来将会把这些文件的路径和一些配置信息加入到 Apache 配置文件中。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Listen 443
            AddType application/x-x509-ca-cert .crt
            AddType application/x-pkcs7-crl    .crl
            SSLPassPhraseDialog  builtin
            SSLSessionCache "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
            SSLSessionCacheTimeout  300
            SSLMutex  "file:logs/ssl_mutex"
            NameVirtualHost *:443
            &lt;VirtualHost *:443&gt;
            DocumentRoot "apache2/htdocs"
            ServerName ipv6-server-proxy
            ServerAdmin you@example.com
            ErrorLog "ssl-error_log"
            TransferLog "ssl-access_log"
            SSLEngine on
            SSLProtocol -all +TLSv1 +SSLv3
            SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
            SSLCertificateFile "server.crt"
            SSLCertificateKeyFile "server.key"
            &lt;Directory "/usr/local/apache2/cgi-bin"&gt;
            SSLOptions +StdEnvVars
            &lt;/Directory&gt;
            BrowserMatch ".*MSIE.*" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
            CustomLog "logs/ssl_request_log" \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
            SSLProxyEngine on
            ProxyRequests off
            &lt;Proxy *&gt;
            Order deny,allow
            Allow from all
            &lt;/Proxy&gt;
            ProxyPass /request http://www.server.com/request
            &lt;/VirtualHost&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这里再次使用了 ProxyPass 来建立代理服务。</p>
<p>正如上一节2.2.4中所述，这里建议将这些配置信息写入 httpd-ssl.conf 中，然后在 httpd.conf 中加入如下一行将其包含。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Include httpd-ssl.conf
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>配置完成后，即可启动/重启 Apache 服务器来使得刚才的配置生效。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># /etc/init.d/httpd restart
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>客户端 HTTPS 连接的考虑</p>
<p>由于这里采用的是自签名（Self-signed）的方式来生成服务器的认证文件，客户端使用 HTTPS 连接到该代理服务器时，会出现认证错误的提示。这就需要将这里生成的证书加入到客户端的可信站点列表中。具体的添加方式因采用的系统不同而各异。就 Windows 平台的 IE 而言，可以将上述生成的 ca.crt 及 server.crt 文件加入到 IE 的可信站点中，这会影响到所有利用 IE 提供的 wininet 库进行 HTTP 应用开发的程序。</p>
<p><strong>2.2.6 DNS 考虑</strong></p>
<p>在网络应用中，客户端一般使用域名来访问服务器端。在测试 IPv6 的环境中，必须使用 IPv6 的地址来访问，这就需要一个支持 IPv6 的 DNS 域名服务器，对于一定的域名返回其 IPv6 的地址。目前可以使用在 Linux 平台的 BIND 9 来搭建这样的 DNS 服务器。但是其配置相对比较复杂，还可以使用一种相对简便的方法。即利用 Linux 和 Windows 平台均支持的 hosts 文件来配对域名与其相应的 IPv6 地址。这需要在客户端的相应 hosts 文件中加入一些 IPv6 地址的配置信息。</p>
<p>在 Linux 平台上，hosts 文件一般位于 /etc/hosts，在此文件中加入如下一行：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>           2002:9ba:b4e:6::3    www.someipv6site.com
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这样就指定了 www.someipv6site.com 的 IPv6 地址为 2002:9ba:b4e:6::3。而在 Windows 平台上 hosts 文件位于 %WINDIR%\System32\drivers\etc\hosts，其格式与 Linux 平台上相同。</p>
<p><span class=smalltitle>2.3 IPv6 和 IPv4 混合环境兼容性测试</span></p>
<p>从 IPv4 到 IPv6 的过渡是一个漫长而复杂的过程，不可能在短期内实现完全转换，所以在产品的开发及测试过程中除了考虑 IPv6 网络内的通讯还需要充分考虑现实网络环境中很可能出现的 IPv6 网络和 IPv4 网络的混合环境，这就需要测试应用程序在此环境下的兼容性。 本节将介绍一些需要模拟的情况。</p>
<p>模拟以下3种网络情况首先都需要在现有的 IPv4 局域网环境中选择一台机器作为路由服务器，并按照2.2.3节的描述进行相关配置。这样与该路由连接于同一个 Switch 上的计算机都将会被自动分配一个 IPv6 的地址。如果仍然没有获得 IPv6 的地址，请关闭计算机和路由服务器上的防火墙。然后按照 2.2.4 节中的描述选择一台计算机设置为 ProxyPass。</p>
<p><strong>2.3.1客户端和服务器端均运行于 IPv6 的网络环境</strong></p>
<p>这种情况的验证相对比较简单，只需要在客户端将服务器的地址设为前面配置的 ProxyPass 的 IPv6 的地址便能实现客户端和服务器端 IPv6 到 IPv6 的交互。这就是2.2节介绍的情况。</p>
<p><strong>图 4. 客户端和服务器端均运行于 IPv6 的网络环境</strong></p>
<br><strong>图 4. 客户端和服务器端均运行于 IPv6 的网络环境</strong><br><img height=84 alt="客户端和服务器端均运行于 IPv6 的网络环境" src="http://doc.chinaunix.net/uploadfile/200912/20091217104135771.jpg" width=484> <br>
<p><strong>2.3.2 客户端运行于 IPv6 网络，服务端运行于 IPv4 网络</strong></p>
<p>对于客户端和服务器端分别处于 IPv6 和 IPv4 环境的情况，需要在局域网环境中增加代理 (proxy) 作为两者之间的桥梁，该代理与上述路由服务器位于同一个网络之中，因而也拥有 IPv6 的地址和 IPv4 的地址。客户端所设置的目的服务器端地址为 IPv4 的地址，设置的代理地址为该代理的 IPv6 的地址，这样客户通过 IPv6 协议与代理直接进行通讯，而代理接受到客户端所设置的 IPv4 格式的服务器地址后则通过 IPv4 协议与服务端交互，这样便模拟实现了客户端位于 IPv6 网络而服务器端位于 IPv4 网络的情况。</p>
<p><strong>图5客户端运行于 IPv6 网络，服务端运行于 IPv4 网络</strong></p>
<br><strong>图 5. 客户端运行于 IPv6 网络，服务端运行于 IPv4 网络</strong><br><img height=180 alt="客户端运行于 IPv6 网络，服务端运行于 IPv4 网络" src="http://doc.chinaunix.net/uploadfile/200912/20091217104136188.jpg" width=328> <br>
<p><strong>2.3.3 客户端运行于 IPv4 网络，服务端运行于 IPv6 网络</strong></p>
<p>模拟位于 IPv4 网络中的客户端与位于 IPv6 网络中的服务器端进行交互需要使用 Proxy 和 ProxyPass 来进行环境搭建。客户端将 ProxyPass 所在的 IPv6 的地址设置为服务器端的地址，将 Proxy 所在的 IPv4 的地址设置为代理的地址，这样客户端与代理之间通过 IPv4 协议进行通讯。代理在获取到客户端所配置的 IPv6 协议的 ProxyPass 地址后将通过 IPv6 协议与 ProxyPass 进行交互。ProxyPass 收到客户端发送的请求后将通过 IPv4 的协议发送给真正的位于 IPv4 网络中的服务器进行处理。这样在客户端就模拟实现了 IPv4 网络到 IPv6 网络的通讯。</p>
<p><strong>图6客户端运行于 IPv4 网络，服务端运行于 IPv6 网络</strong></p>
<table cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
    <tbody>
        <tr>
            <td width=10><img height=1 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=10></td>
            <td>
            <table cellSpacing=0 cellPadding=5 width="100%" border=1>
                <tbody>
                    <tr>
                        <td bgColor=#eeeeee>
                        <p>Server</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><strong>图 6. 利用代理将客户端映射到与服务器端同一局域网内</strong><br><img height=182 alt=利用代理将客户端映射到与服务器端同一局域网内 src="http://doc.chinaunix.net/uploadfile/200912/20091217104138891.jpg" width=530> <br><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br><img height=6 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://doc.chinaunix.net/uploadfile/200912/20091217104129230.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><span class=atitle>3 总结</span></p>
<p>在本文中，我们通过使用现有的 IPv4 网络配合 Linux 平台上的 Apache 服务器，达到了模拟 IPv6 的 HTTP/HTTPS 网络环境的目的，从而可以在有限的硬件资源之下开发和测试网络应用软件对 IPv6 的支持。这项技术还可以应用到其他的网络协议之上，只需使用具备类似于 Apache 服务器转发技术的代理服务器。因此这项技术具有一定的通用性</p>
<img src ="http://www.cppblog.com/prayer/aggbug/107670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 17:11 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX升级IPv4为IPv6的配置方法</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107669.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 09:09:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107669.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107669.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107669.html</trackback:ping><description><![CDATA[<p>环境: <br>产品: pSeries <br>平台: AIX <br>软件版本: AIX 5L</p>
<p>问题描述:本文举例介绍如何手工从IPv4升级到IPv6。所用的网络包括两个子网，每个子网中有两个节点：路由节点和另一台主机。我们将该网络中每个节点升级到IPv6。</p>
<p><br>第一步：配置主机为IPv6 </p>
<p>在两个子网上的主机中分别执行如下操作： </p>
<p>1. 使用下列命令检查IPv4已经配置： </p>
<p>netstat -ni <br>命令输出样式如下所示： <br>Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll<br>en0 1500 link#2 0.6.29.4.55.ec 279393 0 2510 0 0<br>en0 1500 9.3.230.64 9.3.230.117 279393 0 2510 0 0<br>lo0 16896 link#1 913 0 919 0 0<br>lo0 16896 127 127.0.0.1 913 0 919 0 0<br>lo0 16896 ::1 913 0 919 0 0 </p>
<p>2. 使用root权限通过下列命令设置IPv6: <br>autoconf6 <br>3. 运行下列命令： <br>netstat -ni <br>命令输出样式如下所示：<br>Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll<br>en0 1500 link#2 0.6.29.4.55.ec 279679 0 2658 0 0<br>en0 1500 9.3.230.64 9.3.230.117 279679 0 2658 0 0<br>en0 1500 fe80::206:29ff:fe04:55ec 279679 0 2658 0 0<br>sit0 1480 link#3 9.3.230.117 0 0 0 0 0<br>sit0 1480 ::9.3.230.117 0 0 0 0 0<br>lo0 16896 link#1 2343 0 2350 0 0<br>lo0 16896 127 127.0.0.1 2343 0 2350 0 0<br>lo0 16896 ::1 2343 0 2350 0 0 <br>4. 使用下列命令启动匿名进程 ndpd-host：<br>startsrc -s ndpd-host <br>此时主机即可使用IPv6。重复上述命令配置每个子网中的主机。 </p>
<p>第二步：配置路由节点为IPv6 </p>
<p>1. 使用下列命令检查IPv4已经配置： <br>netstat -ni <br>2. 使用root权限通过下列命令设置IPv6: <br>autoconf6 <br>3. 在每个路由节点上配置相应子网的IP地址，命令如下： <br># ifconfig en0 inet6 fec0:0:0:aaaa::/64 eui64 alias<br># ifconfig en1 inet6 fec0:0:0:bbbb::/64 eui64 alias <br>4. 使用下列命令激活IPv6的转发功能： <br>no -o ip6forwarding=1 <br>5. 启动ndpd-router匿名进程： <br>startsrc -s ndpd-router </p>
<p>第三步： 设置系统引导时自动配置IPv6<br>新配置的IPv6地址在系统重启时会被删除。若想使之生效，需要执行以下步骤：<br>1. 编辑文件/etc/rc.tcpip，将下列几行的注释打开： <br># Start up autoconf6 process<br>start /usr/sbin/autoconf6 "" <br># Start up ndpd-host daemon<br>start /usr/sbin/ndpd-host "$src_running" <br>在下次系统重启时，IPv6的配置信息将自动设置。 <br>第四步：在路由节点设置系统引导时自动配置IPv6 </p>
<p>新配置的IPv6地址在系统重启时会被删除。若想使之生效，需要执行以下步骤： </p>
<p>1. 编辑文件/etc/rc.tcpip，将下列几行的注释打开 </p>
<p># Start up autoconf6 process<br>start /usr/sbin/autoconf6 "" <br>2. 在其下面加入以下命令： <br># Configure site-local addresses for router<br>ifconfig en0 inet6 fec0:0:0:aaaa::/ eui64 alias<br>ifconfig en1 inet6 fec0:0:0:bbbb::/ eui64 alias <br>3. 再将下列行的注释打开：<br># Start up ndpd-router daemon<br>start /usr/sbin/ndpd-router "$src_running" <br>在下次系统重启时，IPv6将自动生效</p>
<img src ="http://www.cppblog.com/prayer/aggbug/107669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 17:09 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>端口被占用报的错误 Address already in use</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107668.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107668.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107668.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107668.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107668.html</trackback:ping><description><![CDATA[&nbsp;[Address already in use]<br>
<img src ="http://www.cppblog.com/prayer/aggbug/107668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 17:05 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>端口被占用报的错误 Address already in use</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107667.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107667.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107667.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107667.html</trackback:ping><description><![CDATA[&nbsp;[Address already in use]<br>
<img src ="http://www.cppblog.com/prayer/aggbug/107667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 17:05 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Address family not supported by protocol family.</title><link>http://www.cppblog.com/prayer/archive/2010/02/10/107664.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 10 Feb 2010 08:22:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/02/10/107664.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/107664.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/02/10/107664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/107664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/107664.html</trackback:ping><description><![CDATA[我的udp程序，运行时提示错误： &nbsp; <br>&nbsp; sendto &nbsp; error &nbsp; in &nbsp; udptalk.c! &nbsp; <br>&nbsp; Address &nbsp; <strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">family</strong> &nbsp; <strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">not</strong> &nbsp; <strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">supported</strong> &nbsp; <strong style="COLOR: black; BACKGROUND-COLOR: #ff66ff">by</strong> &nbsp; <strong style="COLOR: white; BACKGROUND-COLOR: #880000">protocol</strong> &nbsp; <strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">family</strong>. &nbsp; <br>&nbsp; 我使用的协议socket(<a name=baidusnap6></a><strong style="COLOR: white; BACKGROUND-COLOR: #00aa00">AF_INET</strong>,SOCK_DGRAM,0) &nbsp; <br>&nbsp; 请教错误原因。&nbsp;&nbsp; <br><br>I &nbsp; think &nbsp; the &nbsp; problem &nbsp; is &nbsp; the &nbsp; third &nbsp; parameter. &nbsp; It &nbsp; must &nbsp; be &nbsp; IPPROTO_UDP &nbsp; which &nbsp; is &nbsp; defined &nbsp; as &nbsp; 17 &nbsp; on &nbsp; solaris. &nbsp; 0 &nbsp; is &nbsp; defined &nbsp; as &nbsp; IPPROTO_IP &nbsp; (dummy &nbsp; for &nbsp; IP).<br><br><br><span>Hello, </span><br><br><span>I use IPV4. </span><br><br><span>I have found a workaround: </span><br><br><span>Edit C:\Windows\System32\drivers\etc\hosts and add the line "127.0.0.1 localhost" . </span><br><br><span>Regards, </span><br><br><span>Stefan <br><br><br><br><font color=#990099><em>&gt;-----BEGIN PGP SIGNED MESSAGE----- <br>&gt;Hash: SHA1 </em><br><em class=quotelev1>&gt; </em><br><em class=quotelev1>&gt;Hi there, </em><br><em class=quotelev1>&gt; </em><br><em class=quotelev1>&gt;i see the following messages in a servers log (2.1.5 on debian </em><br><em class=quotelev1>&gt;that is): </em><br><em class=quotelev1>&gt;postfix/smtp[31937]: socket to some.remote.host[]: Address family not </em><br><em class=quotelev1>&gt;supported by protocol (port 25) </em><br><em class=quotelev1>&gt; </em><br><em class=quotelev1>&gt;after that, a TLS session to some.remote.host is established and </em><br><em class=quotelev1>&gt;the mail gets delivered. The remote host has one ipv6 and one v4 </em><br><em class=quotelev1>&gt;record so i guess the error comes from the v6 record since v6 isn't </em><br><em class=quotelev1>&gt;available on the server. Its the first server where i've seen such </em><br><em class=quotelev1>&gt;a message and it doesn't seem to "break" something, but it's annoying. </em><br><em class=quotelev1>&gt;Any idea what causes this and how to disable the message? </em><br><em class=quotelev1>&gt; </em><br><em class=quotelev1>&gt; </em><br></font>lookup for some.remote.host returns an AAAA record that is tried and <br>yields the error above. disable IPv6 in your dns server. <br>if using a remote dns server, install one on the postfix box. <br><br><br><br>最终的解决方法<br>增加<br>sin.sin_family=AF_INET;</span>
<img src ="http://www.cppblog.com/prayer/aggbug/107664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-02-10 16:22 <a href="http://www.cppblog.com/prayer/archive/2010/02/10/107664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mangos系列教程（一）：官方Mangos下载</title><link>http://www.cppblog.com/prayer/archive/2010/01/11/105398.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 11 Jan 2010 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/11/105398.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/105398.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/11/105398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/105398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/105398.html</trackback:ping><description><![CDATA[一、数据库<br>1、数据库下载地址：<br><a href="http://unifieddb.svn.sourceforge.net/svnroot/unifieddb/Full_DB/ForCleanInstallOnly/"><u><font color=#765f47>http://unifieddb.svn.sourceforge.net/svnroot/unifieddb/Full_DB/ForCleanInstallOnly/</font></u></a><br>(1) 建立数据库mangos、characters、realmd(create_mysql.sql)<br>(2) 建立数据库scriptdev2(create_database_sd2.sql)<br>(3) 生成数据表realmd.sql、characters.sql<br>(4) 生成空数据表scriptdev2_structure.sql<br>(5) 生成数据表mangos<br><a href="http://unifieddb.svn.sourceforge.net/svnroot/unifieddb/Full_DB/UDB_0.9.1_Core_5057_SD2_233.rar"><u><font color=#765f47>http://unifieddb.svn.sourceforge.net/svnroot/unifieddb/Full_DB/UDB_0.9.1_Core_5057_SD2_233.rar</font></u></a><br>2、说明：依次运行上面SQL文件，最终生成mangos、characters、realmd、scriptdev2四个带有原始数据的数据库，mangos游戏世界数据库的版本是0.9.1，scriptdev2脚本数据库的版本是233，realmd是服务器和帐号数据库，characters是游戏角色数据库，5057是对应的服务端版本。日常只需备份和玩家相关的数据库：realmd和charaters数据库。经常的数据库更新补丁一般带在下载的服务端里，一般文件名带有要导入的数据库名，如果不确定请用文本打开查找要导入数据表所在的数据库。为了避免不必要的SQL语法错误，SQL文件请用utf-8格式保存。<br><br>二、服务端<br>1、Mangos官方网站：<a href="http://www.mangosproject.org/" target=_blank><u><font color=#765f47>http://www.mangosproject.org</font></u></a><br>2、下载服务端，注意对应数据库及WOW客户端版本<br>(1) 方法一：下载国外友人已经编译过的端，参考地址：<br>&#183;<a href="http://www.mangosproject.org/forum/index.php?showtopic=4088&amp;pid=147913&amp;st=20&#entry147913"><u><font color=#765f47>http://www.mangosproject.org/forum/index.php?showtopic=4088&amp;pid=147913&amp;st=20&#entry147913</font></u></a>(需要登录)<br>&#183;<a href="http://www.mangos-fae.info/download.php?list.7"><u><font color=#765f47>http://www.mangos-fae.info/download.php?list.7</font></u></a><br>&#183;<a href="http://www.mangos-files.de/index.php?show=revs"><u><font color=#765f47>http://www.mangos-files.de/index.php?show=revs</font></u></a><br>(2) 方法二：编译自己的Mangos，详细方法有空再写，参考地址：<br>&#183;mangos主程序源代码SVN更新地址：<a href="https://mangos.svn.sourceforge.net/svnroot/mangos"><u><font color=#765f47>https://mangos.svn.sourceforge.net/svnroot/mangos</font></u></a><br>&#183;mangosScript脚本开发的SVN更新地址：<a href="https://opensvn.csie.org/ScriptDev"><u><font color=#765f47>https://opensvn.csie.org/ScriptDev</font></u></a><br><br>三、Mangos本地化<br>&nbsp;<wbr><br>上面已经讲了怎样下载Mangos官方服务端和数据库，但模拟后用本国WOW客户端进入游戏除了客户端自带的是中文显示外，和服务端相关的全变成了默认语种英文，可以当做提高英语水平的方法，但面对大量的陌生怪物名还是有点别扭，那么我们就来本土化，当然涉及的程序内的文字只能改写代码重新编译了，本文暂不涉及只做简单本土化。<br>&nbsp;<wbr><br>1、下载从本国WOW客户端解出来的DBC或者使用专门工具自己解出DBC文件，复制到服务端目录即可，mangosd.conf中DBC.Locale = 255，启动服务端的时候控制台美国DBC会提示DBC.Locale=0，中国DBC会提示DBC.Locale=4；<br>2、从网上下载Mangos数据库汉化补丁汉化以下数据表相关数据：creature_template、gameobject_template、item_template、npc_text、page_text、quest_template，如果补丁完整的话恭喜你，你在游戏中看到的大部分是中文；<br>3、如果上面的补丁不完整还有一个补救方法，从其他国人的端借用几个数据表：locales_creature、locales_gameobject、locales_item、locales_npc_text、locales_page_text、locales_quest。默认的时候Locale=0，上面的表为空，表示服务端使用默认语种英语。那么怎样本土化：<br>&#183;复制已经汉化的这几个数据表覆盖原始的数据表，或导入相应的数据库SQL补丁；<br>&#183;查看表中汉化的位置，如果在Text_loc2，打开realmd的account数据表，找到你的帐号把locale字段的0改为2；<br>3、是不是上面的步骤操作完了就OK了？可能会有奇怪的问题。启动游戏前，找到你的客户端Cache目录，把WDB目录删除掉。否则在你修改数据库相应位置后显示的还是游戏缓存中的内容。<br><br>如果一切顺利，恭喜你，你已经得到完整的原版服务端和数据库并汉化成功。教程预告：Mangos相关软件的使用、TortoiseSVN的使用、Mangos项目的编译...写此系列文章主要是有感于Mangos开发者的共产主义精神，只为研究技术兴趣学习优秀的开源项目，大家交流讨论请不要谩骂，文章所涉及的资源下载后请注意查毒，网上总有居心不良的人下木马。转载请注名作者time，谢谢！<br><br>
<img src ="http://www.cppblog.com/prayer/aggbug/105398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-11 13:54 <a href="http://www.cppblog.com/prayer/archive/2010/01/11/105398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何修改telnet的端口号</title><link>http://www.cppblog.com/prayer/archive/2009/06/25/88485.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 25 Jun 2009 02:05:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/06/25/88485.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/88485.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/06/25/88485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/88485.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/88485.html</trackback:ping><description><![CDATA[1,将/etc/services中的telnet端口修改，有两处(原端口为23,假设改为26) &nbsp; <br>&nbsp; 2,/etc/init.d/xinetd &nbsp; restart &nbsp; 重启网络服务 &nbsp; <br>&nbsp; 3,telnet &nbsp; 192.168.1.1 &nbsp; 26 &nbsp; 即可进行连接
<img src ="http://www.cppblog.com/prayer/aggbug/88485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-06-25 10:05 <a href="http://www.cppblog.com/prayer/archive/2009/06/25/88485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何修改Windows、AIX等操作系统的TCP/IP参数</title><link>http://www.cppblog.com/prayer/archive/2009/06/15/87737.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 15 Jun 2009 11:16:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/06/15/87737.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/87737.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/06/15/87737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/87737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/87737.html</trackback:ping><description><![CDATA[在不同的操作系统上，修改TCP/IP参数的方法略有不同，现在对Windows 2000/NT、RISC6000/AIX、HP-UNIX、SUN Solaris以及SCO OpenServer平台下的修改方法逐一进行说明：<br><br>1）在Windows NT平台上， 我们利用regedit来修改系统注册表，修改HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三个参数： <br>KeepAliveInterval,设置其值为1000 <br>KeepAliveTime,设置其值为300000(单位为毫秒，300000代表5分钟) <br>TcpMaxDataRetransmissions,设置其值为5 <br><br>2）在RISC6000/AIX平台上， 用no命令修改如下参数: <br>tcp_keepidle保持TCP/IP连接的时间，单位为0.5秒，缺省值为14,400，即两个小时，我们可将它设为5分钟； <br>tcp_keepinittcp连接初始timeout值，单位为0.5秒，缺省值为150，我们可将它设为50； <br>tcp_keepintvl连接间隔，单位为0.5秒，缺省值为150，我们可将它设为50； <br>我们也可以修改/etc/rc.net文件， <br>/usr/sbin/no -o tcp_keepidle=240 <br>/usr/sbin/no -o tcp_keepinit=50 <br>/usr/sbin/no -o tcp_keepintvl=50 <br>注意：直接使用命令行修改，在机器重启后，会失效；修改rc.net文件，可以做到永久生效。 <br><br>3）在HP平台上， <br>对于HP-UNIX V10.20及其在此之前的版本，用/usr/contrib/bin nettune命令来修改有关参数； <br>对于HP-UNIX V10.30及其以上版本，用/usr/bin/ndd命令来修改有关参数。 <br><br>4）在SUN Solaris平台上， <br>用ndd -set /dev/tcptcp_keepalive_interval NNN命令来修改有关参数,tcp_keepalive_interval的单位为毫秒，缺省值为7200000毫秒，即2个小时。 <br><br>5）在SCO OpenServer平台上， <br>tcp_keepalive 和 tcp_keepidle 相同，其原先默认值为 7200 秒，可设为 600秒。tcp_keepintvl 其原先默认值为 75 秒，可设为15秒。均以"秒"为单位。 <br>运行命令 ifconfig 命令修改： <br>/etc/inconfig tcp_keepidle <value><br>/etc/inconfig tcp_keepintvl <value><br><br>　　通常，操作系统的TCP/IP参数的缺省设置是2个小时（常见的操作系统平台如：Windows 2000/NT以及AIX，HP-UX，Sun Solaris，Linux等，缺省设定均为2个小时），即发送KeepAlive探测包的时间是2小时，所以需要2个小时的时间它才会获知网络连接已经断开，因此当有需要的时候我们可以通过配置TCP/IP KeepAlive参数来提高TCP/IP的响应速度。<br>
<img src ="http://www.cppblog.com/prayer/aggbug/87737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-06-15 19:16 <a href="http://www.cppblog.com/prayer/archive/2009/06/15/87737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#中利用Keep-Alive处理Socket网络异常断开的方法 </title><link>http://www.cppblog.com/prayer/archive/2009/06/15/87730.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 15 Jun 2009 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/06/15/87730.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/87730.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/06/15/87730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/87730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/87730.html</trackback:ping><description><![CDATA[　最近我负责一个IM项目的开发，服务端和客户端采用TCP协议连接。服务端采用C#开发，客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得，现在写出来和大家分享一下。
<p>那网络异常断开原因主要有那些呢？归纳起来主要有以下两种：</p>
<p>1、客户端程序异常。</p>
<p>　　对于这种情况，我们很好处理，因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常（就是WinSock2中的10054异常）。只要在服务端处理这个异常就可以了。</p>
<p>2、网络链路异常。</p>
<p>　　如：网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的，我在这里贴出MSDN的原文：</p>
<p><font color=#ff0000>如果您需要确定连接的当前状态，请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035)，则该套接字仍然处于连接状态；否则，该套接字不再处于连接状态。</font></p>
<p dir=ltr style="MARGIN-RIGHT: 0px"><font color=#ff0000>　　</font>但是我在实际应用中发现，MSDN说的这种处理方法在很多时候根本无效，无法检测出网络已经异常断开了。那我们该怎么办呢？</p>
<p>　　我们知道，TCP有一个连接检测机制，就是如果在指定的时间内（一般为2个小时）没有数据传送，会给对端发送一个Keep-Alive数据报，使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号，对端如果收到这个数据，回送一个TCP的ACK，确认这个字节已经收到，这样就知道此连接没有被断开。如果一段时间没有收到对方的响应，会进行重试，重试几次后，向对端发一个reset，然后将连接断掉。</p>
<p>　　在Windows中，第一次探测是在最后一次数据发送的两个小时，然后每隔1秒探测一次，一共探测5次，如果5次都没有收到回应的话，就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。那么我们该如何做呢？我要利用Socket类的IOControl()函数。我们来看看这个函数能干些什么：</p>
<p>使用 IOControlCode 枚举指定控制代码，为 Socket 设置低级操作模式。 <br><br>命名空间:System.Net.Sockets <br>程序集:System（在 system.dll 中） <br><br>语法 <br><br>C# <br>public int IOControl ( <br>IOControlCode ioControlCode, <br>byte[] optionInValue, <br>byte[] optionOutValue <br>) <br><br><br>参数 <br>ioControlCode <br>一个 IOControlCode 值，它指定要执行的操作的控制代码。 <br><br>optionInValue <br>Byte 类型的数组，包含操作要求的输入数据。 <br><br>optionOutValue <br>Byte 类型的数组，包含由操作返回的输出数据。 <br><br>返回值 <br>optionOutValue 参数中的字节数。 </p>
<p>如：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">socket.IOControl(IOControlCode.KeepAliveValues,&nbsp;inOptionValues,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);</span></div>
</div>
<p>我们要搞清楚的就是inOptionValues的定义，在C++里它是一个结构体。我们来看看这个结构体：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tcp_keepalive&nbsp;<br><img id=_22_105_Open_Image onclick="this.style.display='none'; document.getElementById('_22_105_Open_Text').style.display='none'; document.getElementById('_22_105_Closed_Image').style.display='inline'; document.getElementById('_22_105_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_22_105_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_22_105_Closed_Text').style.display='none'; document.getElementById('_22_105_Open_Image').style.display='inline'; document.getElementById('_22_105_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_22_105_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_22_105_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;onoff;&nbsp;//是否启用Keep-Alive<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;keepalivetime;&nbsp;//多长时间后开始第一次探测（单位：毫秒）<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;keepaliveinterval;&nbsp;//探测时间间隔（单位：毫秒）<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>在C#中，我们直接用一个Byte数组传递给函数：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">&nbsp;dummy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);//是否启用Keep-Alive<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy));//多长时间开始第一次探测<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);//探测时间间隔<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>具体实现代码：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;AcceptThread()<br><img id=_50_674_Open_Image onclick="this.style.display='none'; document.getElementById('_50_674_Open_Text').style.display='none'; document.getElementById('_50_674_Closed_Image').style.display='inline'; document.getElementById('_50_674_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_50_674_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_50_674_Closed_Text').style.display='none'; document.getElementById('_50_674_Open_Image').style.display='inline'; document.getElementById('_50_674_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_50_674_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_50_674_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.CurrentThread.IsBackground&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br><img id=_143_664_Open_Image onclick="this.style.display='none'; document.getElementById('_143_664_Open_Text').style.display='none'; document.getElementById('_143_664_Closed_Image').style.display='inline'; document.getElementById('_143_664_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_143_664_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_143_664_Closed_Text').style.display='none'; document.getElementById('_143_664_Open_Image').style.display='inline'; document.getElementById('_143_664_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_143_664_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_143_664_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">&nbsp;dummy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=_562_624_Open_Image onclick="this.style.display='none'; document.getElementById('_562_624_Open_Text').style.display='none'; document.getElementById('_562_624_Closed_Image').style.display='inline'; document.getElementById('_562_624_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_562_624_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_562_624_Closed_Text').style.display='none'; document.getElementById('_562_624_Open_Image').style.display='inline'; document.getElementById('_562_624_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_562_624_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_562_624_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accept(inOptionValues);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=_648_650_Open_Image onclick="this.style.display='none'; document.getElementById('_648_650_Open_Text').style.display='none'; document.getElementById('_648_650_Closed_Image').style.display='inline'; document.getElementById('_648_650_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_648_650_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_648_650_Closed_Text').style.display='none'; document.getElementById('_648_650_Open_Image').style.display='inline'; document.getElementById('_648_650_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;</span><span id=_648_650_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_648_650_Open_Text><span style="COLOR: #000000">{&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Accept(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues)<br><img id=_743_1212_Open_Image onclick="this.style.display='none'; document.getElementById('_743_1212_Open_Text').style.display='none'; document.getElementById('_743_1212_Closed_Image').style.display='inline'; document.getElementById('_743_1212_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_743_1212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_743_1212_Closed_Text').style.display='none'; document.getElementById('_743_1212_Open_Image').style.display='inline'; document.getElementById('_743_1212_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_743_1212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_743_1212_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Public.s_socketHandler.Accept();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.IOControl(IOControlCode.KeepAliveValues,&nbsp;inOptionValues,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UserInfo();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;socket;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetUserId();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.Index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;id;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Public.s_userList.Add(id,&nbsp;info);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.BeginReceive(info.Buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;info.Buffer.Length,&nbsp;SocketFlags.None,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AsyncCallback(ReceiveCallBack),&nbsp;info);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>好了，这样就成功了。</p>
<img src ="http://www.cppblog.com/prayer/aggbug/87730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-06-15 18:48 <a href="http://www.cppblog.com/prayer/archive/2009/06/15/87730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络连接断开可以分为两种</title><link>http://www.cppblog.com/prayer/archive/2009/06/15/87729.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 15 Jun 2009 10:42:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/06/15/87729.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/87729.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/06/15/87729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/87729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/87729.html</trackback:ping><description><![CDATA[网络连接断开可以分为两种: &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 1.正常断开. &nbsp; <br>&nbsp; 这类问题可以处理. &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 2.非正常断开. &nbsp; <br>&nbsp; a. &nbsp; 客户端主机突然停电、被损坏、网线被剪断，这是一类； &nbsp; <br>&nbsp; b. &nbsp; 客户端进程被结束任务程序强行中止, &nbsp; 此时物理连接是完好的. &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 对于非正常断开, &nbsp; TCP/IP &nbsp; 协议不能检测, &nbsp; 这是 &nbsp; TCP/IP &nbsp; 的设计问题, &nbsp; 只能通过发送数据包来检测. &nbsp; <br>&nbsp; 如 &nbsp; HeartBeat &nbsp; 包. &nbsp; 只要包不能正常发送出去, &nbsp; 不管是基于上述何种原因, &nbsp; 都可以认为网络已经断开. &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 在你的程序中加入两对 &nbsp; Socket &nbsp; ,其中一对用来发送 &nbsp; HeartBeat &nbsp; 包. &nbsp; <br>&nbsp; 出错则认为网络已经断开. &nbsp; <br>&nbsp; 因为对于非正常断开, &nbsp; 两对 &nbsp; SOCKET &nbsp; 必然同时断开.
<img src ="http://www.cppblog.com/prayer/aggbug/87729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-06-15 18:42 <a href="http://www.cppblog.com/prayer/archive/2009/06/15/87729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket与拔掉网线</title><link>http://www.cppblog.com/prayer/archive/2009/06/15/87728.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 15 Jun 2009 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/06/15/87728.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/87728.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/06/15/87728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/87728.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/87728.html</trackback:ping><description><![CDATA[<font size=2>当客户端与服务端通过Tcp Socket进行通信时，如果客户端应用正常退出或异常退出，服务端都会在对应的连接上获取感知（如返回0、或抛出异常）。但是，如果客户端的网线被拔掉，那么，默认情况下，服务端需要在2个小时后才会感知客户端掉线。对于很多服务端应用程序来说，这么长的反应时间是不能忍受的。<br>&nbsp;&nbsp;&nbsp;我们通常在应用层使用&#8220;心跳机制&#8221;来解决类似的问题，这是可行的。<br>&nbsp;&nbsp;&nbsp;然而，在这里，我们可以使用Socket自己的心跳机制来解决这一问题。 System.Net.Sockets.Socket提供了IOControl（）方法给我们来设置Sokect的心跳机制的相关参数。比如，我们设置KeepAlive的时间为20秒，检查间隔为2秒。可以这样做：<br></font>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;keepAlive&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">-</span><span style="COLOR: #000000" twffan="done">1744830460</span><span style="COLOR: #000000" twffan="done">;&nbsp;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">&nbsp;SIO_KEEPALIVE_VALS</span><span style="COLOR: #008000" twffan="done"><br></span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">byte</span><span style="COLOR: #000000" twffan="done">[]&nbsp;inValue&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">new</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">byte</span><span style="COLOR: #000000" twffan="done">[]&nbsp;{&nbsp;</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0x20</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0x4e</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0xd0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0x07</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">,&nbsp;</span><span style="COLOR: #000000" twffan="done">0</span><span style="COLOR: #000000" twffan="done">&nbsp;};&nbsp;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">True,&nbsp;20&nbsp;秒,&nbsp;2&nbsp;秒</span><span style="COLOR: #008000" twffan="done"><br></span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock.IOControl(keepAlive,&nbsp;inValue,&nbsp;</span><span style="COLOR: #0000ff" twffan="done">null</span><span style="COLOR: #000000" twffan="done">);</span></div>
&nbsp;&nbsp;&nbsp;20秒（20000毫秒）的16进制表示是4e20，2秒（2000毫秒）的16进制表示是07d0，如此，你可以修改inValue参数为自己希望的值。<br>&nbsp;&nbsp;&nbsp;在上述设置下，如果拨掉客户端网线，服务器Socket.Receive()会在20秒后抛出异常。<br>
<img src ="http://www.cppblog.com/prayer/aggbug/87728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-06-15 18:40 <a href="http://www.cppblog.com/prayer/archive/2009/06/15/87728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几种千兆网卡在HA方案中的使用限制</title><link>http://www.cppblog.com/prayer/archive/2009/05/12/82678.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 12 May 2009 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/05/12/82678.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/82678.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/05/12/82678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/82678.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/82678.html</trackback:ping><description><![CDATA[<font class="font13">几种千兆网卡在HA方案中的使用限制&nbsp;<br><br>我们知道，在HA（高可用性）方案中，每台参与HA的主机应该配置至少2块相同类型的网卡。为了提高系统性能，现在很多方案中都采用了千兆以太网卡，比如：<br><br>2969----Gigabit&nbsp;Ethernet&nbsp;-&nbsp;SX&nbsp;PCI&nbsp;Adapter<br>2975----10/100/1000&nbsp;Base-T&nbsp;Ethernet&nbsp;PCI&nbsp;Adapter<br>5700----IBM&nbsp;Gigabit&nbsp;Ethernet-SX&nbsp;PCI-X&nbsp;Adapter<br>5701----IBM&nbsp;10/100/1000&nbsp;Base-TX&nbsp;Ethernet&nbsp;PCI-X&nbsp;Adapter<br><br>（1）在不同机型中的限制<br><br>一
般常见的机型都支持2969与2975，
如：7044-170，7044-270，p610，p620，p640，p630，p660，p670，p680，p690，7025-
F50，7025-F80，7026-H70，7026-H80，7026-M80，7017-S70，7017-S7A，7017-S80。但p650
与p655不支持这两种网卡。<br><br>5700与5701则只能被一些较新的机型支持，如：&nbsp;7044-170，7044-270，p610，p620，p640，p630，p650，p655，p660，p670，p680，p690。<br><br>（2）HACMP与AIX的版本限制<br>2969需要AIX4.3.2以上，及HACMP4.2.2以上的软件环境；<br>2975需要AIX4.3.3以上，及HACMP4.3.1以上的软件环境；<br>5700或5701需要AIX5.1，及HACMP4.4.1以上的软件环境。</font><img src ="http://www.cppblog.com/prayer/aggbug/82678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-05-12 14:07 <a href="http://www.cppblog.com/prayer/archive/2009/05/12/82678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SIGPIPE</title><link>http://www.cppblog.com/prayer/archive/2009/04/29/81473.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 29 Apr 2009 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/29/81473.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/81473.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/29/81473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/81473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/81473.html</trackback:ping><description><![CDATA[当一个进程向接收了RST的套接口进行写操作时， 内核给该进程发一个SIGPIPE信号。 <br>这个信号默认操作就是终止进程， 一般写程序的时候都是屏蔽掉这个信号。 <br><br><br>下面是我以前总结的一些： <br>原文：http://blog.chinaunix.net/u/6593/showart_304065.html <br><br>RST的含义为&#8220;复位&#8221;，它是TCP在某些错误情况下所发出的一种TCP分节。有三个条件可以产生RST: <br><br>1), SYN到达某端口但此端口上没有正在监听的服务器。 <br><br>2), TCP想取消一个已有连接 <br><br>3), TCP接收了一个根本不存在的连接上的分节。 <br><br><br><br>1．&nbsp; Connect 函数返回错误ECONNREFUSED: <br><br>如果对客户的SYN的响应是RST，则表明该服务器主机在我们指定的端口上没有进程在等待与之连接（例如服务器进程也许没有启动），这称为硬错（hard error），客户一接收到RST，马上就返回错误ECONNREFUSED. <br><br><br><br>TCP为监听套接口维护两个队列。两个队列之和不超过listen函数第二个参数backlog。 <br><br>当一个客户SYN到达时，若两个队列都是满的，TCP就忽略此分节，且不发送RST.这个因为：这种情况是暂时的，客户TCP将重发SYN，期望不久就能在队列中找到空闲条目。要是TCP服务器发送了一个RST，客户connect函数将立即发送一个错误，强制应用进程处理这种情况，而不是让TCP正常的重传机制来处理。还有，客户区别不了这两种情况：作为SYN的响应，意为&#8220;此端口上没有服务器&#8221;的RST和意为&#8220;有服务器在此端口上但其队列满&#8221;的RST. <br><br><br><br>Posix.1g允许以下两种处理方法：忽略新的SYN，或为此SYN响应一个RST.历史上，所有源自Berkeley的实现都是忽略新的SYN。 <br><br><br><br><br><br>2．如果杀掉服务器端处理客户端的子进程，进程退出后，关闭它打开的所有文件描述符，此时，当服务器TCP接收到来自此客户端的数据时，由于先前打开的那个套接字接口的进程已终止，所以以RST响应。 <br><br>&nbsp; &nbsp; &nbsp; 经常遇到的问题： <br><br>&nbsp; &nbsp; &nbsp; &nbsp;<strong> &nbsp; &nbsp; &nbsp; 如果不判断read , write函数的返回值，就不知道服务器是否响应了RST, 此时客户端如果向接收了RST的套接口进行写操作时，内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程，所以，进程必须捕获它以免不情愿地被终止。 <br></strong><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>进程不论是捕获了该信号并从其信号处理程序返回，还是不理会该信号，写操作都返回EPIPE错误。 <br></strong><br><br><br>3．&nbsp; 服务器主机崩溃后重启 <br><br>如果服务器主机与客户端建立连接后崩溃，如果此时，客户端向服务器发送数据，而服务器已经崩溃不能响应客户端ACK，客户TCP将持续重传数据分节，试图从服务器上接收一个ACK，如果服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达，但可能需要比较长的时间； 如果服务器在客户端发现崩溃前重启，服务器的TCP丢失了崩溃前的所有连接信息，所以服务器TCP对接收的客户数据分节以RST响应。 <br>
<img src ="http://www.cppblog.com/prayer/aggbug/81473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-29 17:52 <a href="http://www.cppblog.com/prayer/archive/2009/04/29/81473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SIGPIPE</title><link>http://www.cppblog.com/prayer/archive/2009/04/29/81472.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 29 Apr 2009 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/29/81472.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/81472.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/29/81472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/81472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/81472.html</trackback:ping><description><![CDATA[当一个进程向接收了RST的套接口进行写操作时， 内核给该进程发一个SIGPIPE信号。 <br>这个信号默认操作就是终止进程， 一般写程序的时候都是屏蔽掉这个信号。 <br><br><br>下面是我以前总结的一些： <br>原文：http://blog.chinaunix.net/u/6593/showart_304065.html <br><br>RST的含义为&#8220;复位&#8221;，它是TCP在某些错误情况下所发出的一种TCP分节。有三个条件可以产生RST: <br><br>1), SYN到达某端口但此端口上没有正在监听的服务器。 <br><br>2), TCP想取消一个已有连接 <br><br>3), TCP接收了一个根本不存在的连接上的分节。 <br><br><br><br>1．&nbsp; Connect 函数返回错误ECONNREFUSED: <br><br>如果对客户的SYN的响应是RST，则表明该服务器主机在我们指定的端口上没有进程在等待与之连接（例如服务器进程也许没有启动），这称为硬错（hard error），客户一接收到RST，马上就返回错误ECONNREFUSED. <br><br><br><br>TCP为监听套接口维护两个队列。两个队列之和不超过listen函数第二个参数backlog。 <br><br>当一个客户SYN到达时，若两个队列都是满的，TCP就忽略此分节，且不发送RST.这个因为：这种情况是暂时的，客户TCP将重发SYN，期望不久就能在队列中找到空闲条目。要是TCP服务器发送了一个RST，客户connect函数将立即发送一个错误，强制应用进程处理这种情况，而不是让TCP正常的重传机制来处理。还有，客户区别不了这两种情况：作为SYN的响应，意为&#8220;此端口上没有服务器&#8221;的RST和意为&#8220;有服务器在此端口上但其队列满&#8221;的RST. <br><br><br><br>Posix.1g允许以下两种处理方法：忽略新的SYN，或为此SYN响应一个RST.历史上，所有源自Berkeley的实现都是忽略新的SYN。 <br><br><br><br><br><br>2．如果杀掉服务器端处理客户端的子进程，进程退出后，关闭它打开的所有文件描述符，此时，当服务器TCP接收到来自此客户端的数据时，由于先前打开的那个套接字接口的进程已终止，所以以RST响应。 <br><br>&nbsp; &nbsp; &nbsp; 经常遇到的问题： <br><br>&nbsp; &nbsp; &nbsp; &nbsp;<strong> &nbsp; &nbsp; &nbsp; 如果不判断read , write函数的返回值，就不知道服务器是否响应了RST, 此时客户端如果向接收了RST的套接口进行写操作时，内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程，所以，进程必须捕获它以免不情愿地被终止。 <br></strong><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>进程不论是捕获了该信号并从其信号处理程序返回，还是不理会该信号，写操作都返回EPIPE错误。 <br></strong><br><br><br>3．&nbsp; 服务器主机崩溃后重启 <br><br>如果服务器主机与客户端建立连接后崩溃，如果此时，客户端向服务器发送数据，而服务器已经崩溃不能响应客户端ACK，客户TCP将持续重传数据分节，试图从服务器上接收一个ACK，如果服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达，但可能需要比较长的时间； 如果服务器在客户端发现崩溃前重启，服务器的TCP丢失了崩溃前的所有连接信息，所以服务器TCP对接收的客户数据分节以RST响应。 <br>
<img src ="http://www.cppblog.com/prayer/aggbug/81472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-29 17:52 <a href="http://www.cppblog.com/prayer/archive/2009/04/29/81472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于SIGPIPE导致的程序退出 </title><link>http://www.cppblog.com/prayer/archive/2009/04/29/81471.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 29 Apr 2009 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/29/81471.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/81471.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/29/81471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/81471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/81471.html</trackback:ping><description><![CDATA[<p>收集一些网上的资料，以便参考：<br><br><a href="http://blog.chinaunix.net/u2/69143/showart_1087349.html"><u><font color=#0000ff>http://blog.chinaunix.net/u2/69143/showart_1087349.html</font></u></a><br><br>&nbsp;&nbsp;&nbsp;<strong>&nbsp; 当服务器close一个连接时，若client端接着发数据。根据TCP协议的规定，会收到一个RST响应，client再往这个服务器发送数据时，系统会发出一个SIGPIPE信号给进程，告诉进程这个连接已经断开了，不要再写了。<br>&nbsp;&nbsp;&nbsp; 根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGPIPE设为SIG_IGN<br></strong><br>&nbsp;&nbsp;&nbsp; 如:&nbsp;&nbsp;&nbsp; signal(SIGPIPE,SIG_IGN);<br>&nbsp;&nbsp;&nbsp; 这时SIGPIPE交给了系统处理。<br><br>&nbsp; 服务器采用了fork的话，要收集垃圾进程，防止僵尸进程的产生，可以这样处理：<br>&nbsp; signal(SIGCHLD,SIG_IGN);　交给系统init去回收。<br></p>
<p>&nbsp;&nbsp; 这里子进程就不会产生僵尸进程了。</p>
<p>&nbsp;在linux下写socket的程序的时候，如果尝试send到一个disconnected socket上，就会让底层抛出一个SIGPIPE信号。<br>这个信号的缺省处理方法是退出进程，大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。调用以下代码，即可安全的屏蔽SIGPIPE：<br>&nbsp;&nbsp;&nbsp; struct sigaction sa;<br>&nbsp;&nbsp;&nbsp; sa.sa_handler = SIG_IGN;<br>&nbsp;&nbsp;&nbsp; sigaction( SIGPIPE, &amp;sa, 0 );<br></p>
<p>&nbsp;楼上正解. <br>signal设置的信号句柄只能起一次作用,信号被捕获一次后,信号句柄就会被还原成默认值了. <br><br>sigaction设置的信号句柄,可以一直有效,值到你再次改变它的设置. </p>
<img src ="http://www.cppblog.com/prayer/aggbug/81471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-29 17:50 <a href="http://www.cppblog.com/prayer/archive/2009/04/29/81471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SIGPIPE导致的程序退出</title><link>http://www.cppblog.com/prayer/archive/2009/04/29/81457.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 29 Apr 2009 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/29/81457.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/81457.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/29/81457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/81457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/81457.html</trackback:ping><description><![CDATA[<p><strong>当服务器close一个连接时，若client端接着发数据。根据TCP协议的规定，会收到一个RST响应，client再往这个服务器发送数据时，系统会发出一个SIGPIPE信号给进程，告诉进程这个连接已经断开了，不要再写了。<br>&nbsp;&nbsp;&nbsp; 根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGPIPE设为SIG_IGN</strong></p>
<p>&nbsp;&nbsp;&nbsp; 如:&nbsp;&nbsp;&nbsp; signal(SIGPIPE,SIG_IGN);<br>&nbsp;&nbsp;&nbsp; 这时SIGPIPE交给了系统处理。</p>
<p>服务器采用了fork的话，要收集垃圾进程，防止僵尸进程的产生，可以这样处理：<br>signal(SIGCHLD,SIG_IGN);　交给系统init去回收。<br>&nbsp;&nbsp; 这里子进程就不会产生僵尸进程了。</p>
<p><br><a href="http://www.cublog.cn/u/31357/showart_242605.html"><u><font color=#0000ff>http://www.cublog.cn/u/31357/showart_242605.html</font></u></a></p>
<p><br>好久没做过C开发了，最近重操旧业。 <br>听说另外一个项目组socket开发遇到问题，发送端和接受端数据大小不一致。建议他们采用writen的重发机制，以避免信号中断错误。采用后还是有问题。PM让我帮忙研究下。 <br>UNP n年以前看过，很久没做过底层开发，手边也没有UNP vol1这本书，所以做了个测试程序，研究下实际可能发生的情况了。 <br><br>测试环境：AS3和redhat 9(缺省没有nc) <br><br>先下载unp源码: <br>wget <a href="http://www.unpbook.com/unpv13e.tar.gz"><u><font color=#0000ff>http://www.unpbook.com/unpv13e.tar.gz</font></u></a> <br>tar xzvf *.tar.gz; <br>configure;make lib. <br>然后参考str_cli.c和tcpcli01.c，写了测试代码client.c <br><br>#include&nbsp;&nbsp;&nbsp; "unp.h"</p>
<p>#define MAXBUF 40960<br>void processSignal(int signo)<br>{<br>&nbsp;&nbsp;&nbsp; printf("Signal is %d\n", signo);<br>&nbsp;&nbsp;&nbsp; signal(signo, processSignal);<br>}<br>void<br>str_cli(FILE *fp, int sockfd)<br>{<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; sendline[MAXBUF], recvline[MAXBUF];</p>
<p>&nbsp;&nbsp;&nbsp; while (1) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sendline, 'a', sizeof(sendline));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Begin send %d data\n", MAXBUF);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writen(sockfd, sendline, sizeof(sendline));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(5);</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>int<br>main(int argc, char **argv)<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockfd;<br>&nbsp;&nbsp;&nbsp; struct sockaddr_in&nbsp;&nbsp;&nbsp; servaddr;</p>
<p>&nbsp;&nbsp;&nbsp; signal(SIGPIPE, SIG_IGN);<br>&nbsp;&nbsp;&nbsp; //signal(SIGPIPE, processSignal);</p>
<p>&nbsp;&nbsp;&nbsp; if (argc != 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err_quit("usage: tcpcli [port]");</p>
<p>&nbsp;&nbsp;&nbsp; sockfd = Socket(AF_INET, SOCK_STREAM, 0);</p>
<p>&nbsp;&nbsp;&nbsp; bzero(&amp;servaddr, sizeof(servaddr));<br>&nbsp;&nbsp;&nbsp; servaddr.sin_family = AF_INET;<br>&nbsp;&nbsp;&nbsp; servaddr.sin_port = htons(atoi(argv[1]));<br>&nbsp;&nbsp;&nbsp; Inet_pton(AF_INET, "127.0.0.1", &amp;servaddr.sin_addr);</p>
<p>&nbsp;&nbsp;&nbsp; Connect(sockfd, (SA *) &amp;servaddr, sizeof(servaddr));</p>
<p>&nbsp;&nbsp;&nbsp; str_cli(stdin, sockfd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* do it all */</p>
<p>&nbsp;&nbsp;&nbsp; exit(0);<br>}</p>
<p>&#160;</p>
<p>&#160;</p>
<p>为了方便观察错误输出，lib/writen.c也做了修改，加了些日志：</p>
<p>&#160;</p>
<p>&#160;</p>
<p>/* include writen */<br>#include&nbsp;&nbsp;&nbsp; "unp.h"</p>
<p>ssize_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;nbs
<table class=FCK__ShowTableBorders>
    <tbody>
        <tr>
            <td>
            <p><font size=+0><span>p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff9900">/* Write "n" bytes to a descriptor. */</span><br>writen<span style="COLOR: #0000cc">(</span><span style="COLOR: #0000ff">int</span> fd<span style="COLOR: #0000cc">,</span> <span style="COLOR: #0000ff">const</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #0000cc">*</span>vptr<span style="COLOR: #0000cc">,</span> <span style="COLOR: #ff0000">size_t</span> n<span style="COLOR: #0000cc">)</span><br><span style="COLOR: #0000cc">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">size_t</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nleft<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp; ssize_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwritten<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">const</span> <span style="COLOR: #0000ff">char</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">*</span>ptr<span style="COLOR: #0000cc">;</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp; ptr <span style="COLOR: #0000cc">=</span> vptr<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp; nleft <span style="COLOR: #0000cc">=</span> n<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">while</span> <span style="COLOR: #0000cc">(</span>nleft <span style="COLOR: #0000cc">&gt;</span> 0<span style="COLOR: #0000cc">)</span> <span style="COLOR: #0000cc">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">printf</span><span style="COLOR: #0000cc">(</span><span style="COLOR: #ff00ff">"Begin Writen %d\n"</span><span style="COLOR: #0000cc">,</span> nleft<span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">if</span> <span style="COLOR: #0000cc">(</span> <span style="COLOR: #0000cc">(</span>nwritten <span style="COLOR: #0000cc">=</span> <span style="COLOR: #ff0000">write</span><span style="COLOR: #0000cc">(</span>fd<span style="COLOR: #0000cc">,</span> ptr<span style="COLOR: #0000cc">,</span> nleft<span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">)</span> <span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">=</span> 0<span style="COLOR: #0000cc">)</span> <span style="COLOR: #0000cc">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">if</span> <span style="COLOR: #0000cc">(</span>nwritten <span style="COLOR: #0000cc">&lt;</span> 0 <span style="COLOR: #0000cc">&amp;</span><span style="COLOR: #0000cc">&amp;</span> <span style="COLOR: #ff0000">errno</span> <span style="COLOR: #0000cc">=</span><span style="COLOR: #0000cc">=</span> EINTR<span style="COLOR: #0000cc">)</span> <span style="COLOR: #0000cc">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">printf</span><span style="COLOR: #0000cc">(</span><span style="COLOR: #ff00ff">"intterupt\n"</span><span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nwritten <span style="COLOR: #0000cc">=</span> 0<span style="COLOR: #0000cc">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff9900">/* and call write() again */</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">else</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">return</span><span style="COLOR: #0000cc">(</span><span style="COLOR: #0000cc">-</span>1<span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff9900">/* error */</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">}</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nleft <span style="COLOR: #0000cc">-</span><span style="COLOR: #0000cc">=</span> nwritten<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr <span style="COLOR: #0000cc">+</span><span style="COLOR: #0000cc">=</span> nwritten<span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">printf</span><span style="COLOR: #0000cc">(</span><span style="COLOR: #ff00ff">"Already write %d, left %d, errno=%d\n"</span><span style="COLOR: #0000cc">,</span> nwritten<span style="COLOR: #0000cc">,</span> nleft<span style="COLOR: #0000cc">,</span> <span style="COLOR: #ff0000">errno</span><span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">return</span><span style="COLOR: #0000cc">(</span>n<span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span><br><span style="COLOR: #0000cc">}</span><br><span style="COLOR: #ff9900">/* end writen */</span><br><br><span style="COLOR: #0000ff">void</span><br>Writen<span style="COLOR: #0000cc">(</span><span style="COLOR: #0000ff">int</span> fd<span style="COLOR: #0000cc">,</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #0000cc">*</span>ptr<span style="COLOR: #0000cc">,</span> <span style="COLOR: #ff0000">size_t</span> nbytes<span style="COLOR: #0000cc">)</span><br><span style="COLOR: #0000cc">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">if</span> <span style="COLOR: #0000cc">(</span>writen<span style="COLOR: #0000cc">(</span>fd<span style="COLOR: #0000cc">,</span> ptr<span style="COLOR: #0000cc">,</span> nbytes<span style="COLOR: #0000cc">)</span> <span style="COLOR: #0000cc">!</span><span style="COLOR: #0000cc">=</span> nbytes<span style="COLOR: #0000cc">)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err_sys<span style="COLOR: #0000cc">(</span><span style="COLOR: #ff00ff">"writen error"</span><span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span><br><span style="COLOR: #0000cc">}</span><br></span></font></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&#160;</p>
<p>client.c放在tcpclieserv目录下，修改了Makefile，增加了client.c的编译目标</p>
<p>&#160;</p>
<p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><br><font face=新宋体>client<span style="COLOR: #0000cc">:</span> client<span style="COLOR: #0000cc">.</span>c<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $<span style="COLOR: #0000cc">{</span>CC<span style="COLOR: #0000cc">}</span> $<span style="COLOR: #0000cc">{</span>CFLAGS<span style="COLOR: #0000cc">}</span> <span style="COLOR: #0000cc">-</span>o $@ $<span style="COLOR: #0000cc">&lt;</span> $<span style="COLOR: #0000cc">{</span>LIBS<span style="COLOR: #0000cc">}</span><br></font></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&#160;</p>
<p>接着就可以开始测试了。</p>
<h2>测试1 忽略SIGPIPE信号，writen之前，对方关闭接受进程</h2>
<p>本机服务端：</p>
<p><br>nc -l -p 30000 <br><br>本机客户端: <br>./client 30000 <br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br><font color=#ff0000>执行到上步停止服务端,client会继续显示:</font> <br>Begin send 40960 data<br>Begin Writen 40960<br>writen error: Broken pipe(32)<br><strong>结论:可见write之前，对方socket中断，发送端write会返回-1,errno号为EPIPE(32)</strong></p>
<h2>测试2 catch SIGPIPE信号，writen之前，对方关闭接受进程</h2>
<p>修改客户端代码，catch sigpipe信号</p>
<p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><font face=新宋体><span style="COLOR: #ff9900"><font color=#000000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font>//signal(SIGPIPE, SIG_IGN);<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">signal</span><span style="COLOR: #0000cc">(</span>SIGPIPE<span style="COLOR: #0000cc">,</span> processSignal<span style="COLOR: #0000cc">)</span><span style="COLOR: #0000cc">;</span></font><br></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>本机服务端：</p>
<p><br>nc -l -p 30000 <br><br>本机客户端: <br>make client <br>./client 30000 <br><br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br>Begin send 40960 data<br>Begin Writen 40960<br>Already write 40960, left 0, errno=0<br><font color=#ff0000>执行到上步停止服务端,client会继续显示:</font> <br>Begin send 40960 data<br>Begin Writen 40960<br>Signal is 13<br>writen error: Broken pipe(32)<br><strong>结论:可见write之前，对方socket中断，发送端write时，会先调用SIGPIPE响应函数，然后write返回-1,errno号为EPIPE(32)</strong> <br></p>
<h2>测试3 writen过程中，对方关闭接受进程</h2>
<p>为了方便操作，加大1次write的数据量，修改MAXBUF为4096000</p>
<p>本机服务端：</p>
<p><br>nc -l -p 30000 <br><br>本机客户端: <br>make client <br>./client 30000 <br><br>Begin send 4096000 data<br>Begin Writen 4096000<br><font color=#ff0000>执行到上步停止服务端,client会继续显示:</font> <br>Already write 589821, left 3506179, errno=0<br>Begin Writen 3506179<br>writen error: Connection reset by peer(104)<br><br><strong>结论:可见socket write中，对方socket中断，发送端write会先返回已经发送的字节数,再次write时返回-1,errno号为ECONNRESET(104)</strong></p>
<p>为什么以上测试，都是对方已经中断socket后，发送端再次write，结果会有所不同呢。从后来找到的UNP5.12,5.13能找到答案</p>
<p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%">The client's call to readline may happen before the server's RST is received by the client, or it may happen after. If the readline happens before the RST is received, as we've shown in our example, the result is an unexpected EOF in the client. But if the RST arrives first, the result is an ECONNRESET ("Connection reset by peer") error return from readline.</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>以上解释了测试3的现象，write时，收到RST.</p>
<p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%">What happens if the client ignores the error return from readline and writes more data to the server? This can happen, for example, if the client needs to perform two writes to the server before reading anything back, with the first write eliciting the RST.</p>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%">The rule that applies is: When a process writes to a socket that has received an RST, the SIGPIPE signal is sent to the process. The default action of this signal is to terminate the process, so the process must catch the signal to avoid being involuntarily terminated.</p>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%">If the process either catches the signal and returns from the signal handler, or ignores the signal, the write operation returns EPIPE.</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>以上解释了测试1，2的现象,write一个已经接受到RST的socket，系统内核会发送SIGPIPE给发送进程，如果进程catch/ignore这个信号，write都返回EPIPE错误.</p>
<p>因此,UNP建议应用根据需要处理SIGPIPE信号，至少不要用系统缺省的处理方式处理这个信号，系统缺省的处理方式是退出进程，这样你的应用就很难查处处理进程为什么退出。</p>
<p><br><font color=#0000ff>http://blog.csdn.net/shcyd/archive/2006/10/28/1354577.aspx</font></p>
<p>在Unix系统下，如果send在等待协议传送数据时网络断开的话，调用send的进程会接收到一个SIGPIPE信号，进程对该信号的默认处理是进程终止。<br>在Unix系统下，如果recv函数在等待协议接收数据时网络断开了，那么调用recv的进程会接收到一个SIGPIPE信号，进程对该信号的默认处理是进程终止。</p>
<p>处理方法：<br>在初始化时调用<strong><font color=#333399>signal(SIGPIPE,SIG_IGN)</font></strong>忽略该信号（只需一次）<br>其时send或recv函数将返回-1，errno为EPIPE，可视情况关闭socket或其他处理</p>
<p>gdb：<br>gdb默认收到sigpipe时中断程序，可调用<strong><font color=#333399>handle SIGPIPE nostop print</font></strong></p>
<p><font color=#993300>相关</font></p>
<p><strong>(1)SIG_DFL信号专用的默认动作:</strong><br>　　(a)如果默认动作是暂停线程，则该线程的执行被暂时挂起。当线程暂停期间，发送给线程的任何附加信号都不交付，直到该线程开始执行，但是SIGKILL除外。<br>　　(b)把挂起信号的信号动作设置成SIG_DFL，且其默认动作是忽略信号 (SIGCHLD)。</p>
<p><strong>(2)SIG_IGN忽略信号</strong><br>　　(a)该信号的交付对线程没有影响<br>　　(b)系统不允许把SIGKILL或SIGTOP信号的动作设置为SIG_DFL</p>
<p><strong>(3)指向函数的指针--捕获信号</strong><br>　　(a)信号一经交付，接收线程就在指定地址上执行信号捕获程序。在信号捕 获函数返回后，接受线程必须在被中断点恢复执行。<br>　　(b)用C语言函数调用的方法进入信号捕捉程序:<br>　　　　void func (signo)<br>　　　　int signo;<br>　　　　func( )是指定的信号捕捉函数，signo是正被交付信号的编码<br>　　(c)如果SIGFPE,SIGILL或SIGSEGV信号不是由C标准定义的kill( )或raise( )函数所生成，则从信号SIGFPE,SIGILL,SIGSEGV的信号捕获函数正常返回后线程的行为是未定义的。<br>　　(d)系统不允许线程捕获SIGKILL和SIGSTOP信号。<br>　　(e)如果线程为SIGCHLD信号建立信号捕获函数，而该线程有未被等待的以终止的子线程时，没有规定是否要生成SIGCHLD信号来指明那个子线程。</p>
<p>每一种信号都被OSKit给予了一个符号名，对于32位的i386平台而言，一个字32位，因而信号有32种。下面的表给出了常用的符号名、描述和它们的信号值。</p>
<p>符号名　　信号值 描述　　　　　　　　　　　　　　　　是否符合POSIX<br>SIGHUP　　1　　　在控制终端上检测到挂断或控制线程死亡　　是<br>SIGINT　　2　　　交互注意信号　　　　　　　　　　　　　　是<br>SIGQUIT　 3　　　交互中止信号　　　　　　　　　　　　　　是<br>SIGILL　　4　　　检测到非法硬件的指令　　　　　　　　　　是<br>SIGTRAP　 5　　　从陷阱中回朔　　　　　　　　　　　　　　否<br>SIGABRT　 6　　　异常终止信号　　　　　　　　　　　　　　是<br>SIGEMT　　7　　　EMT 指令　　　　　　　　　　　　　　　　否<br>SIGFPE　　8　　　不正确的算术操作信号　　　　　　　　　　是<br>SIGKILL　 9　　　终止信号　　　　　　　　　　　　　　　　是<br>SIGBUS　　10　　 总线错误　　　　　　　　　　　　　　　　否<br>SIGSEGV　 11　　 检测到非法的内存调用　　　　　　　　　　是<br>SIGSYS　　12　　 系统call的错误参数　　　　　　　　　　　否<br>SIGPIPE　 13　　 在无读者的管道上写　　　　　　　　　　　是<br>SIGALRM　 14　　 报时信号　　　　　　　　　　　　　　　　是<br>SIGTERM　 15　　 终止信号　　　　　　　　　　　　　　　　是<br>SIGURG　　16　　 IO信道紧急信号　　　　　　　　　　　　　否<br>SIGSTOP　 17　　 暂停信号　　　　　　　　　　　　　　　　是<br>SIGTSTP　 18　　 交互暂停信号　　　　　　　　　　　　　　是<br>SIGCONT　 19　　 如果暂停则继续　　　　　　　　　　　　　是<br>SIGCHLD　 20　　 子线程终止或暂停　　　　　　　　　　　　是<br>SIGTTIN　 21　　 后台线程组一成员试图从控制终端上读出　　是<br>SIGTTOU　 22　　 后台线程组的成员试图写到控制终端上　　　是<br>SIGIO　　 23　　 允许I/O信号 　　　　　　　　　　　　　　否<br>SIGXCPU　 24　　 超出CPU时限　　　　　　　　　　　　　　 否<br>SIGXFSZ　 25　　 超出文件大小限制　　　　　　　　　　　　否<br>SIGVTALRM 26　　 虚时间警报器　　　　　　　　　　　　　　否<br>SIGPROF　 27　　 侧面时间警报器　　　　　　　　　　　　　否<br>SIGWINCH　28　　 窗口大小的更改　　　　　　　　　　　　　否<br>SIGINFO　 29　　 消息请求　　　　　　　　　　　　　　　　否<br><clk></clk>SIGUSR1 　30　　 保留作为<nobr style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">用户</nobr>自定义的信号1　　　　　　　 是<br>SIGUSR2 　31　　 保留作为用户自定义的信号　　　　　　　　是 <br><br><font color=#ff6600>注意</font>：Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始，后来在实践中暴露出一些问题，因此，把那些建立在早期机制上的信号叫做"不可靠信号"，信号值小于SIGRTMIN(Red hat 7.2中，SIGRTMIN=32，SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是：进程每次处理信号后，就将对信号的响应设置为默认动作。在某些情况下，将导致对信号的错误处理；因此，用户如果不希望这样的操作，那么就要在信号处理函数结尾再一次调用signal()，重新安装该信号。</p>
<p><br></p>
<p>&#160;</p>
<p>另外，我再做一些补充，产生RST响应以至于系统发出SIGPIPE信号，应该分为两种情况:</p>
<p>1. 客户端到服务端之间网络断掉，或者服务端断电等，物理连接断掉了，这种情况下客户端不会退出，send函数正常执行，不会感觉到自己出错。因为由于物理网络断开，服务端不会给客户端回应错误消息，没有RST响应，自然也不会产生SIGPIPE信号。但是当服务端再恢复正常的时候，对客户端send来的消息会产生RST响应，客户端就收到SIGPIPE信号了，程序退出，但是这时send函数是能够返回 -1的。可以进行异常处理。</p>
<p>2.客户端到服务端的网络能通，服务程序挂掉，客户端程序会马上退出，因为服务端能正常返回错误消息，客户端收到，SIGPIPE信号就产生了。不过我不确定此时服务端返回是的RST响应，抓包来看没有RST标志。水平有限，只写到这了。</p>
<p><br></p>
<p>文章出处：<a href="http://www.diybl.com/course/6_system/linux/Linuxjs/20081020/150832.html"><u><font color=#0000ff>http://www.diybl.com/course/6_system/linux/Linuxjs/20081020/150832.html</font></u></a></p>
<img src ="http://www.cppblog.com/prayer/aggbug/81457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-29 16:59 <a href="http://www.cppblog.com/prayer/archive/2009/04/29/81457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于网络设备的FIN_WAIT_2状态解释 </title><link>http://www.cppblog.com/prayer/archive/2009/04/29/81435.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 29 Apr 2009 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/29/81435.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/81435.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/29/81435.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/81435.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/81435.html</trackback:ping><description><![CDATA[<p>　　在HTTP应用中，存在一个问题，SERVER由于某种原因关闭连接，如KEEPALIVE的超时，这样，作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态，但TCP/IP协议栈有个问题，FIN_WAIT2状态是没有超时的（不象TIME_WAIT状态），所以如果CLIENT不关闭，这个FIN_WAIT_2状态将保持到系统重新启动，越来越多的FIN_WAIT_2状态会致使内核crash。</p>
<p>　　产生原因： <br>1。常连接并且当连接一直处于IDLE状态导致SERVER CLOSE时，CLIENT编程缺陷，没有向SERVER 发出FIN和ACK包 <br>2。APACHE1.1和APACHE1.2增加了linger_close()函数，前面的帖子有介绍，这个函数可能引起了这个问题（为什么我也不清楚） <br>　　解决办法： <br>1。对FIN_WAIT_2状态增加超时机制，这个特性在协议里没有体现，但在一些OS中已经实现 <br>如：LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等 <br>2。不要用linger_close()编译 <br>3。用SO_LINGER代替，这个在某些系统中还能很好地处理 <br>4。增加用于存储网络连接状态的内存mbuf，以防止内核crash <br>5。DISABLE KEEPALIVE</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/prayer/aggbug/81435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-29 14:30 <a href="http://www.cppblog.com/prayer/archive/2009/04/29/81435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>端口号</title><link>http://www.cppblog.com/prayer/archive/2009/04/24/80940.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 24 Apr 2009 06:37:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/24/80940.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80940.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/24/80940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80940.html</trackback:ping><description><![CDATA[<h2 class=first>
<div class=text_edit>[<a onclick="userLogin(3,0);Detect.url='http://baike.baidu.com/edit/id=642103&amp;dl=1';Detect.id=642103;return false;" href="http://baike.baidu.com/view/642103.htm#"><u>编辑本段</u></a>]</div>
<a name=1></a>端口概念</h2>
　　在网络技术中，端口（Port）大致有两种意思：一是物理意义上的端口，比如，ADSL Modem、集线器、交换机、路由器用 于连接其他网络设备的接口，如RJ-45端口、SC端口等等。二是逻辑意义上的端口，一般是指TCP/IP协议中的端口，端口号的范围从0到65535，比如用于浏览网页服务的80端口，用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
<div class=bpctrl></div>
<h2 class="">
<div class=text_edit>[<a onclick="userLogin(3,0);Detect.url='http://baike.baidu.com/edit/id=642103&amp;dl=2';Detect.id=642103;return false;" href="http://baike.baidu.com/view/642103.htm#"><u>编辑本段</u></a>]</div>
<a name=2></a>端口号</h2>
　　那么TCP/IP协议中的端口指的是什么呢？如果把IP地址比作一间房子 ，端口就是出入这间房子的门。真正的房子只有几个门，但是一个IP地址的端口 可以有<strong>65536</strong>个之多！端口是通过端口号来标记的，端口号只有整数，<strong>范围是从0 到65535</strong>。 <br>
<div class=spctrl></div>
　　端口有什么用呢？我们知道，一台拥有IP地址的主机可以提供许多服务，比如Web服务、FTP服务、SMTP服务等，这些服务完全可以通过1个IP地址来实现。那么，主机是怎样区分不同的网络服务呢？显然不能只靠IP地址，因为<strong>IP 地址与网络服务的关系是一对多的关系。实际上是通过&#8220;IP地址+端口号&#8221;来区 分不同的服务的。 <br></strong>
<div class=spctrl></div>
　　服务器一般都是通过知名端口号来识别的。例如，对于每个TCP/IP实现来说，FTP服务器的TCP端口号都是21，每个Telnet服务器的TCP端口号都是23，每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的1～1023之间的端口号。这些知名端口号由Internet号分配机构（InternetAssignedNumbersAuthority,IANA）来管理。 <br>
<div class=spctrl></div>
　　到1992年为止，知名端口号介于1～255之间。256～1023之间的端口号通常都是由Unix系统占用，以提供一些特定的Unix服务—也就是说，提供一些只有Unix系统才有的、而其他操作系统可能不提供的服务。现在IANA管理1～1023之间所有的端口号。 <br>
<div class=spctrl></div>
　　Internet扩展服务与Unix特定服务之间的一个差别就是Telnet和Rlogin。它们二者都允许通过计算机网络登录到其他主机上。Telnet是采用端口号为23的TCP/IP标准且几乎可以在所有操作系统上进行实现。相反，Rlogin最开始时只是为Unix系统设计的（尽管许多非Unix系统现在也提供该服务），因此在80年代初，它的有名端口号为513。 <br>
<div class=spctrl></div>
　　客户端通常对它所使用的端口号并不关心，只需保证该端口号在本机上是唯一的就可以了。客户端口号又称作临时端口号（即存在时间很短暂）。这是因为它通常只是在用户运行该客户程序时才存在，而服务器则只要主机开着的，其服务就运行。 <br>
<div class=spctrl></div>
　　大多数TCP/IP实现给临时端口分配1024～5000之间的端口号。大于5000的端口号是为其他服务器预留的（Internet上并不常用的服务)。我们可以在后面看见许多这样的给临时端口分 <br>
<div class=spctrl></div>
　　配端口号的例子。 <br>
<div class=spctrl></div>
　　Solaris2.2是一个很有名的例外。通常TCP和UDP的缺省临时端口号从32768开始。 <br>
<div class=spctrl></div>
　　
<h3>TCP与UDP对于端口号的使用规定</h3>
<br>
<div class=spctrl></div>
　　TCP与UDP段结构中端口地址都是16比特，可以有在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定：<br>
<div class=spctrl></div>
　　（1）端口号小于256的定义为常用端口，服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1---1023之间的端口号，是由IANA来管理的；<br>
<div class=spctrl></div>
　　（2）<strong>客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号；</strong><br>
<div class=spctrl></div>
　　（3）<strong>大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号</strong>。大于5000的端口号是为其他服务器预留的。
<div class=bpctrl></div>
<h2 class="">
<div class=text_edit>[<a onclick="userLogin(3,0);Detect.url='http://baike.baidu.com/edit/id=642103&amp;dl=3';Detect.id=642103;return false;" href="http://baike.baidu.com/view/642103.htm#"><u>编辑本段</u></a>]</div>
<a name=3></a>端口分类</h2>
　　逻辑意义上的端口有多种分类标准，下面将介绍常见的按端口号分布的分类：<br>
<div class=spctrl></div>
　　（1）知名端口（Well-Known Ports）<br>
<div class=spctrl></div>
　　知名端口即众所周知的端口号，范围从0到1023，这些端口号一般固定分配给一些服务。比如21端口分配给FTP(文件传输协议)服务，25端口分配给SMTP（简单邮件传输协议）服务，80端口分配给HTTP服务，135端口分配给RPC（远程过程调用）服务等等。<br>
<div class=spctrl></div>
　　网络服务是可以使用其他端口号的，如果不是默认的端口号则应该在 地址栏上指定端口号，方法是在地址后面加上冒号&#8220;:&#8221;（半角），再加上端口 号。比如使用&#8220;8080&#8221;作为WWW服务的端口，则需要在地址栏里输入&#8220;www.cce.com.cn:8080&#8221;。 <br>
<div class=spctrl></div>
　　但是有些系统协议使用固定的端口号，它是不能被改变的，比如139 端口专门用于NetBIOS与TCP/IP之间的通信，不能手动改变。 <br>
<div class=spctrl></div>
　　（2）动态端口（Dynamic Ports）<br>
<div class=spctrl></div>
　　动态端口的范围从1024到65535，这些端口号一般不固定分配给某个服务，也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请，那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后，就会释放所占用的端口号。<br>
<div class=spctrl></div>
　　不过，动态端口也常常被病毒木马程序所利用，如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等 。<br>
<div class=spctrl></div>
　　（3）保留端口号 <br>
<div class=spctrl></div>
　　Unix系统有保留端口号的概念。只有具有超级用户特权的进程才允许给它自己分配一个保留端口号。 <br>
<div class=spctrl></div>
　　这些端口号介于1～1023之间，一些应用程序（如有名的Rlogin，26.2节）将它作为客户与服务器之间身份认证的一部分。 <br>
<div class=spctrl></div>
　　知名端口号<br>
<div class=spctrl></div>
　　//注: 由于一些应用软件占用了部分端口, 因此此文件中的部分端口被注释掉了(注释字符为: //) <br>
<div class=spctrl></div>
　　TCP 1=TCP Port Service Multiplexer <br>
<div class=spctrl></div>
　　TCP 2=Death <br>
<div class=spctrl></div>
　　TCP 5=Remote Job Entry,yoyo <br>
<div class=spctrl></div>
　　TCP 7=Echo <br>
<div class=spctrl></div>
　　TCP 11=Skun <br>
<div class=spctrl></div>
　　TCP 12=Bomber <br>
<div class=spctrl></div>
　　TCP 16=Skun <br>
<div class=spctrl></div>
　　TCP 17=Skun <br>
<div class=spctrl></div>
　　TCP 18=消息传输协议,skun <br>
<div class=spctrl></div>
　　TCP 19=Skun <br>
<div class=spctrl></div>
　　TCP 20=FTP Data,Amanda <br>
<div class=spctrl></div>
　　TCP 21=文件传输,Back Construction,Blade Runner,Doly Trojan,Fore,FTP trojan,Invisible FTP,Larva, WebEx,WinCrash <br>
<div class=spctrl></div>
　　TCP 22=远程登录协议 <br>
<div class=spctrl></div>
　　TCP 23=远程登录(Telnet),Tiny Telnet Server (= TTS) <br>
<div class=spctrl></div>
　　TCP 25=电子邮件(SMTP),Ajan,Antigen,Email Password Sender,Happy 99,Kuang2,ProMail trojan,Shtrilitz,Stealth,Tapiras,Terminator,WinPC,WinSpy,Haebu Coceda <br>
<div class=spctrl></div>
　　TCP 27=Assasin <br>
<div class=spctrl></div>
　　TCP 28=Amanda <br>
<div class=spctrl></div>
　　TCP 29=MSG ICP <br>
<div class=spctrl></div>
　　TCP 30=Agent 40421 <br>
<div class=spctrl></div>
　　TCP 31=Agent 31,Hackers Paradise,Masters Paradise,Agent 40421 <br>
<div class=spctrl></div>
　　TCP 37=Time,ADM worm <br>
<div class=spctrl></div>
　　TCP 39=SubSARI <br>
<div class=spctrl></div>
　　TCP 41=DeepThroat,Foreplay <br>
<div class=spctrl></div>
　　TCP 42=Host Name Server <br>
<div class=spctrl></div>
　　TCP 43=WHOIS <br>
<div class=spctrl></div>
　　TCP 44=Arctic <br>
<div class=spctrl></div>
　　TCP 48=DRAT <br>
<div class=spctrl></div>
　　TCP 49=主机登录协议 <br>
<div class=spctrl></div>
　　TCP 50=DRAT <br>
<div class=spctrl></div>
　　TCP 51=IMP Logical Address Maintenance,Fuck Lamers Backdoor <br>
<div class=spctrl></div>
　　TCP 52=MuSka52,Skun <br>
<div class=spctrl></div>
　　TCP 53=DNS,Bonk (DOS Exploit) <br>
<div class=spctrl></div>
　　TCP 54=MuSka52 <br>
<div class=spctrl></div>
　　TCP 58=DMSetup <br>
<div class=spctrl></div>
　　TCP 59=DMSetup <br>
<div class=spctrl></div>
　　TCP 63=whois++ <br>
<div class=spctrl></div>
　　TCP 64=Communications Integrator <br>
<div class=spctrl></div>
　　TCP 65=TACACS-Database Service <br>
<div class=spctrl></div>
　　TCP 66=Oracle SQL*NET,AL-Bareki <br>
<div class=spctrl></div>
　　TCP 67=Bootstrap Protocol Server <br>
<div class=spctrl></div>
　　TCP 68=Bootstrap Protocol Client <br>
<div class=spctrl></div>
　　TCP 69=W32.Evala.Worm,BackGate Kit,Nimda,Pasana,Storm,Storm worm,Theef,Worm.Cycle.a <br>
<div class=spctrl></div>
　　TCP 70=Gopher服务,ADM worm <br>
<div class=spctrl></div>
　　TCP 79=用户查询(Finger),Firehotcker,ADM worm <br>
<div class=spctrl></div>
　　TCP 80=超文本服务器(Http),Executor,RingZero <br>
<div class=spctrl></div>
　　TCP 81=Chubo,Worm.Bbeagle.q <br>
<div class=spctrl></div>
　　TCP 82=Netsky-Z <br>
<div class=spctrl></div>
　　TCP 88=Kerberos krb5服务 <br>
<div class=spctrl></div>
　　TCP 99=Hidden Port <br>
<div class=spctrl></div>
　　TCP 102=消息传输代理 <br>
<div class=spctrl></div>
　　TCP 108=SNA网关访问服务器 <br>
<div class=spctrl></div>
　　TCP 109=Pop2 <br>
<div class=spctrl></div>
　　TCP 110=电子邮件(Pop3),ProMail <br>
<div class=spctrl></div>
　　TCP 113=Kazimas, Auther Idnet <br>
<div class=spctrl></div>
　　TCP 115=简单文件传输协议 <br>
<div class=spctrl></div>
　　TCP 118=SQL Services, Infector 1.4.2 <br>
<div class=spctrl></div>
　　TCP 119=新闻组传输协议(Newsgroup(Nntp)), Happy 99 <br>
<div class=spctrl></div>
　　TCP 121=JammerKiller, Bo jammerkillah <br>
<div class=spctrl></div>
　　TCP 123=网络时间协议(NTP),Net Controller <br>
<div class=spctrl></div>
　　TCP 129=Password Generator Protocol <br>
<div class=spctrl></div>
　　TCP 133=Infector 1.x <br>
<div class=spctrl></div>
　　TCP 135=微软DCE RPC end-point mapper服务 <br>
<div class=spctrl></div>
　　TCP 137=微软Netbios Name服务(网上邻居传输文件使用) <br>
<div class=spctrl></div>
　　TCP 138=微软Netbios Name服务(网上邻居传输文件使用) <br>
<div class=spctrl></div>
　　TCP 139=微软Netbios Name服务(用于文件及打印机共享) <br>
<div class=spctrl></div>
　　TCP 142=NetTaxi <br>
<div class=spctrl></div>
　　TCP 143=IMAP <br>
<div class=spctrl></div>
　　TCP 146=FC Infector,Infector <br>
<div class=spctrl></div>
　　TCP 150=NetBIOS Session Service <br>
<div class=spctrl></div>
　　TCP 156=SQL服务器 <br>
<div class=spctrl></div>
　　TCP 161=Snmp <br>
<div class=spctrl></div>
　　TCP 162=Snmp-Trap <br>
<div class=spctrl></div>
　　TCP 170=A-Trojan <br>
<div class=spctrl></div>
　　TCP 177=X Display管理控制协议 <br>
<div class=spctrl></div>
　　TCP 179=Border网关协议(BGP) <br>
<div class=spctrl></div>
　　TCP 190=网关访问控制协议(GACP) <br>
<div class=spctrl></div>
　　TCP 194=Irc <br>
<div class=spctrl></div>
　　TCP 197=目录定位服务(DLS) <br>
<div class=spctrl></div>
　　TCP 256=Nirvana <br>
<div class=spctrl></div>
　　TCP 315=The Invasor <br>
<div class=spctrl></div>
　　TCP 371=ClearCase版本管理软件 <br>
<div class=spctrl></div>
　　TCP 389=Lightweight Directory Access Protocol (LDAP) <br>
<div class=spctrl></div>
　　TCP 396=Novell Netware over IP <br>
<div class=spctrl></div>
　　TCP 420=Breach <br>
<div class=spctrl></div>
　　TCP 421=TCP Wrappers <br>
<div class=spctrl></div>
　　TCP 443=安全服务 <br>
<div class=spctrl></div>
　　TCP 444=Simple Network Paging Protocol(SNPP) <br>
<div class=spctrl></div>
　　TCP 445=Microsoft-DS <br>
<div class=spctrl></div>
　　TCP 455=Fatal Connections <br>
<div class=spctrl></div>
　　TCP 456=Hackers paradise,FuseSpark <br>
<div class=spctrl></div>
　　TCP 458=苹果公司QuickTime <br>
<div class=spctrl></div>
　　TCP 513=Grlogin <br>
<div class=spctrl></div>
　　TCP 514=RPC Backdoor <br>
<div class=spctrl></div>
　　TCP 520=Rip <br>
<div class=spctrl></div>
　　TCP 531=Rasmin,Net666 <br>
<div class=spctrl></div>
　　TCP 544=kerberos kshell <br>
<div class=spctrl></div>
　　TCP 546=DHCP Client <br>
<div class=spctrl></div>
　　TCP 547=DHCP Server <br>
<div class=spctrl></div>
　　TCP 548=Macintosh文件服务 <br>
<div class=spctrl></div>
　　TCP 555=Ini-Killer,Phase Zero,Stealth Spy <br>
<div class=spctrl></div>
　　TCP 569=MSN <br>
<div class=spctrl></div>
　　TCP 605=SecretService <br>
<div class=spctrl></div>
　　TCP 606=Noknok8 <br>
<div class=spctrl></div>
　　TCP 660=DeepThroat <br>
<div class=spctrl></div>
　　TCP 661=Noknok8 <br>
<div class=spctrl></div>
　　TCP 666=Attack FTP,Satanz Backdoor,Back Construction,Dark Connection Inside 1.2 <br>
<div class=spctrl></div>
　　TCP 667=Noknok7.2 <br>
<div class=spctrl></div>
　　TCP 668=Noknok6 <br>
<div class=spctrl></div>
　　TCP 669=DP trojan <br>
<div class=spctrl></div>
　　TCP 692=GayOL <br>
<div class=spctrl></div>
　　TCP 707=Welchia,nachi <br>
<div class=spctrl></div>
　　TCP 777=AIM Spy <br>
<div class=spctrl></div>
　　TCP 808=RemoteControl,WinHole <br>
<div class=spctrl></div>
　　TCP 815=Everyone Darling <br>
<div class=spctrl></div>
　　TCP 901=Backdoor.Devil <br>
<div class=spctrl></div>
　　TCP 911=Dark Shadow <br>
<div class=spctrl></div>
　　TCP 993=IMAP <br>
<div class=spctrl></div>
　　TCP 999=DeepThroat <br>
<div class=spctrl></div>
　　TCP 1000=Der Spaeher <br>
<div class=spctrl></div>
　　TCP 1001=Silencer,WebEx,Der Spaeher <br>
<div class=spctrl></div>
　　TCP 1003=BackDoor <br>
<div class=spctrl></div>
　　TCP 1010=Doly <br>
<div class=spctrl></div>
　　TCP 1011=Doly <br>
<div class=spctrl></div>
　　TCP 1012=Doly <br>
<div class=spctrl></div>
　　TCP 1015=Doly <br>
<div class=spctrl></div>
　　TCP 1016=Doly <br>
<div class=spctrl></div>
　　TCP 1020=Vampire <br>
<div class=spctrl></div>
　　TCP 1023=Worm.Sasser.e <br>
<div class=spctrl></div>
　　TCP 1024=NetSpy.698(YAI) <br>
<div class=spctrl></div>
　　TCP 1059=nimreg <br>
<div class=spctrl></div>
　　//TCP 1025=NetSpy.698,Unused Windows Services Block <br>
<div class=spctrl></div>
　　//TCP 1026=Unused Windows Services Block <br>
<div class=spctrl></div>
　　//TCP 1027=Unused Windows Services Block <br>
<div class=spctrl></div>
　　TCP 1028=应用层网关服务 <br>
<div class=spctrl></div>
　　//TCP 1029=Unused Windows Services Block <br>
<div class=spctrl></div>
　　//TCP 1030=Unused Windows Services Block <br>
<div class=spctrl></div>
　　//TCP 1033=Netspy <br>
<div class=spctrl></div>
　　//TCP 1035=Multidropper <br>
<div class=spctrl></div>
　　//TCP 1042=Bla <br>
<div class=spctrl></div>
　　//TCP 1045=Rasmin <br>
<div class=spctrl></div>
　　//TCP 1047=GateCrasher <br>
<div class=spctrl></div>
　　//TCP 1050=MiniCommand <br>
<div class=spctrl></div>
　　TCP 1058=nim <br>
<div class=spctrl></div>
　　TCP 1069=Backdoor.TheefServer.202 <br>
<div class=spctrl></div>
　　TCP 1070=Voice,Psyber Stream Server,Streaming Audio Trojan <br>
<div class=spctrl></div>
　　TCP 1079=ASPROVATalk <br>
<div class=spctrl></div>
　　TCP 1080=Wingate,Worm.BugBear.B,Worm.Novarg.B <br>
<div class=spctrl></div>
　　//TCP 1090=Xtreme, VDOLive <br>
<div class=spctrl></div>
　　//TCP 1092=LoveGate <br>
<div class=spctrl></div>
　　//TCP 1095=Rat <br>
<div class=spctrl></div>
　　//TCP 1097=Rat <br>
<div class=spctrl></div>
　　//TCP 1098=Rat <br>
<div class=spctrl></div>
　　//TCP 1099=Rat <br>
<div class=spctrl></div>
　　TCP 1109=Pop with Kerberos <br>
<div class=spctrl></div>
　　TCP 1110=nfsd-keepalive <br>
<div class=spctrl></div>
　　TCP 1111=Backdoor.AIMVision <br>
<div class=spctrl></div>
　　TCP 1155=Network File Access <br>
<div class=spctrl></div>
　　//TCP 1170=Psyber Stream Server,Streaming Audio trojan,Voice <br>
<div class=spctrl></div>
　　//TCP 1200=NoBackO <br>
<div class=spctrl></div>
　　//TCP 1201=NoBackO <br>
<div class=spctrl></div>
　　//TCP 1207=Softwar <br>
<div class=spctrl></div>
　　//TCP 1212=Nirvana,Visul Killer <br>
<div class=spctrl></div>
　　//TCP 1234=Ultors <br>
<div class=spctrl></div>
　　//TCP 1243=BackDoor-G, SubSeven, SubSeven Apocalypse <br>
<div class=spctrl></div>
　　//TCP 1245=VooDoo Doll <br>
<div class=spctrl></div>
　　//TCP 1269=Mavericks Matrix <br>
<div class=spctrl></div>
　　TCP 1270=Microsoft Operations Manager <br>
<div class=spctrl></div>
　　//TCP 1313=Nirvana <br>
<div class=spctrl></div>
　　//TCP 1349=BioNet <br>
<div class=spctrl></div>
　　TCP 1352=Lotus Notes <br>
<div class=spctrl></div>
　　TCP 1433=Microsoft SQL Server <br>
<div class=spctrl></div>
　　TCP 1434=Microsoft SQL Monitor <br>
<div class=spctrl></div>
　　//TCP 1441=Remote Storm <br>
<div class=spctrl></div>
　　//TCP 1492=FTP99CMP(BackOriffice.FTP) <br>
<div class=spctrl></div>
　　TCP 1503=NetMeeting T.120 <br>
<div class=spctrl></div>
　　TCP 1512=Microsoft Windows Internet Name Service <br>
<div class=spctrl></div>
　　//TCP 1509=Psyber Streaming Server <br>
<div class=spctrl></div>
　　TCP 1570=Orbix Daemon <br>
<div class=spctrl></div>
　　//TCP 1600=Shivka-Burka <br>
<div class=spctrl></div>
　　//TCP 1703=Exloiter 1.1 <br>
<div class=spctrl></div>
　　TCP 1720=NetMeeting H.233 call Setup <br>
<div class=spctrl></div>
　　TCP 1731=NetMeeting音频调用控制 <br>
<div class=spctrl></div>
　　TCP 1745=ISA Server proxy autoconfig, Remote Winsock <br>
<div class=spctrl></div>
　　TCP 1801=Microsoft Message Queue <br>
<div class=spctrl></div>
　　//TCP 1807=SpySender <br>
<div class=spctrl></div>
　　TCP 1906=Backdoor/Verify.b <br>
<div class=spctrl></div>
　　TCP 1907=Backdoor/Verify.b <br>
<div class=spctrl></div>
　　//TCP 1966=Fake FTP 2000 <br>
<div class=spctrl></div>
　　//TCP 1976=Custom port <br>
<div class=spctrl></div>
　　//TCP 1981=Shockrave <br>
<div class=spctrl></div>
　　TCP 1990=stun-p1 cisco STUN Priority 1 port <br>
<div class=spctrl></div>
　　TCP 1990=stun-p1 cisco STUN Priority 1 port <br>
<div class=spctrl></div>
　　TCP 1991=stun-p2 cisco STUN Priority 2 port <br>
<div class=spctrl></div>
　　TCP 1992=stun-p3 cisco STUN Priority 3 port,ipsendmsg IPsendmsg <br>
<div class=spctrl></div>
　　TCP 1993=snmp-tcp-port cisco SNMP TCP port <br>
<div class=spctrl></div>
　　TCP 1994=stun-port cisco serial tunnel port <br>
<div class=spctrl></div>
　　TCP 1995=perf-port cisco perf port <br>
<div class=spctrl></div>
　　TCP 1996=tr-rsrb-port cisco Remote SRB port <br>
<div class=spctrl></div>
　　TCP 1997=gdp-port cisco Gateway Discovery Protocol <br>
<div class=spctrl></div>
　　TCP 1998=x25-svc-port cisco X.25 service (XOT) <br>
<div class=spctrl></div>
　　//TCP 1999=BackDoor, TransScout <br>
<div class=spctrl></div>
　　//TCP 2000=Der Spaeher,INsane Network <br>
<div class=spctrl></div>
　　TCP 2002=W32.Beagle.AX @mm <br>
<div class=spctrl></div>
　　//TCP 2001=Transmisson scout <br>
<div class=spctrl></div>
　　//TCP 2002=Transmisson scout <br>
<div class=spctrl></div>
　　//TCP 2003=Transmisson scout <br>
<div class=spctrl></div>
　　//TCP 2004=Transmisson scout <br>
<div class=spctrl></div>
　　//TCP 2005=TTransmisson scout <br>
<div class=spctrl></div>
　　TCP 2011=cypress <br>
<div class=spctrl></div>
　　TCP 2015=raid-cs <br>
<div class=spctrl></div>
　　//TCP 2023=Ripper,Pass Ripper,Hack City Ripper Pro <br>
<div class=spctrl></div>
　　TCP 2049=NFS <br>
<div class=spctrl></div>
　　//TCP 2115=Bugs <br>
<div class=spctrl></div>
　　//TCP 2121=Nirvana <br>
<div class=spctrl></div>
　　//TCP 2140=Deep Throat, The Invasor <br>
<div class=spctrl></div>
　　//TCP 2155=Nirvana <br>
<div class=spctrl></div>
　　//TCP 2208=RuX <br>
<div class=spctrl></div>
　　TCP 2234=DirectPlay <br>
<div class=spctrl></div>
　　//TCP 2255=Illusion Mailer <br>
<div class=spctrl></div>
　　//TCP 2283=HVL Rat5 <br>
<div class=spctrl></div>
　　//TCP 2300=PC Explorer <br>
<div class=spctrl></div>
　　//TCP 2311=Studio54 <br>
<div class=spctrl></div>
　　TCP 2556=Worm.Bbeagle.q <br>
<div class=spctrl></div>
　　//TCP 2565=Striker <br>
<div class=spctrl></div>
　　//TCP 2583=WinCrash <br>
<div class=spctrl></div>
　　//TCP 2600=Digital RootBeer <br>
<div class=spctrl></div>
　　//TCP 2716=Prayer Trojan <br>
<div class=spctrl></div>
　　TCP 2745=Worm.BBeagle.k <br>
<div class=spctrl></div>
　　//TCP 2773=Backdoor,SubSeven <br>
<div class=spctrl></div>
　　//TCP 2774=SubSeven2.1&amp;2.2 <br>
<div class=spctrl></div>
　　//TCP 2801=Phineas Phucker <br>
<div class=spctrl></div>
　　TCP 2967=SSC Agent <br>
<div class=spctrl></div>
　　//TCP 2989=Rat <br>
<div class=spctrl></div>
　　//TCP 3024=WinCrash trojan <br>
<div class=spctrl></div>
　　TCP 3074=Microsoft Xbox game port <br>
<div class=spctrl></div>
　　TCP 3127=Worm.Novarg <br>
<div class=spctrl></div>
　　TCP 3128=RingZero,Worm.Novarg.B <br>
<div class=spctrl></div>
　　//TCP 3129=Masters Paradise <br>
<div class=spctrl></div>
　　TCP 3132=Microsoft Business Rule Engine Update Service <br>
<div class=spctrl></div>
　　//TCP 3150=Deep Throat, The Invasor <br>
<div class=spctrl></div>
　　TCP 3198=Worm.Novarg <br>
<div class=spctrl></div>
　　//TCP 3210=SchoolBus <br>
<div class=spctrl></div>
　　TCP 3268=Microsoft Global Catalog <br>
<div class=spctrl></div>
　　TCP 3269=Microsoft Global Catalog with LDAP/SSL <br>
<div class=spctrl></div>
　　TCP 3332=Worm.Cycle.a <br>
<div class=spctrl></div>
　　TCP 3333=Prosiak <br>
<div class=spctrl></div>
　　TCP 3535=Microsoft Class Server <br>
<div class=spctrl></div>
　　TCP 3389=超级终端 <br>
<div class=spctrl></div>
　　//TCP 3456=Terror <br>
<div class=spctrl></div>
　　//TCP 3459=Eclipse 2000 <br>
<div class=spctrl></div>
　　//TCP 3700=Portal of Doom <br>
<div class=spctrl></div>
　　//TCP 3791=Eclypse <br>
<div class=spctrl></div>
　　//TCP 3801=Eclypse <br>
<div class=spctrl></div>
　　TCP 3847=Microsoft Firewall Control <br>
<div class=spctrl></div>
　　TCP 3996=Portal of Doom,RemoteAnything <br>
<div class=spctrl></div>
　　TCP 4000=腾讯QQ客户端 <br>
<div class=spctrl></div>
　　TCP 4060=Portal of Doom,RemoteAnything <br>
<div class=spctrl></div>
　　TCP 4092=WinCrash <br>
<div class=spctrl></div>
　　TCP 4242=VHM <br>
<div class=spctrl></div>
　　TCP 4267=SubSeven2.1&amp;2.2 <br>
<div class=spctrl></div>
　　TCP 4321=BoBo <br>
<div class=spctrl></div>
　　TCP 4350=Net Device <br>
<div class=spctrl></div>
　　TCP 4444=Prosiak,Swift remote <br>
<div class=spctrl></div>
　　TCP 4500=Microsoft IPsec NAT-T, W32.HLLW.Tufas <br>
<div class=spctrl></div>
　　TCP 4567=File Nail <br>
<div class=spctrl></div>
　　TCP 4661=Backdoor/Surila.f <br>
<div class=spctrl></div>
　　TCP 4590=ICQTrojan <br>
<div class=spctrl></div>
　　TCP 4899=Remote Administrator服务器 <br>
<div class=spctrl></div>
　　TCP 4950=ICQTrojan <br>
<div class=spctrl></div>
　　TCP 5000=WindowsXP服务器,Blazer 5,Bubbel,Back Door Setup,Sockets de Troie <br>
<div class=spctrl></div>
　　TCP 5001=Back Door Setup, Sockets de Troie <br>
<div class=spctrl></div>
　　TCP 5002=cd00r,Shaft <br>
<div class=spctrl></div>
　　TCP 5011=One of the Last Trojans (OOTLT) <br>
<div class=spctrl></div>
　　TCP 5025=WM Remote KeyLogger <br>
<div class=spctrl></div>
　　TCP 5031=Firehotcker,Metropolitan,NetMetro <br>
<div class=spctrl></div>
　　TCP 5032=Metropolitan <br>
<div class=spctrl></div>
　　TCP 5190=ICQ Query <br>
<div class=spctrl></div>
　　TCP 5321=Firehotcker <br>
<div class=spctrl></div>
　　TCP 5333=Backage Trojan Box 3 <br>
<div class=spctrl></div>
　　TCP 5343=WCrat <br>
<div class=spctrl></div>
　　TCP 5400=Blade Runner, BackConstruction1.2 <br>
<div class=spctrl></div>
　　TCP 5401=Blade Runner,Back Construction <br>
<div class=spctrl></div>
　　TCP 5402=Blade Runner,Back Construction <br>
<div class=spctrl></div>
　　TCP 5471=WinCrash <br>
<div class=spctrl></div>
　　TCP 5512=Illusion Mailer <br>
<div class=spctrl></div>
　　TCP 5521=Illusion Mailer <br>
<div class=spctrl></div>
　　TCP 5550=Xtcp,INsane Network <br>
<div class=spctrl></div>
　　TCP 5554=Worm.Sasser <br>
<div class=spctrl></div>
　　TCP 5555=ServeMe <br>
<div class=spctrl></div>
　　TCP 5556=BO Facil <br>
<div class=spctrl></div>
　　TCP 5557=BO Facil <br>
<div class=spctrl></div>
　　TCP 5569=Robo-Hack <br>
<div class=spctrl></div>
　　TCP 5598=BackDoor 2.03 <br>
<div class=spctrl></div>
　　TCP 5631=PCAnyWhere data <br>
<div class=spctrl></div>
　　TCP 5632=PCAnyWhere <br>
<div class=spctrl></div>
　　TCP 5637=PC Crasher <br>
<div class=spctrl></div>
　　TCP 5638=PC Crasher <br>
<div class=spctrl></div>
　　TCP 5678=Remote Replication Agent Connection <br>
<div class=spctrl></div>
　　TCP 5679=Direct Cable Connect Manager <br>
<div class=spctrl></div>
　　TCP 5698=BackDoor <br>
<div class=spctrl></div>
　　TCP 5714=Wincrash3 <br>
<div class=spctrl></div>
　　TCP 5720=Microsoft Licensing <br>
<div class=spctrl></div>
　　TCP 5741=WinCrash3 <br>
<div class=spctrl></div>
　　TCP 5742=WinCrash <br>
<div class=spctrl></div>
　　TCP 5760=Portmap Remote Root Linux Exploit <br>
<div class=spctrl></div>
　　TCP 5880=Y3K RAT <br>
<div class=spctrl></div>
　　TCP 5881=Y3K RAT <br>
<div class=spctrl></div>
　　TCP 5882=Y3K RAT <br>
<div class=spctrl></div>
　　TCP 5888=Y3K RAT <br>
<div class=spctrl></div>
　　TCP 5889=Y3K RAT <br>
<div class=spctrl></div>
　　TCP 5900=WinVnc <br>
<div class=spctrl></div>
　　TCP 6000=Backdoor.AB <br>
<div class=spctrl></div>
　　TCP 6006=Noknok8 <br>
<div class=spctrl></div>
　　TCP 6073=DirectPlay8 <br>
<div class=spctrl></div>
　　TCP 6129=Dameware Nt Utilities服务器 <br>
<div class=spctrl></div>
　　TCP 6272=SecretService <br>
<div class=spctrl></div>
　　TCP 6267=广外女生 <br>
<div class=spctrl></div>
　　TCP 6400=Backdoor.AB,The Thing <br>
<div class=spctrl></div>
　　TCP 6500=Devil 1.03 <br>
<div class=spctrl></div>
　　TCP 6661=Teman <br>
<div class=spctrl></div>
　　TCP 6666=TCPshell.c <br>
<div class=spctrl></div>
　　TCP 6667=NT Remote Control,Wise 播放器接收端口 <br>
<div class=spctrl></div>
　　TCP 6668=Wise Video广播端口 <br>
<div class=spctrl></div>
　　TCP 6669=Vampyre <br>
<div class=spctrl></div>
　　TCP 6670=DeepThroat,iPhone <br>
<div class=spctrl></div>
　　TCP 6671=Deep Throat 3.0 <br>
<div class=spctrl></div>
　　TCP 6711=SubSeven <br>
<div class=spctrl></div>
　　TCP 6712=SubSeven1.x <br>
<div class=spctrl></div>
　　TCP 6713=SubSeven <br>
<div class=spctrl></div>
　　TCP 6723=Mstream <br>
<div class=spctrl></div>
　　TCP 6767=NT Remote Control <br>
<div class=spctrl></div>
　　TCP 6771=DeepThroat <br>
<div class=spctrl></div>
　　TCP 6776=BackDoor-G,SubSeven,2000 Cracks <br>
<div class=spctrl></div>
　　TCP 6777=Worm.BBeagle <br>
<div class=spctrl></div>
　　TCP 6789=Doly Trojan <br>
<div class=spctrl></div>
　　TCP 6838=Mstream <br>
<div class=spctrl></div>
　　TCP 6883=DeltaSource <br>
<div class=spctrl></div>
　　TCP 6912=Shit Heep <br>
<div class=spctrl></div>
　　TCP 6939=Indoctrination <br>
<div class=spctrl></div>
　　TCP 6969=GateCrasher, Priority, IRC 3 <br>
<div class=spctrl></div>
　　TCP 6970=RealAudio,GateCrasher <br>
<div class=spctrl></div>
　　TCP 7000=Remote Grab,NetMonitor,SubSeven1.x <br>
<div class=spctrl></div>
　　TCP 7001=Freak88 <br>
<div class=spctrl></div>
　　TCP 7201=NetMonitor <br>
<div class=spctrl></div>
　　TCP 7215=BackDoor-G, SubSeven <br>
<div class=spctrl></div>
　　TCP 7001=Freak88,Freak2k <br>
<div class=spctrl></div>
　　TCP 7300=NetMonitor <br>
<div class=spctrl></div>
　　TCP 7301=NetMonitor <br>
<div class=spctrl></div>
　　TCP 7306=NetMonitor,NetSpy 1.0 <br>
<div class=spctrl></div>
　　TCP 7307=NetMonitor, ProcSpy <br>
<div class=spctrl></div>
　　TCP 7308=NetMonitor, X Spy <br>
<div class=spctrl></div>
　　TCP 7323=Sygate服务器端 <br>
<div class=spctrl></div>
　　TCP 7424=Host Control <br>
<div class=spctrl></div>
　　TCP 7511=聪明基因 <br>
<div class=spctrl></div>
　　TCP 7597=Qaz <br>
<div class=spctrl></div>
　　TCP 7609=Snid X2 <br>
<div class=spctrl></div>
　　TCP 7626=冰河 <br>
<div class=spctrl></div>
　　TCP 7777=The Thing <br>
<div class=spctrl></div>
　　TCP 7789=Back Door Setup, ICQKiller <br>
<div class=spctrl></div>
　　TCP 7983=Mstream <br>
<div class=spctrl></div>
　　TCP 8000=腾讯OICQ服务器端,XDMA <br>
<div class=spctrl></div>
　　TCP 8010=Wingate,Logfile <br>
<div class=spctrl></div>
　　TCP 8011=WAY2.4 <br>
<div class=spctrl></div>
　　TCP 8080=WWW 代理,Ring Zero,Chubo,Worm.Novarg.B <br>
<div class=spctrl></div>
　　TCP 8102=网络神偷 <br>
<div class=spctrl></div>
　　TCP 8181=W32.Erkez.D@mm <br>
<div class=spctrl></div>
　　TCP 8520=W32.Socay.Worm <br>
<div class=spctrl></div>
　　TCP 8594=I-Worm/Bozori.a <br>
<div class=spctrl></div>
　　TCP 8787=BackOfrice 2000 <br>
<div class=spctrl></div>
　　TCP 8888=Winvnc <br>
<div class=spctrl></div>
　　TCP 8897=Hack Office,Armageddon <br>
<div class=spctrl></div>
　　TCP 8989=Recon <br>
<div class=spctrl></div>
　　TCP 9000=Netministrator <br>
<div class=spctrl></div>
　　TCP 9325=Mstream <br>
<div class=spctrl></div>
　　TCP 9400=InCommand 1.0 <br>
<div class=spctrl></div>
　　TCP 9401=InCommand 1.0 <br>
<div class=spctrl></div>
　　TCP 9402=InCommand 1.0 <br>
<div class=spctrl></div>
　　TCP 9535=Remote Man Server <br>
<div class=spctrl></div>
　　TCP 9872=Portal of Doom <br>
<div class=spctrl></div>
　　TCP 9873=Portal of Doom <br>
<div class=spctrl></div>
　　TCP 9874=Portal of Doom <br>
<div class=spctrl></div>
　　TCP 9875=Portal of Doom <br>
<div class=spctrl></div>
　　TCP 9876=Cyber Attacker <br>
<div class=spctrl></div>
　　TCP 9878=TransScout <br>
<div class=spctrl></div>
　　TCP 9989=Ini-Killer <br>
<div class=spctrl></div>
　　TCP 9898=Worm.Win32.Dabber.a <br>
<div class=spctrl></div>
　　TCP 9999=Prayer Trojan <br>
<div class=spctrl></div>
　　TCP 10067=Portal of Doom <br>
<div class=spctrl></div>
　　TCP 10080=Worm.Novarg.B <br>
<div class=spctrl></div>
　　TCP 10084=Syphillis <br>
<div class=spctrl></div>
　　TCP 10085=Syphillis <br>
<div class=spctrl></div>
　　TCP 10086=Syphillis <br>
<div class=spctrl></div>
　　TCP 10101=BrainSpy <br>
<div class=spctrl></div>
　　TCP 10167=Portal Of Doom <br>
<div class=spctrl></div>
　　TCP 10168=Worm.Supnot.78858.c,Worm.LovGate.T <br>
<div class=spctrl></div>
　　TCP 10520=Acid Shivers <br>
<div class=spctrl></div>
　　TCP 10607=Coma trojan <br>
<div class=spctrl></div>
　　TCP 10666=Ambush <br>
<div class=spctrl></div>
　　TCP 11000=Senna Spy <br>
<div class=spctrl></div>
　　TCP 11050=Host Control <br>
<div class=spctrl></div>
　　TCP 11051=Host Control <br>
<div class=spctrl></div>
　　TCP 11223=Progenic,Hack '99KeyLogger <br>
<div class=spctrl></div>
　　TCP 11320=IMIP Channels Port <br>
<div class=spctrl></div>
　　TCP 11831=TROJ_LATINUS.SVR <br>
<div class=spctrl></div>
　　TCP 12076=Gjamer, MSH.104b <br>
<div class=spctrl></div>
　　TCP 12223=Hack'99 KeyLogger <br>
<div class=spctrl></div>
　　TCP 12345=GabanBus, NetBus 1.6/1.7, Pie Bill Gates, X-bill <br>
<div class=spctrl></div>
　　TCP 12346=GabanBus, NetBus 1.6/1.7, X-bill <br>
<div class=spctrl></div>
　　TCP 12349=BioNet <br>
<div class=spctrl></div>
　　TCP 12361=Whack-a-mole <br>
<div class=spctrl></div>
　　TCP 12362=Whack-a-mole <br>
<div class=spctrl></div>
　　TCP 12363=Whack-a-mole <br>
<div class=spctrl></div>
　　TCP 12378=W32/Gibe@MM <br>
<div class=spctrl></div>
　　TCP 12456=NetBus <br>
<div class=spctrl></div>
　　TCP 12623=DUN Control <br>
<div class=spctrl></div>
　　TCP 12624=Buttman <br>
<div class=spctrl></div>
　　TCP 12631=WhackJob, WhackJob.NB1.7 <br>
<div class=spctrl></div>
　　TCP 12701=Eclipse2000 <br>
<div class=spctrl></div>
　　TCP 12754=Mstream <br>
<div class=spctrl></div>
　　TCP 13000=Senna Spy <br>
<div class=spctrl></div>
　　TCP 13010=Hacker Brazil <br>
<div class=spctrl></div>
　　TCP 13013=Psychward <br>
<div class=spctrl></div>
　　TCP 13223=Tribal Voice的聊天程序PowWow <br>
<div class=spctrl></div>
　　TCP 13700=Kuang2 The Virus <br>
<div class=spctrl></div>
　　TCP 14456=Solero <br>
<div class=spctrl></div>
　　TCP 14500=PC Invader <br>
<div class=spctrl></div>
　　TCP 14501=PC Invader <br>
<div class=spctrl></div>
　　TCP 14502=PC Invader <br>
<div class=spctrl></div>
　　TCP 14503=PC Invader <br>
<div class=spctrl></div>
　　TCP 15000=NetDaemon 1.0 <br>
<div class=spctrl></div>
　　TCP 15092=Host Control <br>
<div class=spctrl></div>
　　TCP 15104=Mstream <br>
<div class=spctrl></div>
　　TCP 16484=Mosucker <br>
<div class=spctrl></div>
　　TCP 16660=Stacheldraht (DDoS) <br>
<div class=spctrl></div>
　　TCP 16772=ICQ Revenge <br>
<div class=spctrl></div>
　　TCP 16959=Priority <br>
<div class=spctrl></div>
　　TCP 16969=Priority <br>
<div class=spctrl></div>
　　TCP 17027=提供广告服务的Conducent"adbot"共享软件 <br>
<div class=spctrl></div>
　　TCP 17166=Mosaic <br>
<div class=spctrl></div>
　　TCP 17300=Kuang2 The Virus <br>
<div class=spctrl></div>
　　TCP 17490=CrazyNet <br>
<div class=spctrl></div>
　　TCP 17500=CrazyNet <br>
<div class=spctrl></div>
　　TCP 17569=Infector 1.4.x + 1.6.x <br>
<div class=spctrl></div>
　　TCP 17777=Nephron <br>
<div class=spctrl></div>
　　TCP 18753=Shaft (DDoS) <br>
<div class=spctrl></div>
　　TCP 19191=蓝色火焰 <br>
<div class=spctrl></div>
　　TCP 19864=ICQ Revenge <br>
<div class=spctrl></div>
　　TCP 20000=Millennium II (GrilFriend) <br>
<div class=spctrl></div>
　　TCP 20001=Millennium II (GrilFriend) <br>
<div class=spctrl></div>
　　TCP 20002=AcidkoR <br>
<div class=spctrl></div>
　　TCP 20034=NetBus 2 Pro <br>
<div class=spctrl></div>
　　TCP 20168=Lovgate <br>
<div class=spctrl></div>
　　TCP 20203=Logged,Chupacabra <br>
<div class=spctrl></div>
　　TCP 20331=Bla <br>
<div class=spctrl></div>
　　TCP 20432=Shaft (DDoS) <br>
<div class=spctrl></div>
　　TCP 20808=Worm.LovGate.v.QQ <br>
<div class=spctrl></div>
　　TCP 21335=Tribal Flood Network,Trinoo <br>
<div class=spctrl></div>
　　TCP 21544=Schwindler 1.82,GirlFriend <br>
<div class=spctrl></div>
　　TCP 21554=Schwindler 1.82,GirlFriend,Exloiter 1.0.1.2 <br>
<div class=spctrl></div>
　　TCP 22222=Prosiak,RuX Uploader 2.0 <br>
<div class=spctrl></div>
　　TCP 22784=Backdoor.Intruzzo <br>
<div class=spctrl></div>
　　TCP 23432=Asylum 0.1.3 <br>
<div class=spctrl></div>
　　TCP 23444=网络公牛 <br>
<div class=spctrl></div>
　　TCP 23456=Evil FTP, Ugly FTP, WhackJob <br>
<div class=spctrl></div>
　　TCP 23476=Donald Dick <br>
<div class=spctrl></div>
　　TCP 23477=Donald Dick <br>
<div class=spctrl></div>
　　TCP 23777=INet Spy <br>
<div class=spctrl></div>
　　TCP 26274=Delta <br>
<div class=spctrl></div>
　　TCP 26681=Spy Voice <br>
<div class=spctrl></div>
　　TCP 27374=Sub Seven 2.0+, Backdoor.Baste <br>
<div class=spctrl></div>
　　TCP 27444=Tribal Flood Network,Trinoo <br>
<div class=spctrl></div>
　　TCP 27665=Tribal Flood Network,Trinoo <br>
<div class=spctrl></div>
　　TCP 29431=Hack Attack <br>
<div class=spctrl></div>
　　TCP 29432=Hack Attack <br>
<div class=spctrl></div>
　　TCP 29104=Host Control <br>
<div class=spctrl></div>
　　TCP 29559=TROJ_LATINUS.SVR <br>
<div class=spctrl></div>
　　TCP 29891=The Unexplained <br>
<div class=spctrl></div>
　　TCP 30001=Terr0r32 <br>
<div class=spctrl></div>
　　TCP 30003=Death,Lamers Death <br>
<div class=spctrl></div>
　　TCP 30029=AOL trojan <br>
<div class=spctrl></div>
　　TCP 30100=NetSphere 1.27a,NetSphere 1.31 <br>
<div class=spctrl></div>
　　TCP 30101=NetSphere 1.31,NetSphere 1.27a <br>
<div class=spctrl></div>
　　TCP 30102=NetSphere 1.27a,NetSphere 1.31 <br>
<div class=spctrl></div>
　　TCP 30103=NetSphere 1.31 <br>
<div class=spctrl></div>
　　TCP 30303=Sockets de Troie <br>
<div class=spctrl></div>
　　TCP 30722=W32.Esbot.A <br>
<div class=spctrl></div>
　　TCP 30947=Intruse <br>
<div class=spctrl></div>
　　TCP 30999=Kuang2 <br>
<div class=spctrl></div>
　　TCP 31336=Bo Whack <br>
<div class=spctrl></div>
　　TCP 31337=Baron Night,BO client,BO2,Bo Facil,BackFire,Back Orifice,DeepBO,Freak2k,NetSpy <br>
<div class=spctrl></div>
　　TCP 31338=NetSpy,Back Orifice,DeepBO <br>
<div class=spctrl></div>
　　TCP 31339=NetSpy DK <br>
<div class=spctrl></div>
　　TCP 31554=Schwindler <br>
<div class=spctrl></div>
　　TCP 31666=BOWhack <br>
<div class=spctrl></div>
　　TCP 31778=Hack Attack <br>
<div class=spctrl></div>
　　TCP 31785=Hack Attack <br>
<div class=spctrl></div>
　　TCP 31787=Hack Attack <br>
<div class=spctrl></div>
　　TCP 31789=Hack Attack <br>
<div class=spctrl></div>
　　更新时间: 2007年8月6日 <br>
<div class=spctrl></div>
　　TCP 31791=Hack Attack <br>
<div class=spctrl></div>
　　TCP 31792=Hack Attack <br>
<div class=spctrl></div>
　　TCP 32100=PeanutBrittle <br>
<div class=spctrl></div>
　　TCP 32418=Acid Battery <br>
<div class=spctrl></div>
　　TCP 33333=Prosiak,Blakharaz 1.0 <br>
<div class=spctrl></div>
　　TCP 33577=Son Of Psychward <br>
<div class=spctrl></div>
　　TCP 33777=Son Of Psychward <br>
<div class=spctrl></div>
　　TCP 33911=Spirit 2001a <br>
<div class=spctrl></div>
　　TCP 34324=BigGluck,TN,Tiny Telnet Server <br>
<div class=spctrl></div>
　　TCP 34555=Trin00 (Windows) (DDoS) <br>
<div class=spctrl></div>
　　TCP 35555=Trin00 (Windows) (DDoS) <br>
<div class=spctrl></div>
　　TCP 36794=Worm.Bugbear-A <br>
<div class=spctrl></div>
　　TCP 37651=YAT <br>
<div class=spctrl></div>
　　TCP 40412=The Spy <br>
<div class=spctrl></div>
　　TCP 40421=Agent 40421,Masters Paradise.96 <br>
<div class=spctrl></div>
　　TCP 40422=Masters Paradise <br>
<div class=spctrl></div>
　　TCP 40423=Masters Paradise.97 <br>
<div class=spctrl></div>
　　TCP 40425=Masters Paradise <br>
<div class=spctrl></div>
　　TCP 40426=Masters Paradise 3.x <br>
<div class=spctrl></div>
　　TCP 41666=Remote Boot <br>
<div class=spctrl></div>
　　TCP 43210=Schoolbus 1.6/2.0 <br>
<div class=spctrl></div>
　　TCP 44444=Delta Source <br>
<div class=spctrl></div>
　　TCP 44445=Happypig <br>
<div class=spctrl></div>
　　TCP 45576=未知代理 <br>
<div class=spctrl></div>
　　TCP 47252=Prosiak <br>
<div class=spctrl></div>
　　TCP 47262=Delta <br>
<div class=spctrl></div>
　　TCP 47624=Direct Play Server <br>
<div class=spctrl></div>
　　TCP 47878=BirdSpy2 <br>
<div class=spctrl></div>
　　TCP 49301=Online Keylogger <br>
<div class=spctrl></div>
　　TCP 50505=Sockets de Troie <br>
<div class=spctrl></div>
　　TCP 50766=Fore, Schwindler <br>
<div class=spctrl></div>
　　TCP 51966=CafeIni <br>
<div class=spctrl></div>
　　TCP 53001=Remote Windows Shutdown <br>
<div class=spctrl></div>
　　TCP 53217=Acid Battery 2000 <br>
<div class=spctrl></div>
　　TCP 54283=Back Door-G, Sub7 <br>
<div class=spctrl></div>
　　TCP 54320=Back Orifice 2000,Sheep <br>
<div class=spctrl></div>
　　TCP 54321=School Bus .69-1.11,Sheep, BO2K <br>
<div class=spctrl></div>
　　TCP 57341=NetRaider <br>
<div class=spctrl></div>
　　TCP 58008=BackDoor.Tron <br>
<div class=spctrl></div>
　　TCP 58009=BackDoor.Tron <br>
<div class=spctrl></div>
　　TCP 58339=ButtFunnel <br>
<div class=spctrl></div>
　　TCP 59211=BackDoor.DuckToy <br>
<div class=spctrl></div>
　　TCP 60000=Deep Throat <br>
<div class=spctrl></div>
　　TCP 60068=Xzip 6000068 <br>
<div class=spctrl></div>
　　TCP 60411=Connection <br>
<div class=spctrl></div>
　　TCP 60606=TROJ_BCKDOR.G2.A <br>
<div class=spctrl></div>
　　TCP 61466=Telecommando <br>
<div class=spctrl></div>
　　TCP 61603=Bunker-kill <br>
<div class=spctrl></div>
　　TCP 63485=Bunker-kill <br>
<div class=spctrl></div>
　　TCP 65000=Devil, DDoS <br>
<div class=spctrl></div>
　　TCP 65432=Th3tr41t0r, The Traitor <br>
<div class=spctrl></div>
　　TCP 65530=TROJ_WINMITE.10 <br>
<div class=spctrl></div>
　　TCP 65535=RC,Adore Worm/Linux <br>
<div class=spctrl></div>
　　TCP 69123=ShitHeep <br>
<div class=spctrl></div>
　　TCP 88798=Armageddon,Hack Office <br>
<div class=spctrl></div>
　　UDP 1=Sockets des Troie <br>
<div class=spctrl></div>
　　UDP 9=Chargen <br>
<div class=spctrl></div>
　　UDP 19=Chargen <br>
<div class=spctrl></div>
　　UDP 69=Pasana <br>
<div class=spctrl></div>
　　UDP 80=Penrox <br>
<div class=spctrl></div>
　　UDP 371=ClearCase版本管理软件 <br>
<div class=spctrl></div>
　　UDP 445=公共Internet文件系统(CIFS) <br>
<div class=spctrl></div>
　　UDP 500=Internet密钥交换 <br>
<div class=spctrl></div>
　　UDP 1025=Maverick's Matrix 1.2 - 2.0 <br>
<div class=spctrl></div>
　　UDP 1026=Remote Explorer 2000 <br>
<div class=spctrl></div>
　　UDP 1027=HP服务,UC聊天软件,Trojan.Huigezi.e <br>
<div class=spctrl></div>
　　UDP 1028=应用层网关服务,KiLo,SubSARI <br>
<div class=spctrl></div>
　　UDP 1029=SubSARI <br>
<div class=spctrl></div>
　　UDP 1031=Xot <br>
<div class=spctrl></div>
　　UDP 1032=Akosch4 <br>
<div class=spctrl></div>
　　UDP 1104=RexxRave <br>
<div class=spctrl></div>
　　UDP 1111=Daodan <br>
<div class=spctrl></div>
　　UDP 1116=Lurker <br>
<div class=spctrl></div>
　　UDP 1122=Last 2000,Singularity <br>
<div class=spctrl></div>
　　UDP 1183=Cyn,SweetHeart <br>
<div class=spctrl></div>
　　UDP 1200=NoBackO <br>
<div class=spctrl></div>
　　UDP 1201=NoBackO <br>
<div class=spctrl></div>
　　UDP 1342=BLA trojan <br>
<div class=spctrl></div>
　　UDP 1344=Ptakks <br>
<div class=spctrl></div>
　　UDP 1349=BO dll <br>
<div class=spctrl></div>
　　UDP 1512=Microsoft Windows Internet Name Service <br>
<div class=spctrl></div>
　　UDP 1561=MuSka52 <br>
<div class=spctrl></div>
　　UDP 1772=NetControle <br>
<div class=spctrl></div>
　　UDP 1801=Microsoft Message Queue <br>
<div class=spctrl></div>
　　UDP 1978=Slapper <br>
<div class=spctrl></div>
　　UDP 1985=Black Diver <br>
<div class=spctrl></div>
　　UDP 2000=A-trojan,Fear,Force,GOTHIC Intruder,Last 2000,Real 2000 <br>
<div class=spctrl></div>
　　UDP 2001=Scalper <br>
<div class=spctrl></div>
　　UDP 2002=Slapper <br>
<div class=spctrl></div>
　　UDP 2015=raid-cs <br>
<div class=spctrl></div>
　　UDP 2018=rellpack <br>
<div class=spctrl></div>
　　UDP 2130=Mini BackLash <br>
<div class=spctrl></div>
　　UDP 2140=Deep Throat,Foreplay,The Invasor <br>
<div class=spctrl></div>
　　UDP 2222=SweetHeart,Way,Backdoor/Mifeng.t <br>
<div class=spctrl></div>
　　UDP 2234=DirectPlay <br>
<div class=spctrl></div>
　　UDP 2339=Voice Spy <br>
<div class=spctrl></div>
　　UDP 2702=Black Diver <br>
<div class=spctrl></div>
　　UDP 2989=RAT <br>
<div class=spctrl></div>
　　UDP 3074=Microsoft Xbox game port <br>
<div class=spctrl></div>
　　UDP 3132=Microsoft Business Rule Engine Update Service <br>
<div class=spctrl></div>
　　UDP 3150=Deep Throat <br>
<div class=spctrl></div>
　　UDP 3215=XHX <br>
<div class=spctrl></div>
　　UDP 3268=Microsoft Global Catalog <br>
<div class=spctrl></div>
　　UDP 3269=Microsoft Global Catalog with LDAP/SSL <br>
<div class=spctrl></div>
　　UDP 3333=Daodan <br>
<div class=spctrl></div>
　　UDP 3535=Microsoft Class Server <br>
<div class=spctrl></div>
　　UDP 3801=Eclypse <br>
<div class=spctrl></div>
　　UDP 3996=Remote Anything <br>
<div class=spctrl></div>
　　UDP 4128=RedShad <br>
<div class=spctrl></div>
　　UDP 4156=Slapper <br>
<div class=spctrl></div>
　　UDP 4350=Net Device <br>
<div class=spctrl></div>
　　UDP 4500=Microsoft IPsec NAT-T, sae-urn <br>
<div class=spctrl></div>
　　UDP 5419=DarkSky <br>
<div class=spctrl></div>
　　UDP 5503=Remote Shell Trojan <br>
<div class=spctrl></div>
　　UDP 5555=Daodan <br>
<div class=spctrl></div>
　　UDP 5678=Remote Replication Agent Connection <br>
<div class=spctrl></div>
　　UDP 5679=Direct Cable Connect Manager <br>
<div class=spctrl></div>
　　UDP 5720=Microsoft Licensing <br>
<div class=spctrl></div>
　　UDP 5882=Y3K RAT <br>
<div class=spctrl></div>
　　UDP 5888=Y3K RAT <br>
<div class=spctrl></div>
　　UDP 6073=DirectPlay8 <br>
<div class=spctrl></div>
　　UDP 6112=Battle.net Game <br>
<div class=spctrl></div>
　　UDP 6666=KiLo <br>
<div class=spctrl></div>
　　UDP 6667=KiLo <br>
<div class=spctrl></div>
　　UDP 6766=KiLo <br>
<div class=spctrl></div>
　　UDP 6767=KiLo,UandMe <br>
<div class=spctrl></div>
　　UDP 6838=Mstream Agent-handler <br>
<div class=spctrl></div>
　　UDP 7028=未知木马 <br>
<div class=spctrl></div>
　　UDP 7424=Host Control <br>
<div class=spctrl></div>
　　UDP 7788=Singularity <br>
<div class=spctrl></div>
　　UDP 7983=MStream handler-agent <br>
<div class=spctrl></div>
　　UDP 8012=Ptakks <br>
<div class=spctrl></div>
　　UDP 8090=Aphex's Remote Packet Sniffer <br>
<div class=spctrl></div>
　　UDP 8127=9_119,Chonker <br>
<div class=spctrl></div>
　　UDP 8488=KiLo <br>
<div class=spctrl></div>
　　UDP 8489=KiLo <br>
<div class=spctrl></div>
　　UDP 8787=BackOrifice 2000 <br>
<div class=spctrl></div>
　　UDP 8879=BackOrifice 2000 <br>
<div class=spctrl></div>
　　UDP 9325=MStream Agent-handler <br>
<div class=spctrl></div>
　　UDP 10000=XHX <br>
<div class=spctrl></div>
　　UDP 10067=Portal of Doom <br>
<div class=spctrl></div>
　　UDP 10084=Syphillis <br>
<div class=spctrl></div>
　　UDP 10100=Slapper <br>
<div class=spctrl></div>
　　UDP 10167=Portal of Doom <br>
<div class=spctrl></div>
　　UDP 10498=Mstream <br>
<div class=spctrl></div>
　　UDP 10666=Ambush <br>
<div class=spctrl></div>
　　UDP 11225=Cyn <br>
<div class=spctrl></div>
　　UDP 12321=Protoss <br>
<div class=spctrl></div>
　　UDP 12345=BlueIce 2000 <br>
<div class=spctrl></div>
　　UDP 12378=W32/Gibe@MM <br>
<div class=spctrl></div>
　　UDP 12623=ButtMan,DUN Control <br>
<div class=spctrl></div>
　　UDP 11320=IMIP Channels Port <br>
<div class=spctrl></div>
　　UDP 15210=UDP remote shell backdoor server <br>
<div class=spctrl></div>
　　UDP 15486=KiLo <br>
<div class=spctrl></div>
　　UDP 16514=KiLo <br>
<div class=spctrl></div>
　　UDP 16515=KiLo <br>
<div class=spctrl></div>
　　UDP 18753=Shaft handler to Agent <br>
<div class=spctrl></div>
　　UDP 20433=Shaft <br>
<div class=spctrl></div>
　　UDP 21554=GirlFriend <br>
<div class=spctrl></div>
　　UDP 22784=Backdoor.Intruzzo <br>
<div class=spctrl></div>
　　UDP 23476=Donald Dick <br>
<div class=spctrl></div>
　　UDP 25123=MOTD <br>
<div class=spctrl></div>
　　UDP 26274=Delta Source <br>
<div class=spctrl></div>
　　UDP 26374=Sub-7 2.1 <br>
<div class=spctrl></div>
　　UDP 26444=Trin00/TFN2K <br>
<div class=spctrl></div>
　　UDP 26573=Sub-7 2.1 <br>
<div class=spctrl></div>
　　UDP 27184=Alvgus trojan 2000 <br>
<div class=spctrl></div>
　　UDP 27444=Trinoo <br>
<div class=spctrl></div>
　　UDP 29589=KiLo <br>
<div class=spctrl></div>
　　UDP 29891=The Unexplained <br>
<div class=spctrl></div>
　　UDP 30103=NetSphere <br>
<div class=spctrl></div>
　　UDP 31320=Little Witch <br>
<div class=spctrl></div>
　　UDP 31335=Trin00 DoS Attack <br>
<div class=spctrl></div>
　　UDP 31337=Baron Night, BO client, BO2, Bo Facil, BackFire, Back Orifice, DeepBO <br>
<div class=spctrl></div>
　　UDP 31338=Back Orifice, NetSpy DK, DeepBO <br>
<div class=spctrl></div>
　　UDP 31339=Little Witch <br>
<div class=spctrl></div>
　　UDP 31340=Little Witch <br>
<div class=spctrl></div>
　　UDP 31416=Lithium <br>
<div class=spctrl></div>
　　UDP 31787=Hack aTack <br>
<div class=spctrl></div>
　　UDP 31789=Hack aTack <br>
<div class=spctrl></div>
　　UDP 31790=Hack aTack <br>
<div class=spctrl></div>
　　UDP 31791=Hack aTack <br>
<div class=spctrl></div>
　　UDP 33390=未知木马 <br>
<div class=spctrl></div>
　　UDP 34555=Trinoo <br>
<div class=spctrl></div>
　　UDP 35555=Trinoo <br>
<div class=spctrl></div>
　　UDP 43720=KiLo <br>
<div class=spctrl></div>
　　UDP 44014=Iani <br>
<div class=spctrl></div>
　　UDP 44767=School Bus <br>
<div class=spctrl></div>
　　UDP 46666=Taskman <br>
<div class=spctrl></div>
　　UDP 47262=Delta Source <br>
<div class=spctrl></div>
　　UDP 47624=Direct Play Server <br>
<div class=spctrl></div>
　　UDP 47785=KiLo <br>
<div class=spctrl></div>
　　UDP 49301=OnLine keyLogger <br>
<div class=spctrl></div>
　　UDP 49683=Fenster <br>
<div class=spctrl></div>
　　UDP 49698=KiLo <br>
<div class=spctrl></div>
　　UDP 52901=Omega <br>
<div class=spctrl></div>
　　UDP 54320=Back Orifice <br>
<div class=spctrl></div>
　　UDP 54321=Back Orifice 2000 <br>
<div class=spctrl></div>
　　UDP 54341=NetRaider Trojan <br>
<div class=spctrl></div>
　　UDP 61746=KiLO <br>
<div class=spctrl></div>
　　UDP 61747=KiLO <br>
<div class=spctrl></div>
　　UDP 61748=KiLO <br>
<div class=spctrl></div>
　　UDP 65432=The Traitor
<div class=bpctrl></div>
<h2 class="">
<div class=text_edit>[<a onclick="userLogin(3,0);Detect.url='http://baike.baidu.com/edit/id=642103&amp;dl=4';Detect.id=642103;return false;" href="http://baike.baidu.com/view/642103.htm#"><u>编辑本段</u></a>]</div>
<a name=4></a>怎样查看端口</h2>
　　一台服务器有大量的端口在使用，怎么来查看端口呢？有两种方式： 一种是利用系统内置的命令，一种是利用第三方端口扫描软件。 <br>
<div class=spctrl></div>
　　1.用&#8220;netstat －an&#8221;查看端口状态 <br>
<div class=spctrl></div>
　　在Windows 2000/XP中，可以在命令提示符下使用&#8220;netstat -an&#8221;查 看系统端口状态，可以列出系统正在开放的端口号及其状态． <br>
<div class=spctrl></div>
　　2.用第三方端口扫描软件 <br>
<div class=spctrl></div>
　　第三方端口扫描软件有许多，界面虽然千差万别，但是功能却是类似 的。这里以&#8220;Fport&#8221; （可到http://www.ccert.edu.cn/tools/index.php?type_t=7或http://www.cci dnet.com/soft/cce下载）为例讲解。&#8220;Fport&#8221;在命令提示符下使用，运行结果 与&#8220;netstat -an&#8221;相似，但是它不仅能够列出正在使用的端口号及类型，还可 以列出端口被哪个应用程序使用。<br>
<div class=spctrl></div>
　　3.用&#8220;netstat -n&#8221;命令，以数字格式显示地址和端口信息。
<div class=bpctrl></div>
<h2 class="">
<div class=text_edit>[<a onclick="userLogin(3,0);Detect.url='http://baike.baidu.com/edit/id=642103&amp;dl=5';Detect.id=642103;return false;" href="http://baike.baidu.com/view/642103.htm#"><u>编辑本段</u></a>]</div>
<a name=5></a>端口号很多是奇数的原因</h2>
　　如果仔细检查这些标准的简单服务以及其他标准的TCP/IP服务（如Telnet、FTP、 SMTP等）的端口号时，我们发现它们都是奇数。这是有历史原因的，因为这些端口号都是从NCP端口号派生出来的（NCP，即网络控制协议，是ARPANET的运输层协议，是TCP的前身）。NCP是单工的，不是全双工的，因此每个应用程序需要两个连接，需预留一对奇数和偶数端口号。当TCP和UDP成为标准的运输层协议时，每个应用程序只需要一个端口号，因此就使用了NCP中的奇数。 <br>
<img src ="http://www.cppblog.com/prayer/aggbug/80940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-24 14:37 <a href="http://www.cppblog.com/prayer/archive/2009/04/24/80940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP的流量控制 </title><link>http://www.cppblog.com/prayer/archive/2009/04/20/80527.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 20 Apr 2009 05:12:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/20/80527.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80527.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/20/80527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80527.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80527.html</trackback:ping><description><![CDATA[<div>本文档的Copyleft归yfydz所有，使用GPL发布，可以自由拷贝，转载，转载时请保<br>持文档的完整性，严禁用于任何商业用途。<br>msn: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#121;&#102;&#121;&#100;&#122;&#95;&#110;&#111;&#49;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>yfydz_no1@hotmail.com</font></u></a><br>来源：<a href="http://yfydz.cublog.cn/"><u><font color=#0000ff>http://yfydz.cublog.cn</font></u></a></div>
<div>参考文献: RFC2581, RFC3390</div>
<div>&nbsp;</div>
<div>1. 前言</div>
<div>&nbsp;</div>
<div>TCP是具备流控和可靠连接能力的协议，为防止TCP发生拥塞或为提高传输效率，在网<br>络发展早期就提出了一些相关的TCP流控和优化算法，而且也被RFC2581规定是每个<br>TCP实现时要实现的。</div>
<div>&nbsp;</div>
<div>本文中，为求方便把将&#8220;TCP分组段(segment)&#8221;都直接称为&#8220;包&#8221;。</div>
<div>&nbsp;</div>
<div>2. 慢启动(slow start)和拥塞避免(Congestion Avoidance)</div>
<div>&nbsp;</div>
<div>慢启动和拥塞避免是属于TCP发送方必须(MUST)要实现的，防止TCP发送方向网络传入大量的突发数据造成网络阻塞。</div>
<div><br>先介绍几个相关参数，是在通信双方中需要考虑但不在TCP包中体现的一些参数：</div>
<div><br><strong>拥塞窗口(congestion window，cwnd)，是指发送方在接收到对方的ACK确认前向允许网络发送的数据量，数据发送后，拥塞窗口缩小；接收到对方的ACK后，拥塞窗口相应增加，拥塞窗口越大，可发送的数据量越大。</strong>拥塞窗口初始值的RFC2581中被规定为不超过发送方MSS的两倍，而且不能超过两个TCP包，在RFC3390中更新了初始窗口大小的设置方法。</div>
<div><br><strong>通告窗口(advertised window，rwnd)，是指接收方所能接收的没来得及发ACK确认的数据量，接收方数据接收后，通告窗口缩小；发送ACK后，通告窗口相应扩大。</strong></div>
<div><br>慢启动阈值(slow start threshold, ssthresh)，用来判断是否要使用慢启动或拥塞避免算法来控制流量的一个参数，也是随通信过程不断变化的。</div>
<div><br>当cwnd &lt; ssthresh时，拥塞窗口值已经比较小了，表示未经确认的数据量增大，需要启动慢启动算法；当cwnd &gt; ssthresh时，可发送数据量大，需要启动拥塞避免算法。</div>
<div><br><strong>拥塞窗口cwnd是根据发送的数据量自动减小的，但扩大就需要根据对方的接收情况进行扩大，慢启动和拥塞避免算法都是描述如何扩大该值的。</strong></div>
<div><br>在启动慢启动算法时，TCP发送方接收到对方的ACK后拥塞窗口最多每次增加一个发送方MSS字节的数值，当拥塞窗口超过sshresh后或观察到拥塞才停止算法。</div>
<div><br>启动拥塞避免算法时，拥塞窗口在一个连接往返时间RTT内增加一个最大TCP包长度的量，一般实现时用以下公式计算：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cwnd += max(SMSS*SMSS/cwnd, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2.1)</div>
<div>SMSS为发送方MSS。</div>
<div><br>TCP发送方检测到数据包丢失时，需要调整ssthresh，一般按下面公式计算：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssthresh = max (FlightSize / 2, 2*SMSS)&nbsp;&nbsp;&nbsp; (2.2)</div>
<div>其中FlightSize表示已经发送但还没有被确认的数据量。</div>
<div>&nbsp;</div>
<div>3. 快速重传(fast retransmit)和快速恢复(fast recovery)</div>
<div><br>TCP接收方收到错序的TCP包时要发送复制的ACK包回应，提示发送方可能出现网络丢包；发送方<br>收到连续3个重复的ACK包后启动快速重传算法，根据确认号快速重传那个可能丢失的包而不必等<br>重传定时器超时后再重传，普通的重传是要等到重传定时器超时还没收到ACK才进行的。这个算<br>法是TCP发送方应该(SHOULD)实现的，不是必须。TCP发送方进行了快速重传后进入快速恢复阶段<br>，直到没再接收重复的ACK包。</div>
<div><br>快速重传和快速恢复具体过程为：<br>1. 当收到第3个重复的ACK包时，ssthreh值按公式2.2重新设置；</div>
<div>2. 重传丢失的包后，将拥塞窗口cwnd设置为sshresh+3*SMSS，人工扩大了拥塞窗口；</div>
<div>3. 对于每个接收到的重复的ACK包，cwnd相应增加SMSS，扩大拥塞窗口；</div>
<div>4. 如果新的拥塞窗口cwnd值和接收方的通告窗口值允许的话，可以继续发新包；</div>
<div>5. 当收到下一个ACK确认了新数据时，将cwnd大小调整为sshresh，减少窗口；对接收方<br>&nbsp;&nbsp; 来说，接收到重发的TCP包后就要发此ACK确认当前接收的数据。</div>
<div>&nbsp;</div>
<div>4. 结论</div>
<div>这些算法重点在于保持网络的可靠性和可用性，防止网络阻塞造成的网络崩溃，是相对<br>比较保守的。</div>
<div><br>5. 附录讨论</div>
<div><br>A君: 这些算法都是针对通信双方的事, 但如果从开发防火墙等中间设备的角度来看, <br>&nbsp;&nbsp;&nbsp;&nbsp; 中间设备有必要考虑这些么?<br>端木: 这个...我好象也看不出必要性，因为算法的参数都是在双方内部而不在TCP数据包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中体现...但应该会让中间设备轻松点，这个就象在马路开车，这些算法就是交规</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让你开得规矩点，交警只关心你开车的情况，而不管你开的是什么车，开得好交警</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也轻松。好车可以让你很容易开好，但差车也可以开好。</div>
<div><br>A君: 这些算法原型提出也很早了, 最早是88年的事, 当时网络都处于初级阶段, 有个</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; 9600bps的猫就很牛了, 计算机性能也很差, 因此实施这些算法还有点用; 但现</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; 在过了快20年了, 百兆都快淘汰, 千兆, 万兆网络都快普及了, 即使PC机的内存</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; 也都上G了,再规矩这种几K级别的数据量有意思么? 就好象现在喷气式战斗机都到</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; 第4代了, 再研究螺旋桨战斗机还有意思么?<br>端木: 这个...这个就象病毒库了, 里面不也有无数的DOS时代的病毒, 你以后这辈子估计<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 都见不着的，但没有哪个防病毒厂商会把这些病毒从库中剔除，库是只增不减的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有这么个东西也是一样，正因为平时没用，谁也不注意，知道了就可以吹一吹，</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尤其拿去唬唬人是很有效的！</div>
<div><br>A君: 你真无聊!<br>端木: You got it! 不无聊干吗写博客啊! </div>
<div><br>端木: 搞技术有时候是很悲哀的一件事，必须牵扯七大姑八大姨的很多老东西，也就是向下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 兼容，到一定程度将成为进一步发展的最大障碍，讲一个从smth看到的不是笑话</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的笑话：</div>
<div><br><em>&nbsp;&nbsp;&nbsp; 现代铁路的铁轨间距是4英尺8点5英寸，铁轨间距采用了电车轮距的标准，而电车轮距<br>的标准则沿袭了马车的轮距标准。 <br>&nbsp;&nbsp;&nbsp; 马车的轮距为何是4英尺8点5英寸？原来，英国的马路辙迹的宽度是4英尺8点5英寸。<br>如果马车改用其他尺寸的轮距，轮子很快就会在英国的老马路上撞坏。 <br>&nbsp;&nbsp;&nbsp; 英国马路的辙迹宽度又从何而来？这可以上溯到古罗马时期。整个欧洲(包括英国)的老路都是罗马人为其军队铺设的，4英尺8点5英寸正是罗马战车的宽度。 <br>&nbsp;&nbsp;&nbsp; 罗马战车的宽度又是怎么来的？答案很简单，它是牵引一辆战车的两匹马的屁股的总宽度。 <br>&nbsp;&nbsp;&nbsp; 段子到这里还没有结束。美国航天飞机的火箭助推器也摆脱不了马屁股的纠缠———火箭助推器造好之后要经过铁路运送，而铁路上必然有一些隧道，隧道的宽度又是根据铁轨的宽度而来。代表着尖端科技的火箭助推器的宽度，竟然被两匹马的屁股的总宽度决定了。 </em></div>
<img src ="http://www.cppblog.com/prayer/aggbug/80527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-20 13:12 <a href="http://www.cppblog.com/prayer/archive/2009/04/20/80527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP之TCP协议（3）：流量控制（滑动窗口协议）</title><link>http://www.cppblog.com/prayer/archive/2009/04/20/80519.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 20 Apr 2009 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/20/80519.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80519.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/20/80519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80519.html</trackback:ping><description><![CDATA[1、流量控制是管理两端的流量，以免会产生发送过块导致收端溢出，或者因收端处理太快而浪费时间的状态。用的是：滑动窗口，以字节为单位<br><br>2、窗口有3种动作：展开（右边向右），合拢（左边向右），收缩（右边向左）这三种动作受接收端的控制。<br><br>合拢：表示已经收到相应字节的确认了<br><br>展开：表示允许缓存发送更多的字节<br><br>收缩（非常不希望出现的，某些实现是禁止的）：表示本来可以发送的，现在不能发送；但是如果收缩的是那些已经发出的，就会有问题；为了避免，收端会等待到缓存中有更多缓存空间时才进行通信。<br><br>发端窗口的大小取决于收端的窗口大小rwnd（TCP报文的窗口大小字段）和拥塞窗口大小cwnd（见拥塞控制）<br><br>发端窗口大小 = min{ rwnd , cwnd };<br><br>3、关闭窗口：窗口缩回有个例外，就是发送rwnd=0表示暂时不愿意接收数据。这种情况下，发端不是把窗口收缩，二是停止发送数据。（为了比避免死锁，会用一些探测报定时发送试探，见定时器一节）<br><br>4、问题：某些时候，由于发端或收端的数据很慢，会引起大量的1字节数据痛惜，浪费很多资源。<br><br>（1）、发端的进程产生数据很慢时候，时不时的来个1字节数据，那么TCP就会1字节1字节的发送，效率很低。<br><br>解决方法（Nagle算法）：<br><br>a、将第一块数据发出去<br><br>b、然后等到发送缓存有足够多的数据（最大报文段长度），或者等到收端确认的ACK时再发送数据。<br><br>c、重复b的过程<br><br>（2）、收端进程由于消耗数据很慢，所以可能会有这么一种情况，收端会发送其窗口大小为1的信息，然后有是1字节的传输<br><br>解决办法（2种）<br><br>a、Clark方法：在接收缓存的一半变空，或者有足够空间放最大报文长度之前，宣告接收窗口大小为0<br><br>b、推迟确认：在对收到的报文段确认之前等待到足够的接收缓存，或者等待到一个时间段（现在一般定义500ms）<br><br><br>
<img src ="http://www.cppblog.com/prayer/aggbug/80519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-20 11:34 <a href="http://www.cppblog.com/prayer/archive/2009/04/20/80519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>流量控制和拥塞控制</title><link>http://www.cppblog.com/prayer/archive/2009/04/20/80517.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 20 Apr 2009 03:30:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/20/80517.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80517.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/20/80517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80517.html</trackback:ping><description><![CDATA[拥塞（Congestion）指的是在包交换网络中由于传送的包数目太多，而存贮转发节点的资源有限而造成网络传输性能下降的情况。拥塞的一种极端情况是死锁（Deadlock），退出死锁往往需要网络复位操作。 <br>流量控制（Flow Control）指的是在一条通道上控制发送端发送数据的数量及速度使其不超过接收端所能承受的能力，这个能力主要指接收端接收数据的速率及接收数据缓冲区的大小。通常采用停等法或滑动窗口法控制流量。 <br><strong>流量控制是针对端系统中资源受限而设置的</strong>；拥塞控制是针对中间节点资源受限而设置的。
<img src ="http://www.cppblog.com/prayer/aggbug/80517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-20 11:30 <a href="http://www.cppblog.com/prayer/archive/2009/04/20/80517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket服务器端如何判断连接已经断开</title><link>http://www.cppblog.com/prayer/archive/2009/04/14/79903.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 14 Apr 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/14/79903.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/79903.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/14/79903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/79903.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/79903.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=postmessage_66192>在阻塞模式下&nbsp;&nbsp;recv返回值是0的时候&nbsp;&nbsp;客户端就退出了</div>
<br>
<img src ="http://www.cppblog.com/prayer/aggbug/79903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-14 16:27 <a href="http://www.cppblog.com/prayer/archive/2009/04/14/79903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何判断socket已经断开</title><link>http://www.cppblog.com/prayer/archive/2009/04/14/79900.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 14 Apr 2009 08:22:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/14/79900.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/79900.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/14/79900.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/79900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/79900.html</trackback:ping><description><![CDATA[最近在做一个服务器端程序，C/S结构。功能方面比较简单就是client端与server端建立连接，然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题，如果socket连接断开（异常，正常）后，我如何才能感知到？server端这边是绝对被动的，sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接断开后， server要能够感知到并释放资源。<br>这个问题在思考测试，询问同事之后，找到了一个方法，可以做到这一点。<br>当使用 select()函数测试一个socket是否可读时，如果select()函数返回值为1，且使用recv()函数读取的数据长度为0 时，就说明该socket已经断开。<br>为了更好的判定socket是否断开，我判断当recv()返回值小于等于0时，socket连接断开。但是还需要判断 errno是否等于 EINTR 。如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的，socket连接还是正常的，不应close掉socket连接。<br><br>PS：对于堵塞socket的recv函数会在以下三种情况下返回：<br>（1）recv到数据时，会返回。<br>（2）在整个程序接收到信号时，返回-1。<strong>errno = EINTR</strong>。//在程序的起始阶段，屏蔽掉信号的除外。部分信号还是屏蔽不掉的。<br>（3）socket出现问题时，返回-1.具体错误码看 man recv()<br>（4）一定要看 man 说明，很详细，很有帮助。<br>这种方法经过长时间测试后，是有效的。所以写出来让大家参考一下，请大家发表意见。 
<img src ="http://www.cppblog.com/prayer/aggbug/79900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-14 16:22 <a href="http://www.cppblog.com/prayer/archive/2009/04/14/79900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeBSD6.3下双网卡绑定详细过程 </title><link>http://www.cppblog.com/prayer/archive/2009/04/13/79778.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 13 Apr 2009 02:38:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/13/79778.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/79778.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/13/79778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/79778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/79778.html</trackback:ping><description><![CDATA[<p minmax_bound="true">这几天公司里的服务器要用bonding，主要是做双网卡的冗余，网上说的最多的就是《FreeBSD上双网卡绑定提高带宽的做法》，研究了一下，把结果 给大家说说， linux的很简单，这里就不说了，照网上的资料就行了。freebsd的有点小难度，搞了几天，最初用lagg模块，照手册里的&#8220;链路聚合与故障转移&#8221; 部分做，做是做成的但是就是不能冗余，拔掉网络就不通了，最后决定用ng_fecg来做，下面是过程。<br minmax_bound="true"><br minmax_bound="true"><br minmax_bound="true">FreeBSD上双网卡绑定提高带宽的做法里，第3部分，《在FreeBSD5上用ng_fec实现双网卡绑定》，脚本的第一句就是/sbin/kldload ng_fec，要加载ng_fec ，如果你没有安装此模块，是加载不上的。<br minmax_bound="true"><br minmax_bound="true">#使用kldstat查看模块，没有ng_fec，需要安装并加载(不用带-v参数，否则出来一堆，看都看不过来)<br minmax_bound="true"># kldstat&nbsp; &nbsp;<br minmax_bound="true">Id Refs Address&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Size&nbsp; &nbsp;&nbsp;&nbsp;Name<br minmax_bound="true">1&nbsp; &nbsp; 1 0xffffffff80100000 8a2e40&nbsp; &nbsp;kernel<br minmax_bound="true"><br minmax_bound="true">#cd /usr/src/sys/modules/netgraph/<br minmax_bound="true">把下面三个模块安装了<br minmax_bound="true">netgraph fec socket<br minmax_bound="true">安装方法如下，直接进入到相应的目录，然后：<br minmax_bound="true">#make<br minmax_bound="true">#make install<br minmax_bound="true">#ls /boot/modules<br minmax_bound="true">ng_fec.ko netgraph.ko ng_socket.ko<br minmax_bound="true"><br minmax_bound="true">#vi /boot/defaults/loader.conf <br minmax_bound="true">找到ng_fec，ether,socket并改成YES,让它可以自带加载(经测试不改系统也能自动加载)<br minmax_bound="true">ng_ether_load="YES"<br minmax_bound="true">ng_fec_load="YES"<br minmax_bound="true">ng_socket_load="YES"<br minmax_bound="true">然后重启系统。<br minmax_bound="true">再用kldstat查看加载情况<br minmax_bound="true">-bash-3.2$ kldstat<br minmax_bound="true">Id Refs Address&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Size&nbsp; &nbsp;&nbsp;&nbsp;Name<br minmax_bound="true">1&nbsp; &nbsp; 4 0xffffffff80100000 8a2e40&nbsp; &nbsp;kernel<br minmax_bound="true">2&nbsp; &nbsp; 1 0xffffffff809a3000 104400&nbsp; &nbsp;ng_fec.ko<br minmax_bound="true">3&nbsp; &nbsp; 3 0xffffffff80aa8000 10f0d8&nbsp; &nbsp;netgraph.ko<br minmax_bound="true">4&nbsp; &nbsp; 1 0xffffffff811cb000 104000&nbsp; &nbsp;ng_socket.ko<br minmax_bound="true"><br minmax_bound="true"><br minmax_bound="true">#vi /etc/fec.sh<br minmax_bound="true">#!/bin/sh<br minmax_bound="true">/usr/sbin/ngctl mkpeer fec dummy fec<br minmax_bound="true">/usr/sbin/ngctl msg fec0: add_iface '"bce0"'<br minmax_bound="true">/usr/sbin/ngctl msg fec0: add_iface '"bce1"'<br minmax_bound="true">/usr/sbin/ngctl msg fec0: set_mode_inet<br minmax_bound="true">/sbin/ifconfig fec0 promisc<br minmax_bound="true">/sbin/ifconfig bce0 promisc<br minmax_bound="true">/sbin/ifconfig bce1 promisc<br minmax_bound="true">/sbin/ifconfig fec0 此处写IP netmask 0xfffffe00<br minmax_bound="true">/sbin/ifconfig fec0 media 1000baseTX mediaopt full-duplex<br minmax_bound="true">/sbin/ifconfig fec0 up<br minmax_bound="true">/sbin/route add default 此外写默认网关<br minmax_bound="true"><br minmax_bound="true">#vi /etc/rc.local<br minmax_bound="true">/etc/fec.sh<br minmax_bound="true"><br minmax_bound="true">记得把rc.conf设置网卡的语句屏蔽掉，然后重启系统。<br minmax_bound="true"><br minmax_bound="true"><br minmax_bound="true">#ifconfig<br minmax_bound="true">bce0: flags=28943 mtu 1500<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;options=3b<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ether 00:1e:0b:ed:64:1c<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;media: Ethernet autoselect (1000baseTX )<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;status: active<br minmax_bound="true">bce1: flags=28943 mtu 1500<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;options=3b<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ether 00:1e:0b:ed:64:1c<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;media: Ethernet autoselect (1000baseTX )<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;status: active<br minmax_bound="true">lo0: flags=8049 mtu 16384<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;inet 127.0.0.1 netmask 0xff000000 <br minmax_bound="true">fec0: flags=28943 mtu 1500<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;inet xxx.xxx.xxx.xxx netmask 0xfffffe00 broadcast xxx.xxx.xxx.255<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ether 00:1e:0b:ed:64:1c<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;media: Ethernet none<br minmax_bound="true">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;status: active</p>
<img src ="http://www.cppblog.com/prayer/aggbug/79778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-13 10:38 <a href="http://www.cppblog.com/prayer/archive/2009/04/13/79778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket绑定网卡</title><link>http://www.cppblog.com/prayer/archive/2009/04/13/79776.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 13 Apr 2009 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/13/79776.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/79776.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/13/79776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/79776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/79776.html</trackback:ping><description><![CDATA[<p>如果机器上有多块网卡，两个网卡处在不同的网段中，这在我们实验室还是很常见的，两个网卡有不同的默认网关。socket需要绑定相应的网卡，将数据包发送到指定的网卡上。</p>
<p>上一段测试代码：</p>
<p><br>#include &lt;sys/socket.h&gt;<br>#include &lt;net/if.h&gt;<br>struct ifreq interface;<br>struct socket sock;<br>/* Management net interface name */<br>#define IFNAME "eth1"<br>&nbsp;<br>/* Acquire socket here ... */<br>&nbsp;<br>strncpy(interface.ifr_ifrn.ifrn_name, IFNAME, \<br>IFNAMSIZ);<br>if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, \<br>(char *)&amp;interface, sizeof(interface)) &lt; 0) {<br>perror("SO_BINDTODEVICE failed");<br>/* Deal with error... */<br>} </p>
<p>参考：<br><a href="http://blog.chinaunix.net/u/270/showart_234383.html">http://blog.chinaunix.net/u/270/showart_234383.html</a><br><a href="http://tuxology.net/2008/05/15/forcing-connections-through-a-specific-interface/">http://tuxology.net/2008/05/15/forcing-connections-through-a-specific-interface/</a></p>
<p>文章出处：DIY部落(<a href="http://www.diybl.com/course/6_system/linux/Linuxjs/20090314/161536.html">http://www.diybl.com/course/6_system/linux/Linuxjs/20090314/161536.html</a>)</p>
<img src ="http://www.cppblog.com/prayer/aggbug/79776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-13 10:35 <a href="http://www.cppblog.com/prayer/archive/2009/04/13/79776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>