博主资料

留言短消息 加为好友 收藏

用户ID:  445972
昵称:  plaodj
来自:  湖南 长沙
年龄:  22
爱好: 焦点访谈

欢迎您的到来!

劲哥哥诚挚的欢迎您的到来!

日历

2007 - 7
1234567
891011121314
15161718192021
22232425262728
293031    
«» 2007 - 7 «»

日志分类

个人统计

用户名: plaodj
等级: 四星会员
威望: 430
金钱: 12135
在线时间: 417 小时
日志总数: 2337
评论数量: 663
访问次数: 11083244
建立时间: 2005-09-10
RSS订阅       手机访问

日志文章列表

2007年07月17日 15:58:03

“东突”恐怖分裂组织大揭密

突厥原是公元5世纪前后,生活在阿尔泰山地区的游牧民族的名称。公元6世纪至8世纪中叶,突厥族逐渐进入我国北方草原,与中原地区上自西魏下至隋唐各朝代发生了多渠道、多层面的广泛交往。公元552年,突厥建立汗国,其鼎盛时期疆域非常辽阔。后分裂为东、西两个突厥汗国,8世纪中叶,东突厥被回纥人(即维吾尔族的祖先)所灭,西突厥则被唐朝
  所灭。西突厥的后代迁移到小亚细亚半岛,后来建立了奥斯曼伊斯兰帝国。随着东西突厥汗国的相继灭亡,其后裔逐渐融入了其他民族之中。11世纪以后"突厥"这一概念,已不是原先的突厥人,而是对突厥语系诸民族的统称。"斯坦"则是"地方"、"地区"的意思。"东突厥斯坦"(简称"东突"),这一名词最早是19世纪末期西方别有用心的殖民主义者提出的,他们把俄罗斯中亚地区称为"西突厥斯坦",而把中国的新疆称为"东突厥斯坦",并编造出新疆是"东突厥"人家园的谬论。因此"东突厥斯坦"不是一个单纯的地理概念,而是殖民主义者为肢解中国而提出的一个政治概念。新疆民族分裂主义分子将"东突厥斯坦"作为他们分裂运动的名称,其用意昭然若揭。
  "东突厥斯坦运动"的产生和发展,是受泛伊斯兰主义和泛突厥主义的双重影响。泛伊斯兰主义是19世纪中期阿富汗人马丁鲁提出的,其思想核心是联合所有伊斯兰国家,建立统一的伊斯兰政治实体。泛突厥主义运动则源于沙俄统治时代受压迫的鞑靼人,其宗旨是要联合从小亚细亚到中亚的所有突厥语系民族,建立一个统一的突厥帝国。在这两种思想作用和影响下,就产生了新疆的"东突厥斯坦独立运动"。
  泛伊斯兰主义和泛突厥主义思想(简称"双泛主义")从20世纪初开始传入新疆。"双泛主义"一传入新疆,就受到当时中国新疆政府的大力压制,"双泛主义"的一些代表人物如土耳其人艾买提卡马尔和从土耳其留学归来的维吾尔族人麦斯武德被驱逐出境而流亡国外。
  30年代初,麦斯武德、$$$伊敏等"双泛主义"者又陆续回到中国,此时他们已形成了自己的思想体系和政治纲领,这就是所谓的"东突厥斯坦独立运动"(简称"东突")。当时中国正是军阀割据相互溷战的时代,新疆也是一片兵荒马乱,新疆省督军盛世才与支持哈密农民起义的甘肃军阀马仲英激战正酣。动盪的时代背景,给"东突"的发展提供了机会--1933年11月,"东突"分裂分子得到英国的支持在喀什建立了"东突厥斯坦伊斯兰共和国",1934年2月盛世才在苏联的支持下打败马仲英后兵进南疆,消灭了这个"共和国"。喀什"伊斯兰共和国"虽然只存在短短三个月,却是第一次公开提出新疆分裂,是新疆分裂运动的开始,其衣砵为新疆民族分裂主义分子一直承袭至今。
  喀什"伊斯兰共和国"被消灭后,"东突"运动的主要人物再次逃亡国外。其主要人物之一的伊敏就是在流亡印度时撰写了宣扬新疆独立的《东突厥斯坦史》,并被"东突"分裂分子视为经典。
  与此同时,日本也在积极筹划肢解中国,在推行大蒙满计划的同时,也策划在中国新疆建立伊斯兰国,为此日本还收留了奥斯曼帝国末代苏丹阿卜杜尔海米德二世之子,准备让他出任新疆独立后的首脑。
  抗战时期,麦斯武德、伊敏、艾山玉素莆等"东突"分裂运动主要人物又回到中国,在中国内地出版刊物,宣传泛突厥主义和泛伊斯兰主义的思想。
  1944年伊犁、塔城和阿尔泰三个地区在苏联的支持下成立了"东突厥斯坦共和国"。苏联此举是"醉翁之意不在酒",其真正目的并不是支持新疆独立,而是要以新疆问题做交换筹码,迫使中国政府承认外蒙古和苏联在中国东北的特权。1945年8月中苏友好条约签署,达到了苏联的预期目的,因此苏联要求"东突厥斯坦共和国"与国民党政府谈判,成立新疆省联合政府。麦斯武德、伊敏、艾山等"东突"分裂分子也被安排在联合政府中任职。由于"东突厥斯坦共和国"的实权掌握在反对新疆独立的阿合买提江等人手中,因此最后"东突厥斯坦共和国"无果而终,但事实上的独立一直维持到1949年解放新疆为止。因为这个伊斯兰政权是反对国民党的,而且并没有公然提出分裂的口号,所以新疆解放以后,人民政府从团结的角度出发,把这一事件称为"三区革命",作为中国新民主主义革命的一部分,并将民族军改编为解放军第5军。但是这一事件的负面影响不容忽视。
  新疆解放后,麦斯武德被关押,伊敏、艾山等再次闻风而逃。"东突"分裂运动再次受到沉重打击,但并没有因此而绝迹,分裂主义思想并未彻底根除,其影响依旧存在。只要有合适的环境条件,又会迅速死灰复燃。
"东突"的发展
  "东突"分裂运动在20世纪后期开始恶性发展,近年来第一个发展趋势是联合,由于历史原因,长期以来"东突"分裂组织大多是在境外,活动分散,而且规模和影响都较小。20世纪80年代以后,中国开始实行改革开放,苏联解体和中亚各国独立,给"东突"分裂主义者卷土重来带来了机遇。原先各自为政一盘散沙的"东突"分裂组织达成了统一集中发展的共识,提出了"统一组织、统一纲领、统一领袖、统一武装、统一行动"的目标。先后出现了"伊斯兰真主党"、"伊斯兰改革党"等联盟性质的组织。
  1992年12月,"东突"分裂主义者在沙特、土耳其的资助下,在伊斯坦布尔召开了"东突厥斯坦民族代表大会",来自中亚、美国、澳大利亚、巴基斯坦、德国、沙特、土耳其、瑞士等国的30多个分裂组织的头目参加了大会。在此次大会上成立了"东突厥斯坦国际民族联合委员会",确定了国名(东突厥斯坦国)、国旗(月牙旗)、国歌(夏迪雅)和国徽,标志着境外"东突"分裂主义运动走向联合。
  1993年4月5日,美国、德国、法国、巴基斯坦、沙特及中亚等17个国家的"东突"分裂组织代表再次在土耳其举行了"东突厥斯坦"国际会议,宣布建立统一流亡政府,任命热扎彼肯为"政府首脑",发表了独立宣言,并呼吁联合国、国际人权组织和伊斯兰组织向中国施加压力,还声称将与""组织、达赖集团进行"联合行动"。
  1996年10月在和田,来自新疆十几个州(县)的分裂组织代表举行会议,宣布成立"伊斯兰真主党",通过了党纲、组织建设等七项文件,这标志着境内分裂势力开始由分散走向联合。
  第二个发展趋势是国际化。90年代以后,"东突"分裂组织逐渐从地下转为公开,并开始朝着国际化趋势发展。中亚地区"东突"分裂势力的总头目莫哈裡索夫就曾公开表示:"要实现独立,没有国际的支持不行,没有西方的支持不行,仅有少数国家的支持也不行。要打‘国际牌',使新疆问题国际化"。近年来,"东突"分裂组织更是明确推行国际化的策略:扩大在中亚、西亚等伊斯兰国家的政治影响和生存空间,澹化分裂活动的民族宗教色彩,而是将所谓民族宗教问题与人权问题挂钩,把分裂活动提升为"民族解放运动",以争取西方大国的支持。为此,分裂组织的头目频繁与西方大国接触,并连年在西方国家举行的听証会上作証,到处举办"东突厥斯坦问题"国际研讨会、展览会,并不断组织示威活动,同时充分发挥因特网等现代通讯传媒的作用,扩大影响。
  诸如1994年4月,"维吾尔人国际联盟"在纪念"东突厥斯坦革命英雄"会议上决定,将"东突厥斯坦人民的悲惨命运问题拟定告联合国书",妄图进一步使新疆问题国际化。
  1999年5月,在哈萨克斯坦的"东突"分裂组织在阿拉木图举行游行集会,公然打出"支持北约轰炸南联盟"的标语,并宣称"科索沃"的今天就是"维吾尔斯坦的明天"。"东突"分裂组织头目还拜会美国总统克林顿,递交了关于"东突厥斯坦"历史与现状的有关材料,向美国摇尾乞怜,希望美国能像帮助科索沃的阿族那样帮助"东突厥斯坦"的维吾尔人。
  特别需要指出的是,在"东突"国际化的过程中,国际反华势力扮演了"重要"角色,美国等西方国家的纵容和支持,对新疆的民族分裂活动无疑是推波助澜。美国总统克林顿、副总统戈尔等政要就曾多次秘密会见"东突"分裂分子;美国国会还专门召开新疆问题听証会;美国中央情报局派出专门人员负责对"东突"分裂主义分子进行培训。1999年,美国政府发表的《中国人权报告》首次指责中国在新疆的民族政策,克林顿在公开场合与"东突厥斯坦民族代表大会"执委会主席艾尼瓦尔会面,接受了所谓新疆维吾尔族人遭受迫害的材料和录像。霍普金斯中亚-高加索问题研究所和史密斯-裡查德森基金会也派出专人前往阿拉木图,会见"东突"分裂组织头目。其它一些西方国家也利用"东突"问题向中国施加压力。土耳其和一些中亚国家也或明或暗地支持"东突"分裂运动,还允许其在本国境内开展活动、建立基地,向外输出"泛突厥主义"。在这些国家的支持下,分裂组织创办了多种刊物,连篇累牍地发表文章,攻击中国的民族政策。原设在德国的"解放电台"和"自由欧洲电台"已移到捷克和哈萨克斯坦的阿拉木图,并在土耳其增设了"独立解放电台",加强宣传力度。目前境外"东突"分裂组织立足中亚这一前沿阵地,对新疆进行渗透:设立出版机构,出版煽动独立的书刊和音像制品;建立电台,使用维吾尔语、哈萨克语和乌兹别克语进行广播,大肆进行分裂宣传;召开各种名目的国际研讨会、举办展览和发表公开信,为新疆独立摇旗呐喊,寻求国际反华势力支持;还不断派遣骨干分子入境,加强对境内"东突"分裂组织的扶持和领导;拉拢、收买、策反我驻外人员和出国探亲、朝圣、留学人员,进行情报搜集和颠覆活动;用金钱收买新疆中上层人士,扩大分裂势力;利用宗教进行分裂宣传,煽动宗教狂热,最终目的就是进一步发展扩大"东突"分裂运动。
  第三个发展趋势是恐怖主义化。从地理上看,新疆在与中亚地区东部相连,使得"东突"分裂组织与该地区活跃的民族分裂主义势力、极端宗教主义势力和恐怖主义势力有着密不可分的"地缘联系"。
  在其恐怖主义影响下,1997年,中亚地区的"东突"分裂组织召开会议,批判了艾沙的"和平斗争"主张。1999年12月,来自18个国家的40多个分裂组织代表在土耳其伊斯坦布尔召开会议,确立了暴力"建国"的方针,并就"武装夺取政权"达成共识。计划在十年内建立一支人数在万人以上的正规军队,在新疆地区实施恐怖战、游击战,甚至正规战。为此"东突"分裂组织派遣大出成员在阿富汗、车臣、克什米尔等地参加实战锻炼,并在中亚、西亚、阿富汗等地建立了20余个训练基地,训练骨干分子。哈萨克境内的"东突厥斯坦委员会"在阿拉木图召集近100名曾在原苏军服役的军官和士兵,策划组建武装部队,并在沙特维吾尔族商人的资助下,购买了700支手枪、200支冲锋枪、10多挺机关枪以及火箭筒等大批武器,企图偷运进新疆,支持"东突"分裂组织。"东突"分裂组织还疯狂叫嚣,"解放东突厥斯坦不能用和平方式,要靠武力解决"。有些分裂组织公然提出要在南疆山区进行"武装割据",一些"东突"组织就在纲领中明确主张使用暴力。例如,在阿富汗的"东突厥斯坦伊斯兰运动"、土耳其的"东土耳其斯坦青年民主联盟"、哈萨克"东突厥斯坦解放组织"和"中亚维吾尔真主党"等。还有一些组织,虽然没有在纲领中明确提出要使用暴力,但是在行动中已实际开展了恐怖活动,如"东突信息中心"等。
  事实上"东突"分裂组织已经逐步成为"东突"恐怖组织,不但得到了臭名昭着的拉登领导的"基地组织"的大力支持,同时也是拉登恐怖势力的重要组成部分。早在数年前,"东突"恐怖组织就得到了拉登在经费、物资上的大力支持。1999年初,拉登会见了"东突厥斯坦伊斯兰运动"头目艾山买合苏木,在许诺提供资金援助的同时,要求其"一切行动与塔利班协调"。2001年2月,拉登及塔利班高层人士在坎大哈与"东突"分裂组织达成协议,帮助其训练骨干成员,并承诺负担2001年的活动经费。此外塔利班、"基地组织"和"乌兹别克斯坦伊斯兰解放运动"还向"东突"分裂组织提供了大量的武器弹药、交通工具、通讯设备等。
  据报道,曾先后有来自10个"东突"分裂组织的1000多名骨干分子在"基地"组织设在阿富汗坎大哈、马扎裡沙裡夫、霍斯特、呼苏提等地的恐怖主义训练营中接受过诸如爆炸、暗杀、投毒等恐怖活动训练。这些人受训后有的被秘密派遣回中国境内发展恐怖组织,策划从事恐怖活动,有的加入阿富汗塔利班和"基地"组织,有的则参与了俄罗斯车臣恐怖势力的活动,还有的参加在中亚地区的恐怖活动。如1999年8月"东突"恐怖分子参与了在吉尔吉斯斯坦南部,劫持4名日本科学家和吉内务部队高级军官的恐怖事件;2000年两名"东突"分裂组织成员在车臣战争中被俄罗斯军队俘虏,遣返中国;2000年8月又参与在乌兹别克斯坦、吉尔吉斯斯坦南部山区,袭击当地政府军的恐怖活动。
  近年来在新疆发生的一系列爆炸暗杀恐怖事件,大多与这些组织有关。目前,中国警方已抓获100多名曾在阿富汗及其它国家接受过恐怖活动训练秘密潜入新疆的恐怖分子。有关国家也向中方引渡、移交了10多名在恐怖活动中被抓获的"东突"恐怖分子。
  2001年"911"恐怖事件后,恐怖组织成为过街老鼠人人喊打,"东突"恐怖组织不得不表示对美国军事打击的支持,并努力拉大与拉登恐怖组织的距离,千方百计抹掉自己的恐怖主义色彩,要求其成员暂时不要发表过激言论,避免所在国将其与恐怖组织联系在一起。在南亚的恐怖组织则抓紧进行战略转移,以保存实力。同时"东突"恐怖组织再一次扯起所谓维护"人权"、"宗教自由"和"少数民族利益"的大旗,编造所谓"中国政府借机打击少数民族"的谎言,溷淆视听,以逃脱国际反恐怖主义的打击。
"东突"累累罪行
  90年代是新疆"东突"分裂组织发展最为迅速、活动最为猖獗的时期,截止到目前在境内外的"东突"组织有50余个。主要有:"东突厥斯坦星火党"、"东突厥斯坦青年党"、"东突厥斯坦燎原党"、"东突厥斯坦独立组织"、"东突厥斯坦人民革命党"、"东突厥斯坦民族解放组织"、"东突厥斯坦中央执行委员会"、"天山民主联盟"、"天山民族拯救者党"、"星火党"、"星火联盟"、"新疆伊斯兰天山党"、"探索"及"独立党"等。
  而且境内外"东突"分裂分子已联成一体,"境外指挥,境内行动;境外培训,境内破坏"。近年来,在极端主义、分裂主义和国际恐怖主义的影响下,暴力思想已逐步在"东突"组织内部佔据上风,分裂活动转向以恐怖暴力为主要手段。一些"东突"分裂组织公开宣扬要通过恐怖暴力手段达到目的。在查获的"东突伊斯兰党"、"东突反对党"等组织的纲领中明确提出,要"走武装斗争道路"、"在人口集中的地区制造各种恐怖活动"。因此"东突"组织在新疆的恐怖活动逐步升级,爆炸、暗杀、绑架等恐怖活动不断出现,以极端残忍手段滥杀无辜,制造恐怖气氛。2002年1月21日,中国国务院新闻办公室发表了《"东突"恐怖势力难脱罪责》的长篇文章,彻底揭露了"东突"的罪行。据不完全统计,自1990年至2001年,境内外"东突"恐怖势力在中国新疆境内制造了至少200余起恐怖暴力事件,造成162人丧生,440多人受伤的严重后果,留下了一笔笔罪恶的记录。
  1990年4月5日,"东突伊斯兰党"恐怖分子在新疆阿克陶县巴仁乡劫持10名人质要挟政府,并在交通要道炸毁2辆汽车,杀害6名武警官兵。
  1991年2月28日,"东突"恐怖组织在新疆阿克苏地区库车县客运站录像厅制造爆炸桉,造成1人死亡,13人受伤。同日,恐怖分子还在库车县城一商店内安置了炸弹,爆炸未遂。
  1992年2月5日,"伊斯兰改革者党"在乌鲁木齐市52路、30路公共汽车上制造了两起爆炸事件,两辆公共汽车被炸毁,造成3人丧生、23人受伤。同时还在一影剧院和居民住宅楼中各安置了一枚定时炸弹,幸被及时发现排除。
  1993年6月17日,"东土耳其斯坦民主伊斯兰党"在喀什市地区农机公司办公楼制造爆炸桉,造成大楼坍塌,2人丧生、7人受伤;8月1日该组织又在喀什地区莎车县外贸公司录像厅制造爆炸桉,造成15人受伤;8月19日在和田市文化宫制造爆炸桉,造成6人受伤。
  1993年8月24日,两名"东突"恐怖分子将喀什地区叶城县政协常委、大清真寺主持阿不力孜大毛拉刺成重伤。
  1996年3月22日,2名恐怖分子枪杀阿克苏地区新和县伊协副主席、清真寺副主持阿克木司地克阿吉。
  1996年4月29日凌晨,十余名全副武装的恐怖分子闯入库车县阿拉哈格乡库纳斯村,向全国政协委员、自治区人大代表卡吾力托卡家投掷了2枚炸弹,致卡及其妻重伤,并将卡的弟弟、弟媳、儿子、儿媳杀死;该村村干部加如甫买买提明也被刺成重伤。
  1996年5月12日,"东突"恐怖组织4名恐怖分子在全国伊斯兰教协会常委、新疆政协副主席、喀什伊协主席阿荣汗阿吉和其儿子去艾提尕清真寺做礼拜的途中,对其进行袭击,阿和儿子均致重伤。
  1996年7月,"东土耳其斯坦伊斯兰正义党"策划沙雅县监狱暴动,导致15人死亡。
  1996年8月27日,6名恐怖分子袭击叶城县江格勒斯乡政府,杀死副乡长和值班的警察;随后又闯入该乡一村,杀害3名治安员和1名水管员。
  1997年2月5日至8日,"东突伊斯兰真主党"恐怖组织策划、制造了伊宁骚乱事件,恐怖分子高喊"建立伊斯兰王国"等口号,袭击平民,捣毁商店,烧砸汽车,致使7人死亡,200多人受伤,30多辆车遭毁坏,多间民房被毁。
  1997年2月25日,"东土耳其斯坦民族团结联盟"在乌鲁木齐市2路、10路、44路公共汽车上制造爆炸,造成三辆公共汽车被炸毁,9人丧生、68人重伤。
  1997年3月,境外"东突"恐怖分子开枪袭击中国驻土耳其使馆,冲击中国驻伊斯坦布尔总领馆,焚烧中国总领馆悬挂的国旗。
  1997年3月23日,"东突"恐怖分子闯入阿克苏地区金银川垦区负责人艾买尔江家中,将艾买尔江夫妇两人杀害。
  1997年6月4日,4名"东突"恐怖分子闯入和田地区墨玉县恰其克乡荒地村干部买买提肉孜买买提家,将其杀害。
  1997年7月3日,"东突"恐怖分子闯入阿瓦提县拜什力克乡村干部吐尔地尼牙孜家中,吐夫妇被杀身亡。
  1997年11月6日,"东突"恐怖组织在全国和新疆伊协委员、阿克苏伊协主席、拜城县清真寺主持尤努斯斯迪克大毛拉去清真寺做礼拜的途中,将其枪杀。
  1998年1月27日,"东突"恐怖分子枪杀叶城县政协常委、县大清真寺主持阿不力孜阿吉。
  1998年1月30日至2月18日,"东突解放组织"在喀什市制造了23起系列投毒桉,致4人中毒,其中1人死亡,数以千计的牲畜中毒或死亡。
  1998年2月22日至3月30日,"东突"恐怖组织在喀什地区叶城县连续制造了6起系列爆炸桉,造成3人受伤,天然气输送管道被炸坏引起大火,直接经济损失超过100万元。
  1998年3月5日,境外的"东突"恐怖组织"东突民族中心"用炸弹袭击中国驻土耳其伊斯坦布尔总领馆。
  1998年4月7日,"东突"恐怖组织在叶城县公安局负责人、县政协副主席和喀什地区行署副专员住宅门前等处,连续制造8起爆炸事件,炸伤8人。
  1998年5月23日,"东突解放组织"成员在乌鲁木齐市华都商厦、大西门、河滩路布料批发市场、长征旅社批发市场、红山木材市场、乌鲁木齐旅社、商贸城等繁华场所放置了40多枚化学自燃纵火装置,制造了15起纵火桉,由于及时发现和扑救,才未造成重大危害。
  1999年8月23日,以牙生买买提为首的十余名"东突"恐怖分子闯入喀什地区泽普县波斯喀木乡派出所指导员胡达拜尔迪托乎提家中,将胡和其儿子杀害,然后纵火,致使胡妻被烧成重伤。
  1999年10月11日,3名恐怖分子在和田市棉麻公司棉花收购站棉花堆中安放定时爆炸引燃装置,烧毁棉花约2吨。
  1999年10月24日,"东突"恐怖分子袭击泽普县赛力乡公安派出所,枪杀2人,枪伤2人。派出所10间房屋、1辆吉普车和3辆摩托车被烧毁。
  2000年3月,"东突解放组织"在吉尔吉斯斯坦枪杀了拒绝与其合作的吉尔吉斯斯坦"维吾尔青年联盟"主席尼合买提波萨科夫。
  2000年5月,境外"维吾尔解放组织",为筹集资金,在吉尔吉斯斯坦绑架了一新疆商人,勒索10万美金,并杀害了该商人的侄子,之后又纵火焚烧了比什凯克中国商品市场。5月25日,"东突"恐怖分子袭击了新疆人民政府赴吉尔吉斯斯坦处理纵火、绑架桉的工作组,造成1人死亡、2人受伤。行凶后,恐怖分子潜逃至哈萨克斯坦,并于同年9月,在阿拉木图市杀害了2名调查此桉的哈萨克斯坦警察。
  2001年2月3日,"东突"恐怖分子杀害喀什地区疏附县法院干部买买提江亚库甫。
  2001年8月,"维吾尔圣战组织"使用自动武器袭击新疆库车县公安局,库车县公安局党委书记兼局长陈平牺牲,另有7名公安人员受伤。在瑞士的"东土耳其斯坦信息中心"发言人迪裡夏提宣称此事件的目的,是对此前新疆自治区领导人向香港商人访问团承诺"在新疆投资不会受到民族问题影响"的回应。
  在此期间,"东突"恐怖组织为了培训骨干,还在新疆境内一些偏僻地区建立秘密训练基地。如1990年"伊斯兰改革者党突击队"在叶城县伯西热克乡建立了训练基地,该基地先后举办3期训练班,共培训了60余名恐怖分子,训练内容包括宗教极端主义和恐怖主义理论,爆炸、暗杀等恐怖活动的技能,体能训练等。就是这些经过训练的恐怖分子参与了1991年至1993年在新疆各地的爆炸、暗杀、抢劫等重大恐怖活动。
  1998年2月,境外"东突厥斯坦伊斯兰运动"头目艾山买合苏木派遣数十名恐怖分子入境,在新疆和内地一些偏僻地方建立了10多处训练基地,共对150多人进行了爆炸技术培训。同时按照境外提供的配方,大量购置化学原料,秘密制造炸药和爆炸装置。新疆警方于1998年9月在乌鲁木齐火车北站一仓库裡,一次就缴获制爆化学原料20多种300多箱,总重量达6吨。除了上述比较集中的培训外,还有大量零散的,3至5人一组的小训练点。一些训练点同时也是武器、弹药和爆炸装置的制造窝点。新疆警方在打击恐怖活动过程中,查获了许多地下恐怖训练点和武器弹药制造工场,收缴了大量的手雷、手榴弹、雷管、****、弹药等。
  1999年,境外"东突厥斯坦伊斯兰运动"派遣的恐怖分子在新疆和田地区7个县市建立数十处秘密训练基地和制造爆炸物的据点,制造了大量武器弹药。仅被警方缴获的手雷就有4500多枚,各种枪械98支以及大量制造工具等。
  1999年12月30日,警方在泽普县波斯喀木乡查获一恐怖分子设在地下的制造爆炸物的窝点,缴获一批等制造工具、图纸以及已制成的手雷等。
  2000年2月25日,警方在莎车县卡琼乡三村抓获7名"东突"恐怖分子,并在一恐怖分子家裡的地道缴获手雷38枚,电雷管22枚,爆炸装置18个,炸药17千克,拉火管20多个。
  2001年8月,警方在库车县乌尊乡色根苏盖提村一恐怖分子家中的地道发现制造武器弹药的各种设备,并缴获了61枚爆炸装置。
  境外的"东突"恐怖分子还走私偷运武器入境,以武装境内的"东突"恐怖分子。1998年4月6日,在霍尔果斯口岸海关与边检部门就在羊毛集装箱中查获军用手枪6支、折叠冲锋枪1支、子弹1.9万发、手雷90余枚。据抓获的罪犯供认,他们是受境外"东突国际委员会"和"东突解放组织"的指派,在此前已有过17次偷运武器弹药入境。
  大量血的事实証明,"东突"分裂组织为了达到分裂祖国的目的,所採取的恐怖暴力手段,以极其残忍的手法滥杀无辜,无论从什麽角度看都是名副其实的恐怖组织。
中国政府的态度
  长期以来,特别是20世纪90年代以来,在中国境内外的"东突"分裂组织为实现其建立所谓"东突厥斯坦国"的目的,策划、组织和实施了在中国新疆和有关国家的一系列爆炸、暗杀、纵火、投毒、袭击等恐怖暴力事件,严重危害了中国各族人民群众的生命财产安全和社会稳定,并对有关国家地区的安全与稳定构成了严重威胁。
  中国政府绝不会对"东突"恐怖活动坐视不理。2001年10月11日,中国外交部发言人孙玉玺在新闻发布会上,首次提及"东突"分子的恐怖活动。孙玉玺透露,中国政府已有确凿的証据証明"东突"分子参与了恐怖主义活动,他们与国际恐怖组织相互勾结,在中国境内和境外制造了多起爆炸、暗杀、投毒、绑架和抢劫等暴力恐怖事件,造成大量无辜平民的死伤和财产损失,这些恐怖活动在中国广大民众当中引起了公愤。不仅对中国,而且对整个地区的安全与稳定构成了威胁,中国将同国际社会一道共同反对包括"东突"恐怖势力在内的一切恐怖主义活动,以维护地区和世界的和平与安定。中国政府表示严厉打击恐怖主义活动这一社会公害,不应有双重标准。
  2001年10月19日,欧洲议会不顾中方的多次严正交涉,允许"东突"分子在议会大厦内举行有关"东突"研讨会,公然为其提供活动的场所,中方对此表示强烈不满和愤慨。在国际社会加强反恐怖合作的情况下,"东突"企图改头换面,以人权、民主、维护少数民族权利掩盖其恐怖组织的本质,继续从事分裂中国的活动。无论其手法如何变化,其恐怖组织的性质是改变不了的。
  2001年10月在上海举行的APEC会议上,中方与到会各国就反恐问题达成共识,对"东突"恐怖组织予以谴责。APEC会议结束后,中国根据中美峰会达成的共识与美国开展情报交流,并将为进入阿富汗的美军提供后勤援助。必要时,解放军的特种部队也将对流窜于中阿边境的塔利班及"东突"恐怖分子进行打击。中国和美国的反恐合作,意味着中国将打击"东突"恐怖主义活动纳入到国际反恐斗争大潮之中。这是打击"东突"恐怖分子的历史转机。
  10月24日,据中新社报道,中共新疆维吾尔自治区委书记王乐泉在中共新疆维吾尔自治区第六次代表大会上称,新疆将加大"严打"斗争力度,对民族恐怖势力始终保持"严打高压"态势。对民族分裂主义骨干分子、宗教极端势力为首分子和暴力恐怖犯罪分子进行坚决有力的打击,确保新疆长期稳定和发展。
  10月底,九届全国人大第24次会议讨论通过了国务院提交《制止恐怖主义爆炸的国际公约》和《打击恐怖主义、分裂主义和极端主义上海公约》两项议桉。中国加入国际反恐怖斗争的范围越来越大。由于中国和别国在根除伊斯兰原教旨主义恐怖活动方面有共同的利益,与国际社会合作将是反对"东突"的重要举措,但还要注意国内的综合治理。从1994年到2000年六年间,中国政府已投入430多亿元用于包括新疆在内的民族地区扶贫。这样的方式,是对东突分裂分子最大的打击。
  美国国务院反恐事务协调员泰勒大使2001年12月4日抵达北京,与中国就反恐问题举行了磋商。双方重申,恐怖主义严重威胁着世界和平与发展。国际社会应加强合作,採取综合性手段,共同打击一切形式的恐怖主义,并充分发挥联合国和安理会在此问题上的重要作用。双方一致认为,中美加强在各领域的反恐合作,建立中长期反恐交流与合作机制,符合两国的共同利益,有利于进一步发展中美建设性合作关系,也有助于推动国际反恐合作。
  中国长期以来饱受"东突"恐怖势力的危害,特别是自20世纪90年代以来,境内外一小撮"东突"恐怖势力,为了达到分裂国家的目的,使用恐怖暴力手段进行了一系列破坏活动。他们的所作所为理所当然地遭到了中国各族人民,包括新疆维吾尔族群众的坚决反对。为了保护各民族人民的生命财产安全和共同利益,为了维护中国新疆及其周边地区的稳定,为了维护国家统一、社会稳定和现代化建设的顺利进行,中国对"东突"恐怖势力所从事的暴力恐怖活动坚决依法予以打击。但是我们打击的对象只是极少数策划指挥和参与暴力恐怖事件的骨干分子、刑事犯罪分子,对于那些由于受到蒙骗、参与了"东突"恐怖组织一些活动的大多数人,都採取教育、帮助的态度,欢迎他们改邪归正。打击"东突"恐怖势力不是针对哪个民族、哪个宗教,而是针对暴力恐怖的违法犯罪活动,是为了更好地维护各民族的共同利益,保証正常的宗教活动的进行。这一政策受到了全国人民,包括新疆各族人民的衷心拥护和支持。同时中国政府反对任何形式的恐怖主义,反对在反恐怖问题上实行双重标准。全世界各国人民,不分民族与宗教,不分地域与国别,不分政治和社会制度的差异,充分认识"东突"恐怖势力的本质及其所造成的严重危害,识破"东突"恐怖势力各种假面具,共同打击其恐怖暴力活动,不给"东突"恐怖势力以任何可乘之机。尽管境内外还存在一小撮"东突"恐怖势力,但不可能从根本上影响祖国神圣领土的完整与统一、新疆的社会稳定、民族团结、社会各项事业进步、人民生活不断改善的大好局面。




类别: 无分类 |  评论(0) |  浏览(6933) |  收藏
2007年07月17日 15:55:44

环球邮报:加拿大不欢迎中国投资

此前 鄙人早已说了 加拿大 这个鸟国在意识形态里是最反华的一个鸟国!!!





加拿大不欢迎中国投资,逼走中石油。
  中国国营的中国石油天然气公司13日宣布,撤回对加拿大埃布尔达省油砂矿和西岸港口之间输油管计划的支持,同时还严厉指责加拿大联邦保守党政府不愿吸引中国投资,或把加拿大石油卖到远东市场。

  加拿大联邦工业部长卞聂尔(Maxime Bernier)此前曾提出渥太华将考虑让外国投资规则,可以阻止危及国家安全的外资收购行动,并且不排除专家小组检讨外资收购时,可探讨是否要包括人权作为准则的可能性,他又表示,即将进行的检讨最终不会提出限制或阻止中国投资的建议。分析人士称,此次中石油投资被拒,可能是加拿大以人权限制国外投资的反映。

  中国石油天然气集团公司副总裁宋亦武12日在亚省卡加利市举行的一项投资会议上,指责加拿大政府并未尽力推动这项价值四十亿加元的门户油管计划。该项计划由于加拿大业界支持不足,预定兴建路线还有原住民土地所有权争议,一再拖延。

  宋亦武表示,北京当局认为,计划一再后延后,反映出加拿大官方仍不愿见到中国公司打进加拿大市场,在这种情况下,加拿大仍可由其它国家找到油源,特别是委内瑞拉。

  宋亦武表示,“整个环境并不舒坦,我们想来,却始终未能如愿。”他说,中国也希望能帮助加拿大原油打开新市场,但“加拿大也始终不愿开放市场让中国进入,因此我方无法合作,也不知道还能如何帮忙”。

  门户输油管计划是由总公司设在卡加利的安桥公司推动,预计完工后可把亚省油砂矿所产原油,运至卑诗省太平洋岸口岸出口,每日输运量可达四十万桶。中国石油曾与安桥计划达成原则性协议,门户输油管计划完成后,中国石油承诺购买其中一半输运量。

  不过,该项计划完工日期一改再改,现已由2009年,推迟到2012至2014年之间。宋亦武表示,安桥上个月还促请中国石油扩大参与,但遭拒绝,因为中石油已失去信心。

  宋亦武也指责加拿大石油业者不愿开放让中国进入加拿大国内市场,也始终不愿把更多原油交付这条新输油管,使得市场始终无法达到经济规模。

  尽管如此,中国石油并未因此全面退出加拿大,今年稍早已在埃布尔达省取得十一个油矿租约,并希望最终能拓建一个油砂矿。

  中国五矿集团公司三年前有意收购加拿大Noranda的计划,中国的人权状况曾是外界反对计划所提出的关注之一。渥太华当时曾表示,检讨有关收购时会考虑人权的关注,但计划最终告吹。 
  即将进行的外资收购检讨涉及国企、国家安全,甚至可能包括人权,令外界关注小组会否提出限制或打击中国投资的建议,但卞聂尔表示,小组的目标是分析如何加强本国商界的竞争,不会针对某个国家,相信小组最终的建议,会符合加拿大价值观。
文本来源: 商务部

类别: 无分类 |  评论(0) |  浏览(8783) |  收藏
2007年07月17日 15:49:04

中国曝光“东风-25”战略导弹 或为阻吓美国

中国第二代战略导弹“东风-25”15日在新浪网曝光,据称这是“东风-25”首次曝光。分析认为,中国近期故意让一些新装备曝光,其目的是一方面收阻吓作用,另外也为将曝光的航母让外界有心理准备。   香港《星岛日报》报道,在军事网页登出的两张“东风-25”导弹照片,标明为首次曝光。不过,照片图说在最后加上问号,让人真假难辨。这两张“东风-25”的照片非常清晰,显然不是偷拍,而且其中一张显示两枚导弹已垂直竖立在机动发射车后,做好发射准备。
  “东风-25”是近年在原“东风-21”导弹的基础上改进而成,最近装配解放军二炮部队,其有效射程为3200公里,在中国本土发射可及亚洲大部分地区,包括美军太平洋关岛基地。其采用高能固体火箭推动,弹头舱能够携带三枚分导式核弹头,是目前世界上惟一能够携带多枚弹头的中程导弹。
  中国的第二代战略导弹包括“东风-21”、“东风-25”、“东风-31”、“东风-41”以及“巨浪-2”型,这些导弹全部以机动发射,可带核弹头,准确而且存活系数高。
  由于中国最近频繁有新型装备亮相,新型094“晋级”战略核潜艇早前更被美国卫星拍到,分析人士指出,北京其实是故意让该艇亮相,目的可能是要展示军力,也有可能为更受关注的航空母舰亮相铺路,给予邻国适当的心理准备。
  经过多月的热烈讨论,中国拥有可匹敌美国的核潜艇已是公开的秘密,美国民间人士从普通卫星图片看到这艘“晋”级核潜艇,显示中国不再介意国际社会看到这最新武器,中国这行动可能有两个目的:第一是令“晋”级舰亮相,向世界展示中国海军的实力;第二可能是为更受国际社会关注的中国航母亮相铺路,先把“晋”级核潜艇公诸于世,给予邻国适当的心理准备,以免带来不必要震撼。
  分析认为,解放军目前正在大连市改装“瓦良格”号航空母舰,作为航母试验舰,估计于2008至2009年可投入运作,为试验舰进行的相关测试﹑训练及设备采购已经完成。
  关于中国航母的建造进展,外界至今所知不多,如今试验舰将开始运作,或预示着距离航母建造完成为期不远。

类别: 无分类 |  评论(0) |  浏览(7117) |  收藏
2007年07月17日 15:41:22

79中越之战纪事---我们埋了那越南老头!

79年中越战争是一场牺牲惨烈,极为残酷的战斗,双方都杀红了眼,其残酷不仅仅在于我军与越军的直接战斗中体现,很多还以当时的地理和民众环境有关。当年战斗结束后,我们乡回来了好几位参加过这场战斗的退伍兵,有一个腿部负了伤,学校把他们请来作了战斗报告,由于我们这个学校是全县最偏僻的山乡中学,报告形式并不那么正规,这几位退伍兵的文化素质好象也不太高,他们的报告基本便是信口开河,照实讲,有什么说什么,原来怎么样,就说怎么样,没什么套套,也不会修饰,这倒让我们真正了解了战争的真实情况。如果在今天,恐怕就难听到这样原汁原味的战场报告了。
  具体的战斗过程,记得不大清楚了,那位腿部有点伤的退伍兵是炮兵部队的,他说,我们是打的最远的一支部队,大家都知道,79年中越之战是以攻克谅山为结束标志的,万炮齐发之后,谅山一片废墟,我军获得了战略目标和心理上的基本满足后,便班师回朝,但他的部队在当时我军攻克谅山后,却没有停止攻击,仍然向谅山前方攻击,打过了谅山,大概有十几里左右。那时的越军已经如惊弓之鸟,无心应战,仓惶撤退,他们炮兵部队追着他们的屁股猛国轰!
  “越南人最怕我们们的炮兵了,战斗到后期,我们的部队士气大涨,越军闻风丧胆,尤其是我们的炮兵,在谅山可让他们一辈子都忘不了了,所有的炮弹都打出去了,有些炮弹还是炮击金门时剩下的,再不打就白浪费了;有些越南兵不是给我们炸死的,而是给我们炮火的硝烟熏死的,这些熏死的起南兵的脸都与打死的不一样,憋成紫红色。眼球暴突,看见我们炮兵,就象看见了天神,魂都没了,还敢打仗?”退伍的炮兵这样对我们说。
  他说的情况经后来的资料证实,确有其事,我们的部队确实打过了谅山,攻克谅山后,尽管当时已经下达了撤退命令,但许和尚很不情愿,认为他的部队在战争初期伤亡过大,现在刚打的顺手,就让撤,不干,压着命令,偷偷让部队冲过谅山,继续向南攻击,吓唬他们,看他们怎么样,这时河内就慌了,外国大使全部先行撤退,部队民众已经准备迎战了.......
  “战斗是很残酷的,越南人基本上的全民皆兵,开始我们对他们的老百姓很好,可是,后来,我们的人经常给他们的民兵老百姓打黑枪,死伤了一些人,可把我们打火了,到了战争后期,我们完全是实行三光政策,看见越南人就开火,管他是谁,看见有用的东西就运回国内,带不走的不是烧掉就是炸掉,回国的路上,看见越南人的鸡窝都要扔三个手榴弹,因为弹药充足,不打掉,路上也沉得累。上级也支持。”
  “有一天,我们的炮兵部队和一支坦克部队,停在一个小村子里,等待命令,这里的人基本都跑光了,只有几个老人家和小孩子,我们看见他们没什么战斗力,也就不管他们,一个上竿都没事,可是到下午时,天快黑了的时候,一个六十多岁的老头和一个十岁左右的女孩子竟然要炸我们的坦克,那个小女孩子用裙子包着一枚火箭弹,去炸坦克,没炸成就被发现了,要是炸成了,起码得死好多人,结果这个女孩子被坦克兵们撕成了二三块,扔在路边;那个老家伙更阴险,柱着拐杖,可背上的背篓里却装有炸药,也不知那里搞来的,要来炸我们的弹药车,也给我们抓住了;我们就挖了一个大坑,我们把他放入坑里,他一直骂人,就用剌刀割开他的嘴,剌烂了他的舌头,这老家伙被我们活埋到一半时,就不会骂了,再把土填到他胸口时,他就基本不会呼吸了,张着大嘴,拼命喘气,呼吸困难,就这样,我们把他活埋了。当时的环境就这样,其实很多老百姓是假的,都是他们的特工队,但我们不管这些了,先下手为强。打仗就这样。”
  当时,我还是了解一些兵器知识的,对他们讲的十岁女孩子用火箭弹炸坦克的事想不通,火箭弹不小,一般发射要发射筒,光有弹没有筒有个屁用,会不会是这些退伍兵说错了?这个疑团直到今年,伊位克爆发从战事报道中才被解开,我从新闻中得知,伊拉克一些自杀队员也有只用火箭弹击毁美国装甲车辆的,他们不用发射筒,用一种简陋的手动发射装置就可在近距离内击发40火箭弹,当然,这种击发对射手来说要有必死的决心。伊拉克人懂这个技术,打了几十仗的越南人当然肯定也懂,十岁女孩子裙包火箭弹炸坦克的事看来是完全真实的。
  我一直为被越南人砍去四肢放回国的我军女战士伤心,本地的军医院就有几位,听了这些战士的真实报告,心里稍微平衡了些:我们也够狠的了!实际上,双方都非常的残酷,这就是东方人的战争,但愿这样的战争不再发生。但如果战争继续打响,我们仍然要如此的残酷,对敌人的的仁义,就是对自己人的残忍。我们要多反省了,不要老是做傻事:打起仗来,只有敌人和战友,其余的中间状态的人是不可信任的。

类别: 无分类 |  评论(0) |  浏览(6710) |  收藏
2007年07月17日 15:01:12

笔记本电脑检测方法

  现如今,越来越多的人都把选购电脑的目光瞄向了一向被认为是商务人士专属物的笔记本电脑。在经历了长时间的购买咨询并最终定下型号之后,接下来要做的便是带上Money去找代理商了。  
  走在电脑市场里,看着这么多的代理商的店铺,是不是又晕了?究竟如何才能挑选一部质量过硬的笔记本电脑,而且要怎么样才能不会被JS骗,被JS宰呢?下面笔者就对这个问题进行一些介绍。  
  另外,在走出家门之前还要准备一些常用的测试软件和配件,以便在验机的时候使用。那么要准备哪些呢?别急,我将会在以下的相关段落中对它们加以介绍。  
  代理的选择  
  挑选一个好的代理商尤为重要,因为代理商的好坏直接关系到了它的信誉,货源以及价格等问题。好的代理商可以做到信誉高,货源足以及价格相对便宜,并且这样的代理商还会配备一些技术人员来解答顾客在技术方面的问题,这样在很大程度上就降低了被骗与被宰的可能。在去购买之前可以到所选品牌的官方网站查询代理商的相关信息,也可以咨询厂家的服务热线或者周围的朋友。总之要做到心知肚明,避免进错门。厂家对代理商也分为几个不同的级别,总之代理商的级别越高所代表的经营规模也就越大,并且最高级代理商的货源直接来自厂家,比如TOSHIBA的金牌代理,IBM的五星级代理等等,而级别低的代理商往往是从相对高一层的代理商那里进货。这样在价格方面,代理级别越高价格优惠的幅度也就会越大。  
  机器的挑选  
  找好了代理商,那么就可以放心的走进去了。感觉怎么样,是不是明显比一般的小店要亮堂许多。你可以先和销售人员简单的攀谈一下,了解一些诸如货源、销量、返修率等信息,从一个代理商的角度来对你所选机器有一个更新的把握。当然这一步也可以完全省掉。  
  好了,Let s go on……,下面的环节尤为重要了,这直接关系到你是否能买到一部真正称心如意的笔记本电脑  
  1、包装  
  当你提出购机要求后,销售人员就会为你提货了。我们的验机工作也就从此开始了……新机的包装箱一般都是没有打封过的,外表平整洁净,销售人员会当着你的面现场打封。假如拿出来一个已经打了封的机器,你可就要多加小心了,并且完全有权利请他调换一个。  
  打开包装箱以后,你还需要仔细的查看一下机器以及配件的塑料外套是否崭新且完整,是否有撕开过的痕迹。  
  如果一切完好,这个时候你可以先窃喜一下,但千万不要放松,因为现在的封装技术实在是太发达了,重新封包装可谓是轻而易举。  
  2、配件  
  这是我们打开包装以后第二步要进行检查的环节,看看随机的软件光盘以及说明书是否齐全、有无残损。是否有装箱清单,如果没有的话可以看一看机器使用说明书的后面是否标明了随机的标准配备组件,这样可以避免一些小的配件被代理商克扣。不过有时候厂家或代理商临时对某个型号进行促销活动,会赠送一些U盘、串并口转接线等小配件,但是并没有标注在组件清单上。这时候就需要你在购机之前对该型号的销售广告以及其他代理商的宣传广告有多多加以了解了。  
  3、机器外观  
  将机器从塑料套中取出来,小心呦,可别磕着碰着,否则代理商要找你麻烦了。先别忙着通电,仔细的看一下再说。这个看可不是随便看看,这里面包括着下面几个方面:  
  A、将机器底部铭牌,包装箱,保修单上的机器序列号仔细核对,看看是否一致(开机之后还可以再次与Bios中显示的机器序列号进行核对,这个序列号只针对机器编号。电池,软驱等配件的序列号会有所不同)  
  B、机身和LCD显示屏上是否有划痕(有时候由于包装人员的不小心,可能就会使机器在出厂之前就有了伤痕)  
  C、机器是否崭新,机器的接缝处以及LCD屏幕表面是否有灰尘  
  D、CPU风扇上是否有灰尘(B,C两点主要判断机器是否为展机,长时间在外放置的展机是不可能一尘不染的)
笔记本验机的方方面面(新手必看)
    E、键盘的键帽是否有油亮的痕迹(人手指难免不会分泌油脂,长时间使用键盘自然会留下痕迹)  
 F、电池与机器插槽的接触部分以及电池的金属片上是否有划痕迹(这样可以判断电池是否是被人是用过的二手)  
  4、通电检测  
  OK,上面的工作做完了就可以通电了,看到LCD一亮是不是有点心动呢,可别乐晕了啊,接下来还有活要干那!新机器初次开机需要经过一个OEM操作系统的用户注册环节才能正式进入系统,如果你碰上一个一下子就进入系统的机器,那么它肯定是被使用过的了。  
  A、LCD显示屏  
  LCD显示屏的光源是来自于背灯管,所以首先要查看一下显示屏的亮度是否均匀,有没有不同部分明显存在亮度差的现象。不过在显示屏的边角会出现稍暗的现象,这是正常的,不必担心。至此我们第一个需要准备的软件就可以登场了——Nokia Monitor Test。这是Nokia发布的显示器的测试程序,这下你不会认为人家Nokia除了会造通讯设备就不会干别的了吧!这个小程序不需要安装就可以运行了,而且使用简单,主要通过颜色的变换显示来检测显示器的显示对比度、文字锐利度、色温、摩尔偏差等各项指标,这么个小家伙甚至还有音箱的左右声道测试功能。  
  其实我们用这个软件主要是来检测LCD显示屏的一个特有产物??坏点,这是由于液晶颗粒失效造成的,它是一个很明亮的点,永远不会消失;而且有的坏点只会在不同的颜色下才能看出来。另外也可以通过将Windows桌面背景更改成不同的纯色来查看。一般厂家对LCD坏点数量规定在6-8个以下就属正常范围,所以你一定要看仔细,如果坏点数量属正常范围之内,在代理商处还可以跟销售人员协商更换,但如果拿回家了就没换的可能了。不过无论怎样,都要靠你的火眼晶晶了!  
  B、键盘和鼠标  
  首先看一看键帽上的标记是否脱色;然后打开写字板,亲手试一试每一个键是否有停顿不灵的问题,按键敲击的力量感是否合适,是否有发涩的感觉;最后可以自己打上一小段,感受一下键盘的整体手感,包括舒适度,键程长短等等。  
  笔记本电脑的鼠标的检查没有太多的技巧,主要是亲自动手感受一下接触感,定位以及灵敏度。并且按动一下鼠标按键看看有没有接触不好或者失灵的现象。  
  C、电池  
  新机的电池是不可能满电量的,厂商一般会预留一定的电量以供验机的时候使用。像IBM,SONY的笔记本电脑可以通过他们特有的电源管理程序查看到电池的充电次数。假若电池是满电或者充电次数在3次以上,你也要当心了。(电池充电次数的查看目前仅限于上述两个品牌)  
  D、中央处理器  
  虽然笔记本的CPU一般是直接焊接在主板上的,被偷梁换柱的可能性几乎没有。不过为了做到放心,还是可以通过INTEL官方的测试程序Intel Processor Frequency ID Utility来检测,它可以对CPU的实际频率,总线频率等信息做一个全面的检测。在这里我们还需要注意一个问题,那就是CPU是否为移动型,它要比台式CPU的功耗和发热量小,而且在价格上要高很多。有的代理商会将搭载台式机CPU的笔记本电脑说成移动型CPU卖给你。这点你可以通过分别使用电池和电源时CPU的频率是否会发生变化来判断。不过有一个特例,那就是移动赛扬处理器的频率是不会发生变化的,但是可以通过测试结果显示的CPU封装是否为uFCPGA来判断。  
  E、硬盘和内存  
  对于硬盘可以运行一些大的程序来听听是否有很大的噪音,并且利用DOS中的Scandisk程序对硬盘表面作一个检测来判断是否有坏道,以及如果在检测中出现硬盘转速突然改变,有异响则说明硬盘存在一定的问题。  
  对于内存的检测可以通过一个名叫Docmemory的程序来完成,运行之后会提示制作一张启动磁盘(当然这步你要在家里完成了,然后就带着那张磁盘就可以了),用它启动机器后会自动进入测试界面,选择快速测试或者全面测试对内存的各项指标进行检测,如果所有的测试项目都Pass就说明一切OK了。(内存越大,测试时间相应就会越长,因此不是每个代理商都会同意你进行这么长时间的测试的。)  
3 笔记本验机的方方面面(新手必看)
    F、光驱和软驱  
  首先还是要看一看光驱托盘以及光头上是否一尘不染,是否崭新。然后用几张不同的CD,数据光盘来试一试它的读盘性能,看看是否有挑盘的现象,以及读取是否正常。还可以通过一个叫Nero CD/DVDspeed的软件来测试一下光驱的转速,寻道时间等信息。  
  对于软驱的检测比较简单,用几张不同的软盘来测试一下它的读写能力,并且听听在读盘的时候是否会出现异响。  
  G、多媒体  
  这方面我们主要是对喇叭的检查,听听它没有杂音,异响。不过既然叫喇叭,音质就不要太苛求了。如果有兴趣的话可以使用一个名叫High/Low Test来对它进行一个简单的测试,这是个小巧的音箱效果测试软件。主要测试音箱的高低音效果,它提供了对20kHz~13kHz的高频信号和20Hz~200Hz的低频信号的测试,每段信号为4秒。  
  在使用“高频测试程序”时要注意的是,有部分人对这个频段的信号是不敏感的,所以不必过于强求;在测试太低的频率信号的时候,如果使用的是小型喇叭的话,可能会出现“只见低音动,不闻低音来”的现象。较好的喇叭在80或者120Hz时能让你听得到,当然如果在20~60Hz都能让你听得到那就更好啦。  
  H、端口  
  如果有条件的话,可以尽量的带一些小配件来测试一下那些常用的端口,或者从代理商这里就地取材,比如U盘,红外线手机等等了。但是千万不要为了测试端口把全部家当都背来呦。这个工作也完全可以回家再做,只要出现问题,代理商一般都是会给更换机器的。  
  I、其他  
  在这里推荐一个名为AIDA的程序,它可以查看到机器那各种硬件的详细信息,比如显卡,声卡,modem等的品牌型号等等,这部分出问题的可能性非常小。所以和产品宣传中提供的数据进行一个简单的对比就可以了。  
  J、最后工作  
  由于在挑机的时候销售人员是不会让你在机器里安装一些程序的,所以诸如3D多媒体性能,整机性能的测试就无法完成了,因为这些测试程序都是需要安装才可以使用的。不过笔者认为这几种测试对于新机购买时的测试是没有任何意义的,毕竟销售人员是不会在乎你测试出来的性能指标的,因为那和质量毫无关系。所以这些工作就自己回家慢慢做吧,无论测试分数高或低,自己看看就足矣了。测试程序包括3D性能测试程序3DMark,整机性能测试程序Sisoft Sandra和PCMark等。  
  经过上述的几个步骤之后,购机检测基本就可以完成了。接下来你需要做的就是反复的启动几次机器并且运行一些程序来看一看机器的稳定性,是否会出现死机和失去响应的现象。  
  另外在交钱之前尽可能的和销售人员协商是否可以赠送一些小配件,比如外接鼠标什么的,如果同意最好,不要白不要啦。以及看看能不能有更多优惠的可能,能省则省嘛!  
  接下来该做什么呢?快去交钱吧,可千万别心疼啊!  
水货笔记本验机  
水货笔记本选购相对过去来说并不困难,如今的笔记本市场经过几年的大浪掏沙已经规范很多,像过去那些把水货当行货卖等等欺骗消费者的行为已经很少看见,水货市场也同样好了许多,大部分水货经销商已经不从事那些传统意义上JS的行为了,而且售后方面一般都能得到良好的保障,但是不排除有个别*商欺骗消费者,我们在选购水货笔记本时要尽量挑那些大的经销商,最好先到各大论坛上多打听打听,相信论坛上的高手会给你们很大的帮助的。  
当然,我们验机时也要注意自己购买的水货笔记本是不是翻修货,主要看一下机身上的序列号,包装箱、正品质保书(COA)和机身底部铭牌这三处的序列号和主板BIOS是否一致,因为一般水货不存在刷号现象,所以最好在厂商的官方网站上通过输入机器序列号和正品证书编号(COA)查询它的配置是否和经销商所说的一致就可以了,现在在笔记本机器本身上做手脚的经销商少了,但是经常对一些配件如:电源适配器,电池,鼠标和笔记本皮包之类的东西做手脚还是比较多,这些原装配件的利润都不低,购买时一定要仔细鉴别比较。包和软件什么的是小问题,可是电源适配器和电池对笔记本的实际使用有巨大影响,一定要挑好。其他验机步骤和行货一样,最好还是用U盘带些检测机器硬件配置的软件去,许多文章都有这方面的内容,尽量挑几个没介绍过的几款软件推荐一下:
笔记本验机的方方面面(新手必看)  
①AIDA32 3.94.2 Preview  
AIDA 是一个测试软硬件系统信息的工具,它可以详细的显示出PC每一个方面的信息,支持上千种(3400+)主板,支持上百种(360+)显卡,支持对并口/串口/USB这些PNP设备的检测,支持对各式各样的处理器的侦测。AIDA是个显示系统信息、测试系统性能的工具,十分好用。  
②CPU-Z 1.22  
这是老牌验机软件了,主要检测CPU信息的软件,这些信息包括:CPU 名称、厂商;内核进程;内部和外部时钟;局部时钟监测等。CPU-Z是一个完全免费的CPU诊断软件,v1.12版本新增了对VIA KT266(A), Apollo Pro 266, P4X266(A)等主板芯片组的支持。主要功能有鉴定处理器的类别及名称。  
探测CPU的核心频率以及倍频指数。探测处理器的核心电压。超频可能性探测(指出CPU是否被超过频,不过并一定完全正确)。探测处理器所支持的指令集。探测处理器一、二级缓存信息,包括缓存位置、大小、速度等。探测主板部分信息,包括BIOS种类、芯片组类型、内存容量、AGP接口信息等。  
③DisplayX-显示器测试程序 1.0  
DisplayX是一个显示器的测试工具,尤其适合测试液晶屏,它可以帮你评测显示器的显示能力,尤其适合于LCD测试。DisplayX显示器测试工具可以运行在win9X/NT/2K/XP系列操作系统中。特点:查找LCD坏点;检查LCD的响应时间;屏幕基本测试。  
④HDInfo 1.0  
本软件可以读出硬盘的生产厂家,型号和序列号还有主板的出厂时期,你可以看看有没有买到假货。这里指的序列号不是格式化后产生的序列号,切勿混淆概念,这里指的序列号是在硬盘出厂时由厂家固化在硬盘控制芯片内的,是不可以改变的。而且每块硬盘都不同。  
⑤PassMark KeyboardTest 2.2 Build 1008  
一个小巧的检测键盘的软件,有了它你可以用最快的时间来检验你键盘上的键位是否好用。以根据软件测试的参数来辨别键盘的优劣,不过在笔记本上使用时有时会失灵。  
⑥AIDA16 2.10 配合 中文多功能DOS启动U盘 1.0  
AIDA16一个测试软硬件系统信息的工具,它可以详细的显示出PC每一个方面的信息。AIDA16和AIDA32不同的地方就在于它是运行在DOS操作系统下的,它拥有高达47页和超过26000条的数据库记录。它可以检测你的CPU、主板、硬盘和其他驱动器的信息,新版本增加了对64位AMD处理器的支持.这款软件最大的优点是可以在DOS系统下操作,有时候水货笔记本只有DOS系统没有装WIN等操作系统,这时AIDA16就能显示出他的优势了,如果个别水货商利用只有DOS来敷衍我们,马上拿出AIDA16试试吧。  
因为现在笔记本一般没有软区,要使用DOS下的验机软件一般很困难,中文多功能DOS启动U盘 1.0 的出现就解决了这个问题,以上两个软件配合使用就可以在DOS下查看笔记本的信息了,不过现在在DOS下使用的验机软件十分稀少,可以找的到的基本上没法用于笔记本电脑,目前只发现了AIDA16 2.10+比较不错,好在现在在DOS下验机的情况也很少遇到,不过有备无患嘛(说实话,如果真有问题的话基本上水货经销商是不会让你随便软件验机的,这种情况直接走人换一家好了)。  
最后要特别注意的是要经销商给你做好系统,并且一定要经销商做好恢复盘,否则将来有需要时自己重新做系统时会比较麻烦(尤其日系本本),毕竟大部分消费者水平都并不是很高,系统恢复盘还是很有用的,还有就是水货价格各地也多少有点不同,最好多走几家,多问问了解情况的朋友。  
水货笔记本的售后服务 水货笔记本售后是最大的软肋,虽然水货本本的质量不错,但是出了毛病还真不好办,根据我国的“三包规定”,我国的商品售后按照“谁销售谁负责”的服务原则,因此,销售“水货”的经销商有义务为产品的售后负责。所以即使是购买水货笔记本也不要放弃自己的售后服务,即使是水货本本,如果经销商不进行售后服务也可以告他。  
5 笔记本验机的方方面面(新手必看)
测试软件下载:  
 
WCPUID:  
http://dl.pconline.com.cn/html/1/4/dlid=44&dltypeid=1&pn=0&.html  
3DMark 2003:  
http://dl.pconline.com.cn/html/1/6/dlid=36&dltypeid=1&pn=0&.html  
PCMark 2004:  
http://dl.pconline.com.cn/html/1/9/dlid=6939&dltypeid=1&pn=0&.html  
SiSoftware Sandra  
http://dl.pconline.com.cn/html/1/2/dlid=42&dltypeid=1&pn=0&.html  
3DMark2001  
http://file.mydrivers.com/tools/tweak/3DMark2001SE.exe  
PCMark2002  
http://file.mydrivers.com/tools/tweak/PCMark2002.exe  
 
综合列表
http://dlc.pconline.com.cn/list.jsp?dltypeid=1&kindid=1003
 
全面测试内存的软件
 
Sisoftware
ScienceMark
Cachemen
aida32
都可以用!~
 
外语的。比较全
http://www.passmark.com/download/index.htm
 
驱动之家
http://www.mydrivers.com/tools/dir0/d279.htm  
笔记本电脑测试软件 由于笔记本电脑相对于台式机来讲,结构紧凑复杂,不像台式机那样易于拆解和检验,而且笔记本电脑相对来说还是高价值品,很少有用户敢随便乱拆,这无疑给用户的检验带来了难度。所幸的是现在有一系列的软件可以帮助测试笔记本电脑,这些软件的来源主要包括两类:一类是笔记本电脑生产厂家或者配件厂商为了检验自己的产品所使用的商用专业软件,比如IBM的硬盘、电池检测工具;另一类是共享类的软件,多为笔记本电脑使用者或者爱好者开发的工具,比如测试音箱用的High/Low-test。今天,我将针对笔记本电脑的关键部件,介绍一些经常遇到的问题和与之相关的常用测试软件。 CPU 辨真伪
  
  [常见问题]
  
  在购买笔记本电脑时,我们面临的主要问题是检验笔记本电脑是否使用了专用的移动型CPU,移动型CPU比台式机CPU具有更小发热量,利于系统稳定性。这里有一点需要注意,由于主板方面的问题,我们从“我的电脑”的属性中看到的信息并不一定是正确的。
1.cpuz.exe
  
  此程序可以实现对Intel CPU 频率的测定,从Intel网站上就可以拉下来,它可以测试Pentium、PII、PIII的处理器频率和总线频率,包括出厂频率和目前使用的频率,其中Intel Processor Frequency ID Utility用来鉴别你的Intel处理器型号以及关键的性能数据。
  
  这是一个监视 CPU信息的软件,它检测的信息包括:CPU 名称、厂商、内核进程、内部和外部时钟、局部时钟等。这个软件可以用于检测非Intel CPU。
  
  此外,芯片和主板的检测还将在最后的综合性能检测工具中提到。
  
  显示屏 找坏点
  
  [常见问题]
  
  在LCD方面,我们面临的最关键的问题就是看是否有坏点,也就是失效点,失效的像素表现为黑色(不透明)、白色(透明)或者固定于某种色上面,现在质量较好的厂家已经承诺“无坏点”。其次,我们还可以看一下LCD的显示效果,如文字锐利度、对比度等。
  
  [测试软件]
  
  Ntest.exe
  
  这个软件竟然是NOKIA的。运行这个软件后,可以让屏幕全屏切换不同的纯色,这样就可以很容易地把坏点辨认出来。此外这个软件还可以通过不同显示模式的演示来评测屏幕的显示对比度、文字锐利度、色温、摩尔偏差等各项专业指标,这个软件甚至还有音箱的左右声道测试功能,这么多功能相对于它578KB的个头,真是令人爱不释手。
  
  其实如果只是找坏点的话,也可以尝试如下简单方法:在Windows下设置不同的单背景颜色,看颜色是否发花、有无严重划伤,检查失效点的多少、位置等。也可以用“画板”程序,或者“记事本”程序,全屏后看字符串“mMWw”的显示,特别是边缘和四角的效果。   电池 测容量
  
  [常见问题]
  
  电池对于笔记本电脑来讲是非常重要的,而且电池属于消耗品,一般能够稳定工作的时间在一年左右,其后待机时间就会大大减少。所以检测的重点就是看是否是原配新电池。
6 笔记本验机的方方面面(新手必看)
 [测试软件]
 bat_bar、batterytest、BatteryMon
  
这几个软件都能显示出笔记本电脑的电池还能用多长时间,电量剩余的百分比。BatteryMon还可以通过直观的图表即时表示。
  
  由于产品在出厂前一般都会经过测试,所以电池中存有残余电量,此时测到的电量无法准确地显示电池的充电能力,必须要等到完全充电后才能客观看到电池的容量,一般新的笔记本电脑的电池待机时间都应该在三小时左右。
  
  此外某些品牌的笔记本电脑内置的监测程序可以统计充电次数,利用这种检测程序,就能更方便地检测了。
  
  硬盘内存 抓隐患
  
  [常见问题]
  
  对于新的笔记本电脑来讲,硬盘和内存不会有太大的问题,我们主要注意的应是其存在的一些隐患,如损坏扇区、兼容性等问题。对于二手笔记本,由于使用寿命的限制,这两个问题就更加突出了。
  
  [测试软件]
  
  1.DOCMEMORY
  
  这是一个获世界权威ZDnet四星级评定的软件,它具有先进的内存测试及分析功能,用户无需拆卸内存,便可通过该软件自动测试SIMM或DIMM内存及JEDEC标准的内存条中的故障,它还能检测出内存的大小、速度、数量及CPU种类;本软件具有老化测试功能,PC上95%由内存引起的故障均可由此软件捕捉到。测试程序包括MATS、MARCHB+、MARCHC-及CHECKERBOARD等。全部过程都可由鼠标操作,简单而迅速。
  
  2.SCANDISK、DM、Norton Utilities中的Norton Disk Doctor
  
  在硬盘测试软件中,SCANDISK是最方便的(DOS自带),但检测不完全,在其运行通过后可用DM、Norton再扫描一下。DM用时较长,Norton费时较短。扫描过程一定要顺利匀速,如果哪个簇区用时过长或者出现硬盘转速改变频繁、出现异常声音,说明该簇区一定有问题,就算通过也不能要。
    
  多媒体 看效果
  
  [常见问题]
  
  对于多媒体,其实主要是性能的评定。此外,一般笔记本电脑都有内置音箱,其质量的好坏也决定了笔记本电脑的音响效果。   [测试软件]
  
  1.3DMark 2000/2001
  
  这是很著名的分析、测试并报告电脑3D表现效果的工具,包括图片品质、贴图速度等重要的参考数据。其实数据不是最重要的,但是从测试过程中的DEMO效果你可以对自己的笔记本电脑多媒体性能有个感性的认识,而且其结果是机器的显示模块和整体性能的综合结果。
  
  2.High/Lowtest
  
  这是个小巧的音箱效果测试软件。主要测试音箱的高低音效果,它提供了对20kHz~13kHz的高频信号和20Hz~200Hz的低频信号的测试,每段信号为4秒。
  
  在使用“高频测试程序”时要注意的是,有部分人对这个频段的信号是不敏感的,所以不必过于强求;在测试太低的频率信号的时候,如果使用的是小型喇叭的话,可能会出现“只见低音动,不闻低音来”的现象。较好的喇叭在80或者120Hz时能让你听得到,当然如果在20~60Hz都能让你听得到那就更好啦

类别: 无分类 |  评论(0) |  浏览(7815) |  收藏
2007年07月17日 14:57:45

将电脑调整到最佳状态就几招

开机引导原来也有学问的
每次开机引导系统时,启动过程是不是缓慢如蜗牛?每次启动QQ等大程序,系统会不会骤然迟纯下来?电脑使用一段时间后,硬盘空间慢慢被无视吞噬?网上下载的美妙音乐电影,是不是只想收藏精彩部分或作为个性论坛签名?本期专题将一步一步指导你解决这些棘手问题
第一部分:开机引导原来也有学问的
每天早上打开电脑,是不是觉得自己的机器总是比别人的慢一拍?事实上,我们完全可以对电脑进行优化,而且不需要花一分钱,就可以给电脑全面提速!
1.优先从硬盘启动
有不少人忽视了电脑中的设备的启动顺序,有不少人默认会从光驱启动,这样在启动时就会读取光驱,如果光驱中有光盘将会延迟你的开机。就算没有光盘,也会让系统启动时读取一下光驱,对于光驱的寿命没有好处。因此,我们有必要将其关闭。
按下Del键进入BIOS设置程序,选择BIOS Features Setup菜单,然后按下回车键,进入参数设置选项界面,在这个界面中找到并选中选项Boot Sequence,然后按下Page Down键或者Page Up键,选择CDROM,C,A设置系统优先从C盘启动,最后连接按下Esc键退回到根菜单中并选择保存菜单或直接按下F10键保存设置即可。
如果你使用的是Phoneix 的BIOS,则在开机时按下F2键,进入BIOS设置后,选择Boot选项,然后找到HardDrive项,连续按下“+”号键,使其调到最前即可保证机器优先从硬盘启动。
2.启用Quick Boot
多数的电脑BIOS中有一项Quick Boot项,在“Advanced BIOS Features(BIOS高级选项)”下,将其设置为Enable,这样BIOS在每次启动时都不会对硬件进行检测,可以大大加快系统启动速度。
3.屏蔽掉不必要的设备
尽管现在的并口和串口已经不再流行,但有不少主板上仍有这些接口。这时,我们完全可以将其在BIOS中屏蔽掉,这样也可以加快系统的启动速度。进入 BIOS,然后选择“PNP,PCI&ONBOARD I/O”项,选中其下的Onboard Serial Port1后,按下PageUp或PageDown键,将它设置为Disable(禁止)状态即可关掉串口,按下F10

类别: 无分类 |  评论(0) |  浏览(7024) |  收藏
2007年07月16日 21:46:01

女人報仇,八年不晚

女人報仇,八年不晚

结婚后三年,娟发现丈夫松清有外遇,

究竟什么时候开始的,她却不能确定,

他穿得比实际年龄年轻的衬衫,

听他骗她晚上要陪老板应酬,

她知道他是要陪另一个女人。

娟表面不动声色,心里却暗暗恨着,

这恨一日比一日深,找不到宣泄的管道,

不知道是有意或无意,娟的菜愈做愈咸,

原本不用猪油炒菜的她,以猪油较香为理由,

开始改用猪油,松清偶尔在家吃饭,

对娟的手艺赞不绝口,

其实他的口味本来就重,

过去娟为了他的血压着想,

每道菜都做得清清淡淡,以前做砂锅狮子头,

只用瘦肉,现在却加一半的肥肉,

狮子头炸出来有弹性又滑嫩,

松清的肚子却一天比一天凸出,

像是娟藏在心里的恨会从松清的肚皮里显现出来。

娟看着松清的动作变的迟缓,

太多的盐使他开始掉头发,

她的心里得到一种报复的快感,

身上堆了大块肥肉,头顶却逐渐稀疏的松清,

在情妇的床上恐怕是十分的狼狈吧!

以前,每个难眠的夜晚,

娟想到松清可能正和别的女人卿卿我我,

她的心就纠一起,现在,

在她脑海中浮现的画面,

却是令她脸上出现幸灾乐祸的笑意,

肥硕的肚子和光秃秃的头顶,

完全引不起女人的性欲。

松清一点都不知道娟的心思,

对于娟提议中午帮他准备饭盒,

因为他至少有一半的晚上是不能回家吃饭的,

他也欣然同意了,于是早餐培根,

点心鹅肝酱,

午餐红烧蹄膀,猪心,炸虾,

娟绞尽脑汁,而松清完全不疑有它。

终于,在娟每日喂给脂肪,盐的催化下,

松清的健康出了状况,他还来不及警觉,
一次XingAi后发作的心脏病,

已让他昏厥在情妇的床上,

但是他的丧礼仍是在慧娟的主持下进行,

没有人知道,娟为松清保了高额的寿险,

她的报复比别人缓慢,

花了八年的时间才完成,但是却也十分彻底。

娟听说,松清的情妇受到很大的刺激,

因为眼睁睁看着一个男人在自己眼前死去,

她先后找了算命师,风水师和心理医生,

他们的理论不同,但收费都很高昂,

花掉了她所有的积蓄,

依然不能平复她心中的阴影。

娟已经不恨他们了,

才三十四岁的她突然发现,

自己也可以拥有一个新的人生,

健康而且富有。

这故事告诉我们
...................................................

    当你老婆煮的菜突然变得很好吃的时候.....你就要小心了

类别: 无分类 |  评论(0) |  浏览(7415) |  收藏
2007年07月16日 21:41:18

SOCK编程基础

什么是 socket?
  你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义。现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式。什么?你也许听到一些Unix高手(hacker)这样说过:“呀,Unix中的一切就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件或者什么其它的东西。Unix 中所有的东西就是文件!所以,你想和Internet上别的程序通讯的时候,你将要使用到文件描述符。你必须理解刚才的话。现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢?”,这个问题无论如何我都要回答:你利用系统调用 socket(),它返回套接字描述符 (socket descriptor),然后你再通过它来进行send() 和 recv()调用。“但是...”,你可能有很大的疑惑,“如果它是个文件描述符,那么为什 么不用一般调用read()和write()来进行套接字通讯?”简单的答案是:“你可以使用!”。详细的答案是:“你可以,但是使用send()和recv()让你更好的控制数据传输。”存在这样一个情况:在我们的世界上,有很多种套接字。有DARPA Internet 地址 (Internet 套接字),本地节点的路径名 (Unix套接字),CCITT X.25地址 (你可以将X.25 套接字完全忽略)。也许在你的Unix 机器上还有其它的。我们在这里只讲第一种:Internet 套接字。
--------------------------------------------------------------------------------
Internet 套接字的两种类型
  什么意思?有两种类型的Internet 套接字?是的。不,我在撒谎。其实还有很多,但是我可不想吓着你。我们这里只讲两种。除了这些, 我打算另外介绍的 "Raw Sockets" 也是非常强大的,很值得查阅。
那么这两种类型是什么呢?一种是"Stream Sockets"(流格式),另外一种是"Datagram Sockets"(数据包格式)。我们以后谈到它们的时候也会用到 "SOCK_STREAM" 和 "SOCK_DGRAM"。数据报套接字有时也叫“无连接套接字”(如果你确实要连接的时候可以用connect()。) 流式套接字是可靠的双向通讯的数据流。如果你向套接字按顺序输出“1,2”,那么它们将按顺序“1,2”到达另一边。它们是无错误的传递的,有自己的错误控制,在此不讨论。
有什么在使用流式套接字?你可能听说过 telnet,不是吗?它就使用流式套接字。你需要你所输入的字符按顺序到达,不是吗?同样,WWW浏览器使用的 HTTP 协议也使用它们来下载页面。实际上,当你通过端口80 telnet 到一个 WWW 站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。为什么流式套接字可以达到高质量的数据传输?这是因为它使用了“传输控制协议 (The Transmission Control Protocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据按顺序到达并且没有错
误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指“Internet 协议”(请参考 RFC-791。) IP 只是处理 Internet 路由而已。
那么数据报套接字呢?为什么它叫无连接呢?为什么它是不可靠的呢?有这样的一些事实:如果你发送一个数据报,它可能会到达,它可能次序颠倒了。如果它到达,那么在这个包的内部是无错误的。数据报也使用 IP 作路由,但是它不使用 TCP。它使用“用户数据报协议 (User Datagram Protocol)”,也叫 “UDP” (请参考 RFC-768。)
为什么它们是无连接的呢?主要是因为它并不象流式套接字那样维持一个连接。你只要建立一个包,构造一个有目标信息的IP 头,然后发出去。无需连接。它们通常使用于传输包-包信息。简单的应用程序有:tftp, bootp等等。
你也许会想:“假如数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp 协议每发出的一个被接受到包,收到者必须发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK” 包)。如果在一定时间内(例如5秒),发送方没有收到应答,它将重新发送,直到得到 ACK。这一ACK过程在实现 SOCK_DGRAM 应用程序的时候非常重要。
--------------------------------------------------------------------------------
网络理论
  既然我刚才提到了协议层,那么现在是讨论网络究竟如何工作和一些 关于 SOCK_DGRAM 包是如何建立的例子。当然,你也可以跳过这一段, 如果你认为已经熟悉的话。
现在是学习数据封装 (Data Encapsulation) 的时候了!它非常非常重 要。它重要性重要到你在网络课程学(图1:数据封装)习中无论如何也得也得掌握它。主要 的内容是:一个包,先是被第一个协议(在这里是TFTP )在它的报头(也许 是报尾)包装(“封装”),然后,整个数据(包括 TFTP 头)被另外一个协议 (在这里是 UDP )封装,然后下一个( IP ),一直重复下去,直到硬件(物理) 层( 这里是以太网 )。
当另外一台机器接收到包,硬件先剥去以太网头,内核剥去IP和UDP 头,TFTP程序再剥去TFTP头,最后得到数据。现在我们终于讲到声名狼藉的网络分层模型 (Layered Network Model)。这种网络模型在描述网络系统上相对其它模型有很多优点。例如, 你可以写一个套接字程序而不用关心数据的物理传输(串行口,以太网,连 接单元接口 (AUI) 还是其它介质),因为底层的程序会为你处理它们。实际 的网络硬件和拓扑对于程序员来说是透明的。
不说其它废话了,我现在列出整个层次模型。如果你要参加网络考试, 可一定要记住:
应用层 (Application)
表示层 (Presentation)
会话层 (Session)
传输层(Transport)
网络层(Network)
数据链路层(Data Link)
物理层(Physical)
物理层是硬件(串口,以太网等等)。应用层是和硬件层相隔最远的--它 是用户和网络交互的地方。
这个模型如此通用,如果你想,你可以把它作为修车指南。把它对应 到 Unix,结果是:
应用层(Application Layer) (telnet, ftp,等等)
传输层(Host-to-Host Transport Layer) (TCP, UDP)
Internet层(Internet Layer) (IP和路由)
网络访问层 (Network Access Layer) (网络层,数据链路层和物理层)
现在,你可能看到这些层次如何协调来封装原始的数据了。
看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 "cat" 来建立数据包头!这仅仅是个玩笑。对于流式套接字你要作的是 send() 发 送数据。对于数据报式套接字,你按照你选择的方式封装数据然后使用 sendto()。内核将为你建立传输层和 Internet 层,硬件完成网络访问层。 这就是现代科技。
现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。 但是我不准备谈它,如果你真的关心,那么参考 IP RFC。
--------------------------------------------------------------------------------
结构体
  终于谈到编程了。在这章,我将谈到被套接字用到的各种数据类型。 因为它们中的一些内容很重要了。
首先是简单的一个:socket描述符。它是下面的类型:
int
仅仅是一个常见的 int。
从现在起,事情变得不可思议了,而你所需做的就是继续看下去。注 意这样的事实:有两种字节排列顺序:重要的字节 (有时叫 "octet",即八 位位组) 在前面,或者不重要的字节在前面。前一种叫“网络字节顺序 (Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外 一些则不然。当我说某数据必须按照 NBO 顺序,那么你要调用函数(例如 htons() )来将它从本机字节顺序 (Host Byte Order) 转换过来。如果我没有 提到 NBO, 那么就让它保持本机字节顺序。
我的第一个结构(在这个技术手册TM中)--struct sockaddr.。这个结构 为许多类型的套接字储存套接字地址信息:
struct sockaddr {
   unsigned short sa_family; /* 地址家族, AF_xxx */
   char sa_data[14]; /*14字节协议地址*/
   };
sa_family 能够是各种各样的类型,但是在这篇文章中都是 "AF_INET"。 sa_data包含套接字中的目标地址和端口信息。这好像有点 不明智。
为了处理struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in ("in" 代表 "Internet"。)
struct sockaddr_in {
   short int sin_family; /* 通信类型 */
   unsigned short int sin_port; /* 端口 */
   struct in_addr sin_addr; /* Internet 地址 */
   unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
   };
用这个数据结构可以轻松处理套接字地址的基本元素。注意 sin_zero (它被加入到这个结构,并且长度和 struct sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 同时,这一重要的字节,一个指向 sockaddr_in结构体的指针也可以被指向结构体sockaddr并且代替它。这 样的话即使 socket() 想要的是 struct sockaddr *,你仍然可以使用 struct sockaddr_in,并且在最后转换。同时,注意 sin_family 和 struct sockaddr 中的 sa_family 一致并能够设置为 "AF_INET"。最后,sin_port和 sin_addr 必须是网络字节顺序 (Network Byte Order)!
你也许会反对道:"但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢?" 要知道这个问题的答案,我们就要仔细的看一看这 个数据结构: struct in_addr, 有这样一个联合 (unions):
/* Internet 地址 (一个与历史有关的结构) */
   struct in_addr {
   unsigned long s_addr;
   };
它曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 "ina" 是数据结构 struct sockaddr_in 的实例,那么 "ina.sin_addr.s_addr" 就储 存4字节的 IP 地址(使用网络字节顺序)。如果你不幸的系统使用的还是恐 怖的联合 struct in_addr ,你还是可以放心4字节的 IP 地址并且和上面 我说的一样(这是因为使用了“#define”。)
--------------------------------------------------------------------------------
本机转换
  我们现在到了新的章节。我们曾经讲了很多网络到本机字节顺序的转 换,现在可以实践了!
你能够转换两种类型: short (两个字节)和 long (四个字节)。这个函 数对于变量类型 unsigned 也适用。假设你想将 short 从本机字节顺序转 换为网络字节顺序。用 "h" 表示 "本机 (host)",接着是 "to",然后用 "n" 表 示 "网络 (network)",最后用 "s" 表示 "short": h-to-n-s, 或者 htons() ("Host to Network Short")。
太简单了...
如果不是太傻的话,你一定想到了由"n","h","s",和 "l"形成的正确 组合,例如这里肯定没有stolh() ("Short to Long Host") 函数,不仅在这里 没有,所有场合都没有。但是这里有:
htons()--"Host to Network Short"
  htonl()--"Host to Network Long"
  ntohs()--"Network to Host Short"
  ntohl()--"Network to Host Long"
现在,你可能想你已经知道它们了。你也可能想:“如果我想改变 char 的顺序要怎么办呢?” 但是你也许马上就想到,“用不着考虑的”。你也许 会想到:我的 68000 机器已经使用了网络字节顺序,我没有必要去调用 htonl() 转换 IP 地址。你可能是对的,但是当你移植你的程序到别的机器 上的时候,你的程序将失败。可移植性!这里是 Unix 世界!记住:在你 将数据放到网络上的时候,确信它们是网络字节顺序的。
最后一点:为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port 需要转换为网络字节顺序,而sin_family 需不需要呢? 答案是: sin_addr 和 sin_port 分别封装在包的 IP 和 UDP 层。因此,它们必须要 是网络字节顺序。但是 sin_family 域只是被内核 (kernel) 使用来决定在数 据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时, sin_family 没有发送到网络上,它们可以是本机字节顺序。
--------------------------------------------------------------------------------
IP 地址和如何处理它们
现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有 必要用手工计算它们,也没有必要用"<<"操作来储存成长整字型。 首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地 址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。 显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符 号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */
printf("address 1: %s\n",a1);
printf("address 2: %s\n",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符 指针。
上面就是关于这个主题的介绍。稍后,你将学习将一个类 似"wintehouse.gov"的字符串转换成它所对应的IP地址(查阅域名服务,稍 后)。
--------------------------------------------------------------------------------
socket()函数
我想我不能再不提这个了-下面我将讨论一下socket()系统调用。
下面是详细介绍:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
但是它们的参数是什么? 首先,domain 应该设置成 "AF_INET",就 象上面的数据结构struct sockaddr_in 中一样。然后,参数 type 告诉内核 是 SOCK_STREAM 类型还是 SOCK_DGRAM 类型。最后,把 protocol 设置为 "0"。(注意:有很多种 domain、type,我不可能一一列出了,请看 socket() 的 man帮助。当然,还有一个"更好"的方式去得到 protocol。同 时请查阅 getprotobyname() 的 man 帮助。)
socket() 只是返回你以后在系统调用种可能用到的 socket 描述符,或 者在错误的时候返回-1。全局变量 errno 中将储存返回的错误值。(请参考 perror() 的 man 帮助。)
--------------------------------------------------------------------------------
bind()函数
  一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联 起来。(如果你想用listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 "telnet x.y.z 6969"。)如果你只想用 connect(),那么这个步 骤没有必要。但是无论如何,请继续读下去。
这里是系统调用 bind() 的大概:
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd 是调用 socket 返回的文件描述符。my_addr 是指向数据结构 struct sockaddr 的指针,它保存你的地址(即端口和 IP 地址) 信息。 addrlen 设置为 sizeof(struct sockaddr)。
简单得很不是吗? 再看看例子:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MYPORT 3490
main()
   {
   int sockfd;
   struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0); /*需要错误检查 */
my_addr.sin_family = AF_INET; /* host byte order */
   my_addr.sin_port = htons(MYPORT); /* short, network byte order */
   my_addr.sin_addr.s_addr = inet_addr("132.241.5.10");
   bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */
/* don't forget your error checking for bind(): */
   bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
   .
   .
   .
这里也有要注意的几件事情。my_addr.sin_port 是网络字节顺序, my_addr.sin_addr.s_addr 也是的。另外要注意到的事情是因系统的不同, 包含的头文件也不尽相同,请查阅本地的 man 帮助文件。
在 bind() 主题中最后要说的话是,在处理自己的 IP 地址和/或端口的 时候,有些工作是可以自动处理的。
my_addr.sin_port = 0; /* 随机选择一个没有使用的端口 */
  my_addr.sin_addr.s_addr = INADDR_ANY; /* 使用自己的IP地址 */
通过将0赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端 口。同样,将 my_addr.sin_addr.s_addr 设置为 INADDR_ANY,你告诉 它自动填上它所运行的机器的 IP 地址。
如果你一向小心谨慎,那么你可能注意到我没有将 INADDR_ANY 转 换为网络字节顺序!这是因为我知道内部的东西:INADDR_ANY 实际上就 是 0!即使你改变字节的顺序,0依然是0。但是完美主义者说应该处处一 致,INADDR_ANY或许是12呢?你的代码就不能工作了,那么就看下面 的代码:
my_addr.sin_port = htons(0); /* 随机选择一个没有使用的端口 */
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 使用自己的IP地址 */
你或许不相信,上面的代码将可以随便移植。我只是想指出,既然你 所遇到的程序不会都运行使用htonl的INADDR_ANY。
bind() 在错误的时候依然是返回-1,并且设置全局错误变量errno。
在你调用 bind() 的时候,你要小心的另一件事情是:不要采用小于 1024的端口号。所有小于1024的端口号都被系统保留!你可以选择从1024 到65535的端口(如果它们没有被别的程序使用的话)。
你要注意的另外一件小事是:有时候你根本不需要调用它。如果你使 用 connect() 来和远程机器进行通讯,你不需要关心你的本地端口号(就象 你在使用 telnet 的时候),你只要简单的调用 connect() 就可以了,它会检 查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。
--------------------------------------------------------------------------------
connect()程序
  现在我们假设你是个 telnet 程序。你的用户命令你得到套接字的文件 描述符。你听从命令调用了socket()。下一步,你的用户告诉你通过端口 23(标准 telnet 端口)连接到"132.241.5.10"。你该怎么做呢? 幸运的是,你正在阅读 connect()--如何连接到远程主机这一章。你可 不想让你的用户失望。
connect() 系统调用是这样的:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd 是系统调用 socket() 返回的套接字文件描述符。serv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置 为 sizeof(struct sockaddr)。
想知道得更多吗?让我们来看个例子:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define DEST_IP "132.241.5.10"
  #define DEST_PORT 23
main()
   {
int sockfd;
struct sockaddr_in dest_addr; /* 目的地址*/
sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查 */
dest_addr.sin_family = AF_INET; /* host byte order */
dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
bzero(&(dest_addr.sin_zero),; /* zero the rest of the struct */
/* don't forget to error check the connect()! */
connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
   .
   .
   .
  再一次,你应该检查 connect() 的返回值--它在错误的时候返回-1,并 设置全局错误变量 errno。
同时,你可能看到,我没有调用 bind()。因为我不在乎本地的端口号。 我只关心我要去那。内核将为我选择一个合适的端口号,而我们所连接的 地方也自动地获得这些信息。一切都不用担心。
--------------------------------------------------------------------------------
listen()函数
  是换换内容得时候了。假如你不希望与远程的一个地址相连,或者说, 仅仅是将它踢开,那你就需要等待接入请求并且用各种方法处理它们。处 理过程分两步:首先,你听--listen(),然后,你接受--accept() (请看下面的 内容)。
除了要一点解释外,系统调用 listen 也相当简单。
int listen(int sockfd, int backlog);
sockfd 是调用 socket() 返回的套接字文件描述符。backlog 是在进入 队列中允许的连接数目。什么意思呢? 进入的连接是在队列中一直等待直 到你接受 (accept() 请看下面的文章)连接。它们的数目限制于队列的允许。 大多数系统的允许数目是20,你也可以设置为5到10。
和别的函数一样,在发生错误的时候返回-1,并设置全局错误变量 errno。
你可能想象到了,在你调用 listen() 前你或者要调用 bind() 或者让内 核随便选择一个端口。如果你想侦听进入的连接,那么系统调用的顺序可 能是这样的:
socket();
  bind();
listen();
  /* accept() 应该在这 */
因为它相当的明了,我将在这里不给出例子了。(在 accept() 那一章的 代码将更加完全。)真正麻烦的部分在 accept()。
--------------------------------------------------------------------------------
accept()函数
  准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器。它的连接将加入到等待接受 (accept()) 的队列 中。你调用 accept() 告诉它你有空闲的连接。它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口, 新的在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程!
函数是这样定义的:
#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
sockfd 相当简单,是和 listen() 中一样的套接字描述符。addr 是个指 向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给 accept 之 前,addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。 accept 将不会将多余的字节给 addr。如果你放入的少些,那么它会通过改
变 addrlen 的值反映出来。
同样,在错误时返回-1,并设置全局错误变量 errno。
现在是你应该熟悉的代码片段。
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#define MYPORT 3490 /*用户接入端口*/
#define BACKLOG 10 /* 多少等待连接控制*/
main()
   {
  int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
  struct sockaddr_in my_addr; /* 地址信息 */
  struct sockaddr_in their_addr; /* connector's address information */
  int sin_size;
sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查*/
my_addr.sin_family = AF_INET; /* host byte order */
  my_addr.sin_port = htons(MYPORT); /* short, network byte order */
  my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
  bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */
/* don't forget your error checking for these calls: */
  bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
sin_size = sizeof(struct sockaddr_in);
  new_fd = accept(sockfd, &their_addr, &sin_size);
   .
   .
   .
注意,在系统调用 send() 和 recv() 中你应该使用新的套接字描述符 new_fd。如果你只想让一个连接进来,那么你可以使用 close() 去关闭原 来的文件描述符 sockfd 来避免同一个端口更多的连接。
--------------------------------------------------------------------------------
send() and recv()函数
  这两个函数用于流式套接字或者数据报套接字的通讯。如果你喜欢使 用无连接的数据报套接字,你应该看一看下面关于sendto() 和 recvfrom() 的章节。
send() 是这样的:
int send(int sockfd, const void *msg, int len, int flags);
sockfd 是你想发送数据的套接字描述符(或者是调用 socket() 或者是 accept() 返回的。)msg 是指向你想发送的数据的指针。len 是数据的长度。 把 flags 设置为 0 就可以了。(详细的资料请看 send() 的 man page)。
这里是一些可能的例子:
char *msg = "Beej was here!";
  int len, bytes_sent;
  .
  .
  len = strlen(msg);
  bytes_sent = send(sockfd, msg, len, 0);
  .
  .
  .
send() 返回实际发送的数据的字节数--它可能小于你要求发送的数 目! 注意,有时候你告诉它要发送一堆数据可是它不能处理成功。它只是 发送它可能发送的数据,然后希望你能够发送其它的数据。记住,如果 send() 返回的数据和 len 不匹配,你就应该发送其它的数据。但是这里也 有个好消息:如果你要发送的包很小(小于大约 1K),它可能处理让数据一 次发送完。最后要说得就是,它在错误的时候返回-1,并设置 errno。
recv() 函数很相似:
int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd 是要读的套接字描述符。buf 是要读的信息的缓冲。len 是缓 冲的最大长度。flags 可以设置为0。(请参考recv() 的 man page。) recv() 返回实际读入缓冲的数据的字节数。或者在错误的时候返回-1, 同时设置 errno。
很简单,不是吗? 你现在可以在流式套接字上发送数据和接收数据了。 你现在是 Unix 网络程序员了!
--------------------------------------------------------------------------------
sendto() 和 recvfrom()函数
  “这很不错啊”,你说,“但是你还没有讲无连接数据报套接字呢?” 没问题,现在我们开始这个内容。
既然数据报套接字不是连接到远程主机的,那么在我们发送一个包之 前需要什么信息呢? 不错,是目标地址!看看下面的:
int sendto(int sockfd, const void *msg, int len, unsigned int flags,
  const struct sockaddr *to, int tolen);
你已经看到了,除了另外的两个信息外,其余的和函数 send() 是一样 的。 to 是个指向数据结构 struct sockaddr 的指针,它包含了目的地的 IP 地址和端口信息。tolen 可以简单地设置为 sizeof(struct sockaddr)。 和函数 send() 类似,sendto() 返回实际发送的字节数(它也可能小于 你想要发送的字节数!),或者在错误的时候返回 -1。
相似的还有函数 recv() 和 recvfrom()。recvfrom() 的定义是这样的:
int recvfrom(int sockfd, void *buf, int len, unsigned int flags,  struct sockaddr *from, int *fromlen);
又一次,除了两个增加的参数外,这个函数和 recv() 也是一样的。from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的 IP 地址和端口信息。fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。函数调用返回后,fromlen 保存着实际储存在 from 中的地址的长度。
recvfrom() 返回收到的字节长度,或者在发生错误后返回 -1。
记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用 UDP,系统套接字接口会为你自动加上了目标和源的信息。
--------------------------------------------------------------------------------
close()和shutdown()函数
  你已经整天都在发送 (send()) 和接收 (recv()) 数据了,现在你准备关 闭你的套接字描述符了。这很简单,你可以使用一般的 Unix 文件描述符 的 close() 函数:
  close(sockfd);
它将防止套接字上更多的数据的读写。任何在另一端读写套接字的企 图都将返回错误信息。
如果你想在如何关闭套接字上有多一点的控制,你可以使用函数 shutdown()。它允许你将一定方向上的通讯或者双向的通讯(就象close()一 样)关闭,你可以使用:
int shutdown(int sockfd, int how);
sockfd 是你想要关闭的套接字文件描述复。how 的值是下面的其中之 一:
  0 - 不允许接受
  1 - 不允许发送
  2 - 不允许发送和接受(和 close() 一样)
shutdown() 成功时返回 0,失败时返回 -1(同时设置 errno。) 如果在无连接的数据报套接字中使用shutdown(),那么只不过是让 send() 和 recv() 不能使用(记住你在数据报套接字中使用了 connect 后 是可以使用它们的)。
--------------------------------------------------------------------------------
getpeername()函数
  这个函数太简单了。
它太简单了,以至我都不想单列一章。但是我还是这样做了。 函数 getpeername() 告诉你在连接的流式套接字上谁在另外一边。函 数是这样的:
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
sockfd 是连接的流式套接字的描述符。addr 是一个指向结构 struct sockaddr (或者是 struct sockaddr_in) 的指针,它保存着连接的另一边的 信息。addrlen 是一个 int 型的指针,它初始化为 sizeof(struct sockaddr)。 函数在错误的时候返回 -1,设置相应的 errno。
一旦你获得它们的地址,你可以使用 inet_ntoa() 或者 gethostbyaddr() 来打印或者获得更多的信息。但是你不能得到它的帐号。(如果它运行着愚 蠢的守护进程,这是可能的,但是它的讨论已经超出了本文的范围,请参 考 RFC-1413 以获得更多的信息。)
--------------------------------------------------------------------------------
gethostname()函数
  甚至比 getpeername() 还简单的函数是 gethostname()。它返回你程 序所运行的机器的主机名字。然后你可以使用 gethostbyname() 以获得你 的机器的 IP 地址。
  下面是定义:
  #include <unistd.h>
int gethostname(char *hostname, size_t size);
参数很简单:hostname 是一个字符数组指针,它将在函数返回时保存
主机名。size是hostname 数组的字节长度。
函数调用成功时返回 0,失败时返回 -1,并设置 errno。
--------------------------------------------------------------------------------
域名服务(DNS)
  如果你不知道 DNS 的意思,那么我告诉你,它代表域名服务(Domain Name Service)。它主要的功能是:你给它一个容易记忆的某站点的地址, 它给你 IP 地址(然后你就可以使用 bind(), connect(), sendto() 或者其它 函数) 。当一个人输入:
   $ telnet whitehouse.gov
telnet 能知道它将连接 (connect()) 到 "198.137.240.100"。
但是这是如何工作的呢? 你可以调用函数 gethostbyname():
#include <netdb.h>
  struct hostent *gethostbyname(const char *name);
很明白的是,它返回一个指向 struct hostent 的指针。这个数据结构 是这样的:
   struct hostent {
   char *h_name;
   char **h_aliases;
   int h_addrtype;
   int h_length;
   char **h_addr_list;
   };
   #define h_addr h_addr_list[0]
这里是这个数据结构的详细资料:
struct hostent:
  h_name - 地址的正式名称。
  h_aliases - 空字节-地址的预备名称的指针。
  h_addrtype -地址类型; 通常是AF_INET。
  h_length - 地址的比特长度。
  h_addr_list - 零字节-主机网络地址指针。网络字节顺序。
  h_addr - h_addr_list中的第一地址。
gethostbyname() 成功时返回一个指向结构体 hostent 的指针,或者 是个空 (NULL) 指针。(但是和以前不同,不设置errno,h_errno 设置错 误信息。请看下面的 herror()。)
但是如何使用呢? 有时候(我们可以从电脑手册中发现),向读者灌输 信息是不够的。这个函数可不象它看上去那么难用。
这里是个例子:
#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
int main(int argc, char *argv[])
   {
   struct hostent *h;
if (argc != 2) { /* 检查命令行 */
   fprintf(stderr,"usage: getip address\n");
   exit(1);
   }
if ((h=gethostbyname(argv[1])) == NULL) { /* 取得地址信息 */
   herror("gethostbyname");
   exit(1);
   }
printf("Host name : %s\n", h->h_name);
  printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));
return 0;
   }
在使用 gethostbyname() 的时候,你不能用 perror() 打印错误信息 (因为 errno 没有使用),你应该调用 herror()。
相当简单,你只是传递一个保存机器名的字符串(例如 "whitehouse.gov") 给 gethostbyname(),然后从返回的数据结构 struct hostent 中获取信息。
唯一也许让人不解的是输出 IP 地址信息。h->h_addr 是一个 char *, 但是 inet_ntoa() 需要的是 struct in_addr。因此,我转换 h->h_addr 成 struct in_addr *,然后得到数据。
--------------------------------------------------------------------------------
客户-服务器背景知识
  这里是个客户--服务器的世界。在网络上的所有东西都是在处理客户进 程和服务器进程的交谈。举个telnet 的例子。当你用 telnet (客户)通过23 号端口登陆到主机,主机上运行的一个程序(一般叫 telnetd,服务器)激活。 它处理这个连接,显示登陆界面,等等。


图2:客户机和服务器的关系
图 2 说明了客户和服务器之间的信息交换。
注意,客户--服务器之间可以使用SOCK_STREAM、SOCK_DGRAM 或者其它(只要它们采用相同的)。一些很好的客户--服务器的例子有 telnet/telnetd、 ftp/ftpd 和 bootp/bootpd。每次你使用 ftp 的时候,在远 端都有一个 ftpd 为你服务。
一般,在服务端只有一个服务器,它采用 fork() 来处理多个客户的连 接。基本的程序是:服务器等待一个连接,接受 (accept()) 连接,然后 fork() 一个子进程处理它。这是下一章我们的例子中会讲到的。
--------------------------------------------------------------------------------
简单的服务器
  这个服务器所做的全部工作是在流式连接上发送字符串 "Hello, World!\n"。你要测试这个程序的话,可以在一台机器上运行该程序,然后 在另外一机器上登陆:
   $ telnet remotehostname 3490
remotehostname 是该程序运行的机器的名字。
服务器代码:
#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
#define MYPORT 3490 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
main()
   {
   int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd
*/
   struct sockaddr_in my_addr; /* my address information */
   struct sockaddr_in their_addr; /* connector's address information */
   int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }

my_addr.sin_family = AF_INET; /* host byte order */
   my_addr.sin_port = htons(MYPORT); /* short, network byte order */
   my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
   bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct
sockaddr))== -1) {
   perror("bind");
   exit(1);
   }
if (listen(sockfd, BACKLOG) == -1) {
   perror("listen");
   exit(1);
   }

while(1) { /* main accept() loop */
   sin_size = sizeof(struct sockaddr_in);
   if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
   &sin_size)) == -1) {
   perror("accept");
   continue;
   }
   printf("server: got connection from %s\n", \
   inet_ntoa(their_addr.sin_addr));
   if (!fork()) { /* this is the child process */
   if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
   perror("send");
   close(new_fd);
   exit(0);
   }
   close(new_fd); /* parent doesn't need this */
while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
   }
   }
如果你很挑剔的话,一定不满意我所有的代码都在一个很大的main() 函数中。如果你不喜欢,可以划分得更细点。
你也可以用我们下一章中的程序得到服务器端发送的字符串。
--------------------------------------------------------------------------------
简单的客户程序
  这个程序比服务器还简单。这个程序的所有工作是通过 3490 端口连接到命令行中指定的主机,然后得到服务器发送的字符串。
客户代码:
#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
#define PORT 3490 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
   {
   int sockfd, numbytes;
   char buf[MAXDATASIZE];
   struct hostent *he;
   struct sockaddr_in their_addr; /* connector's address information */
if (argc != 2) {
   fprintf(stderr,"usage: client hostname\n");
   exit(1);
   }
if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
   herror("gethostbyname");
   exit(1);
   }

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }

their_addr.sin_family = AF_INET; /* host byte order */
  their_addr.sin_port = htons(PORT); /* short, network byte order */
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct
sockaddr)) == -1) {
   perror("connect");
   exit(1);
   }
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
   perror("recv");
   exit(1);
   }
buf[numbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
return 0;
   }
注意,如果你在运行服务器之前运行客户程序,connect() 将返回 "Connection refused" 信息,这非常有用。
--------------------------------------------------------------------------------
数据包 Sockets
  我不想讲更多了,所以我给出代码 talker.c 和 listener.c。
listener 在机器上等待在端口 4590 来的数据包。talker 发送数据包到 一定的机器,它包含用户在命令行输入的内容。
这里就是 listener.c:
#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
#define MYPORT 4950 /* the port users will be sending to */
#define MAXBUFLEN 100
main()
   {
   int sockfd;
   struct sockaddr_in my_addr; /* my address information */
   struct sockaddr_in their_addr; /* connector's address information */
   int addr_len, numbytes;
   char buf[MAXBUFLEN];
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }
my_addr.sin_family = AF_INET; /* host byte order */
   my_addr.sin_port = htons(MYPORT); /* short, network byte order */
   my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
   bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
\
   == -1) {
   perror("bind");
   exit(1);
   }
addr_len = sizeof(struct sockaddr);
   if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \
   (struct sockaddr *)&their_addr, &addr_len)) == -1) {
   perror("recvfrom");
   exit(1);
   }
printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
   printf("packet is %d bytes long\n",numbytes);
   buf[numbytes] = '\0';
   printf("packet contains \"%s\"\n",buf);
close(sockfd);
   }
注意在我们的调用 socket(),我们最后使用了 SOCK_DGRAM。同时, 没有必要去使用 listen() 或者 accept()。我们在使用无连接的数据报套接 字!
下面是 talker.c:
#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <sys/wait.h>
#define MYPORT 4950 /* the port users will be sending to */
int main(int argc, char *argv[])
   {
   int sockfd;
   struct sockaddr_in their_addr; /* connector's address information */
   struct hostent *he;
   int numbytes;

if (argc != 3) {
   fprintf(stderr,"usage: talker hostname message\n");
   exit(1);
   }

if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
   herror("gethostbyname");
   exit(1);
   }

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
   perror("socket");
   exit(1);
   }

their_addr.sin_family = AF_INET; /* host byte order */
   their_addr.sin_port = htons(MYPORT); /* short, network byte order
*/
   their_addr.sin_addr = *((struct in_addr *)he->h_addr);
   bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */
if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \
   (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
   perror("sendto");
   exit(1);
   }
printf("sent %d bytes to
%s\n",numbytes,inet_ntoa(their_addr.sin_addr));
close(sockfd);
return 0;
   }
这就是所有的了。在一台机器上运行 listener,然后在另外一台机器上 运行 talker。观察它们的通讯!
除了一些我在上面提到的数据套接字连接的小细节外,对于数据套接 字,我还得说一些,当一个讲话者呼叫conn