锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩一区二区三区四区五区,欧美一区免费,欧美黄色大片网站http://m.shnenglu.com/lmlf001/category/1601.html涓夋偓鏄庨暅鍨傞縛闊碉紝涔濇挬娓呮硥媧楀皹蹇? zh-cnTue, 20 May 2008 01:07:16 GMTTue, 20 May 2008 01:07:16 GMT60epoll瀹炵幇鐨刵et_echo紼嬪簭http://m.shnenglu.com/lmlf001/archive/2007/09/08/31854.html鑺ヤ箣鑸?/dc:creator>鑺ヤ箣鑸?/author>Sat, 08 Sep 2007 12:49:00 GMThttp://m.shnenglu.com/lmlf001/archive/2007/09/08/31854.htmlhttp://m.shnenglu.com/lmlf001/comments/31854.htmlhttp://m.shnenglu.com/lmlf001/archive/2007/09/08/31854.html#Feedback0http://m.shnenglu.com/lmlf001/comments/commentRss/31854.htmlhttp://m.shnenglu.com/lmlf001/services/trackbacks/31854.html闃呰鍏ㄦ枃

]]>
Linux緗戠粶緙栫▼--8. 濂楁帴瀛楅夐」錛圸Z錛?/title><link>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6372.html</link><dc:creator>鑺ヤ箣鑸?/dc:creator><author>鑺ヤ箣鑸?/author><pubDate>Thu, 27 Apr 2006 05:12:00 GMT</pubDate><guid>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6372.html</guid><wfw:comment>http://m.shnenglu.com/lmlf001/comments/6372.html</wfw:comment><comments>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lmlf001/comments/commentRss/6372.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lmlf001/services/trackbacks/6372.html</trackback:ping><description><![CDATA[ <p align="center"> <font size="4">Linux緗戠粶緙栫▼--8. 濂楁帴瀛楅夐」</font> <br /> <br />http://linuxc.51.net 浣滆?hoyt<br /></p> <br />鏈夋椂鍊欐垜浠鎺у埗濂楁帴瀛楃殑琛屼負(濡備慨鏀圭紦鍐插尯鐨勫ぇ灝?,榪欎釜鏃跺欐垜浠氨瑕佹帶鍒跺鎺ュ瓧鐨勯夐」浜? <br /><br /><br />8.1 getsockopt鍜宻etsockopt <br /><br />int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) <br />int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen) <br /><br />level鎸囧畾鎺у埗濂楁帴瀛楃殑灞傛.鍙互鍙栦笁縐嶅? 1)SOL_SOCKET:閫氱敤濂楁帴瀛楅夐」. 2)IPPROTO_IP:IP閫夐」. 3)IPPROTO_TCP:TCP閫夐」. <br />optname鎸囧畾鎺у埗鐨勬柟寮?閫夐」鐨勫悕縐?,鎴戜滑涓嬮潰璇︾粏瑙i噴 <br /><br />optval鑾峰緱鎴栬呮槸璁劇疆濂楁帴瀛楅夐」.鏍規嵁閫夐」鍚嶇О鐨勬暟鎹被鍨嬭繘琛岃漿鎹? <br /><br /><br />閫夐」鍚嶇О 璇存槑 鏁版嵁綾誨瀷 <br />======================================================================== <br /> SOL_SOCKET <br />------------------------------------------------------------------------ <br />SO_BROADCAST 鍏佽鍙戦佸箍鎾暟鎹? int <br />SO_DEBUG 鍏佽璋冭瘯 int <br />SO_DONTROUTE 涓嶆煡鎵捐礬鐢? int <br />SO_ERROR 鑾峰緱濂楁帴瀛楅敊璇? int <br />SO_KEEPALIVE 淇濇寔榪炴帴 int <br />SO_LINGER 寤惰繜鍏抽棴榪炴帴 struct linger <br />SO_OOBINLINE 甯﹀鏁版嵁鏀懼叆姝e父鏁版嵁嫻? int <br />SO_RCVBUF 鎺ユ敹緙撳啿鍖哄ぇ灝? int <br />SO_SNDBUF 鍙戦佺紦鍐插尯澶у皬 int <br />SO_RCVLOWAT 鎺ユ敹緙撳啿鍖轟笅闄? int <br />SO_SNDLOWAT 鍙戦佺紦鍐插尯涓嬮檺 int <br />SO_RCVTIMEO 鎺ユ敹瓚呮椂 struct timeval <br />SO_SNDTIMEO 鍙戦佽秴鏃? struct timeval <br />SO_REUSERADDR 鍏佽閲嶇敤鏈湴鍦板潃鍜岀鍙? int <br />SO_TYPE 鑾峰緱濂楁帴瀛楃被鍨? int <br />SO_BSDCOMPAT 涓嶣SD緋葷粺鍏煎 int <br />========================================================================== <br /> IPPROTO_IP <br />-------------------------------------------------------------------------- <br />IP_HDRINCL 鍦ㄦ暟鎹寘涓寘鍚獻P棣栭儴 int <br />IP_OPTINOS IP棣栭儴閫夐」 int <br />IP_TOS 鏈嶅姟綾誨瀷 <br />IP_TTL 鐢熷瓨鏃墮棿 int <br />========================================================================== <br /> IPPRO_TCP <br />-------------------------------------------------------------------------- <br />TCP_MAXSEG TCP鏈澶ф暟鎹鐨勫ぇ灝? int <br />TCP_NODELAY 涓嶄嬌鐢∟agle綆楁硶 int <br />========================================================================= <br /><br />鍏充簬榪欎簺閫夐」鐨勮緇嗘儏鍐佃鏌ョ湅 Linux Programmer's Manual <br /><br />8.2 ioctl <br />ioctl鍙互鎺у埗鎵鏈夌殑鏂囦歡鎻忚堪絎︾殑鎯呭喌,榪欓噷浠嬬粛涓涓嬫帶鍒跺鎺ュ瓧鐨勯夐」. <br /><br /> int ioctl(int fd,int req,...) <br /><br />========================================================================== <br /> ioctl鐨勬帶鍒墮夐」 <br />-------------------------------------------------------------------------- <br />SIOCATMARK 鏄惁鍒拌揪甯﹀鏍囪 int <br />FIOASYNC 寮傛杈撳叆/杈撳嚭鏍囧織 int <br />FIONREAD 緙撳啿鍖哄彲璇葷殑瀛楄妭鏁? int <br />========================================================================== <br /><br />璇︾粏鐨勯夐」璇風敤 man ioctl_list 鏌ョ湅. <img src ="http://m.shnenglu.com/lmlf001/aggbug/6372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lmlf001/" target="_blank">鑺ヤ箣鑸?/a> 2006-04-27 13:12 <a href="http://m.shnenglu.com/lmlf001/archive/2006/04/27/6372.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>SOCKET甯哥敤鍑芥暟綆浠嬶紙ZZ錛?/title><link>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6370.html</link><dc:creator>鑺ヤ箣鑸?/dc:creator><author>鑺ヤ箣鑸?/author><pubDate>Thu, 27 Apr 2006 04:11:00 GMT</pubDate><guid>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6370.html</guid><wfw:comment>http://m.shnenglu.com/lmlf001/comments/6370.html</wfw:comment><comments>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lmlf001/comments/commentRss/6370.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lmlf001/services/trackbacks/6370.html</trackback:ping><description><![CDATA[浠涔堟槸 socket錛?<br />浣犲緇堝惉鍒頒漢浠皥璁虹潃 "socket"錛岃屼綘涓嶇煡閬撲粬鐨勭‘鍒囧惈涔夈傞偅涔堬紝鐜板湪鎴戝憡璇変綘錛?浠栨槸浣跨敤 Unix 鏂囦歡鎻忚堪絎?(fiel descriptor) 鍜屽叾浠栫▼搴忛氳鐨勬柟寮忋?<br />浠涔堬紵 <br />Ok --浣犱篃璁稿惉鍒頒竴浜?Unix 楂樻墜 (hacker) 榪欐牱璇達細鈥滃憖錛孶nix 涓墍鏈夌殑涓滆タ灝辨槸鏂囦歡錛佲濋偅涓浼欎篃璁告鍦ㄨ鍒頒竴涓簨瀹烇細Unix 紼嬪簭鍦ㄦ墽琛屼換浣曞艦寮忕殑 I/O 鐨勬椂鍊欙紝紼嬪簭鏄湪璇繪垨鑰呭啓涓涓枃浠舵弿榪扮銆備竴涓枃浠舵弿榪扮鍙槸涓涓拰鎵撳紑鐨勬枃浠剁浉鍏寵仈鐨勬暣鏁般備絾鏄?娉ㄦ剰鍚庨潰鐨勮瘽)錛岃繖涓枃浠跺彲鑳芥槸涓涓綉緇滆繛鎺ワ紝 FIFO錛岀閬擄紝緇堢錛岀鐩樹笂鐨勬枃浠?鎴栬呬粈涔堝叾浠栫殑涓滆タ銆俇nix 涓墍鏈夌殑涓滆タ鏄枃浠訛紒鍥犳錛屼綘鎯沖拰 Internet 涓婂埆 鐨勭▼搴忛氳鐨勬椂鍊欙紝浣犲皢瑕侀氳繃鏂囦歡鎻忚堪絎︺傛渶濂界浉淇″垰鎵嶇殑璇濄?<br />鐜板湪浣犺剳嫻蜂腑鎴栬鍐掑嚭榪欐牱鐨勫康澶達細鈥滈偅涔堟垜浠庡摢閲屽緱鍒扮綉緇滈氳鐨勬枃浠舵弿榪扮鍛紝 鑱槑 浜猴紵鈥濇棤璁哄浣曪紝鎴戣鍥炵瓟榪欎釜闂錛氫綘鍒╃敤緋葷粺璋冪敤 socket()銆備粬榪斿洖濂楁帴鍙f弿 榪扮 (socket descriptor)錛岀劧鍚庝綘鍐嶉氳繃浠栨潵璋冪敤 send() 鍜?recv()銆?<br />鈥滀絾鏄?..鈥濓紝浣犲彲鑳界幇鍦ㄥ彨璧鋒潵錛屸滃鏋滀粬鏄釜鏂囦歡鎻忚堪 絎︼紝閭d箞涓轟粈涔堜笉鐢ㄤ竴鑸殑璋冪敤 read() 鍜?write() 鏉ラ氳繃濂楁帴鍙i氳錛熲濈畝鍗曠殑絳旀鏄細鈥滀綘鍙互浣跨敤 涓鑸殑鍑芥暟錛佲濄傝緇嗙殑絳旀鏄細鈥滀綘鍙互錛屼絾鏄嬌鐢?send() 鍜?recv() 璁╀綘鏇村ソ鐨勬帶鍒舵暟鎹紶杈撱傗?<br />鏈夎繖鏍蜂竴涓簨瀹烇細鍦ㄦ垜浠殑 涓栫晫涓婏紝鏈夊緢澶氱濂楁帴鍙c傛湁 DARPA Internet 鍦板潃 (Internet 濂楁帴鍙?錛屾湰鍦拌妭鐐圭殑璺緞鍚?(Unix 濂楁帴鍙?錛孋CITT X.25 鍦板潃 (浣犲彲浠ュ畬鍏ㄥ拷鐣?X.25 濂楁帴鍙?銆?涔熻鍦ㄤ綘鐨?Unix 鏈哄櫒涓婅繕鏈夊叾浠栫殑銆傛垜浠湪榪欓噷鍙絎竴縐嶏細Internet 濂楁帴鍙c?<br />----------------------------------------------------------------------------<br />Internet 濂楁帴鍙g殑涓ょ綾誨瀷 <br />浠 涔堟剰鎬濓紵鏈変袱縐?Internet 濂楁帴鍙o紵鏄殑銆備笉錛屾垜鍦ㄦ拻璋庛傚叾瀹炶繕鏈夊緢澶氾紝浣嗘槸鎴戝彲涓嶆兂 鍚撶潃浣犮傛垜浠繖閲屽彧璁蹭袱縐嶃?Except for this sentence, where I'm going to tell you that "Raw Sockets" are also very powerful and you should look them up. <br />濂戒簡錛屽ソ浜嗐傞偅涓ょ綾誨瀷鏄粈涔堝憿錛熶竴縐嶆槸 "Stream Sockets"錛屽彟澶栦竴縐嶆槸 "Datagram Sockets"銆傛垜浠互鍚庤皥鍒頒粬浠殑鏃跺欎篃浼氱敤鍒?"SOCK_STREAM" 鍜?"SOCK_DGRAM"銆傛暟鎹姤濂楁帴鍙f湁鏃朵篃鍙滄棤榪炴帴濂楁帴鍙b?濡傛灉浣犵‘瀹炶榪炴帴鐨勬椂鍊欑敤 connect()銆? <br />嫻佸紡濂楁帴鍙f槸鍙潬鐨勫弻鍚戦氳鐨勬暟鎹祦銆傚鏋滀綘鍚戝鎺ュ彛瀹夐『搴忚緭鍑衡?錛?鈥濓紝閭d箞浠栦滑 灝嗗畨欏哄簭鈥?錛?鈥濆埌杈懼彟涓杈廣備粬浠篃鏄棤閿欒鐨勪紶閫掔殑錛屾湁鑷繁鐨勯敊璇帶鍒躲?<br />鏈? 璋佸湪浣跨敤嫻佸紡濂楁帴鍙o紵浣犲彲鑳藉惉璇磋繃 telnet錛屼笉鏄悧錛熶粬灝變嬌鐢ㄦ祦寮忓鎺ュ彛銆備綘闇瑕佷綘鎵杈撳叆鐨勫瓧絎︽寜欏哄簭鍒拌揪錛屼笉鏄?鍚楋紵鍚屾牱錛學WW 嫻忚鍣ㄤ嬌鐢ㄧ殑 HTTP 鍗忚涔熶嬌鐢ㄤ粬浠傚疄闄呬笂錛屽綋浣犻氳繃绔彛80 telnet 鍒頒竴涓?WWW 绔欑偣錛岀劧鍚庤緭鍏?鈥淕ET pagename鈥? 鐨勬椂鍊欙紝浣犱篃鍙互寰楀埌 HTML 鐨勫唴瀹廣?<br />涓轟粈涔堟祦寮忓鎺ュ彛鍙互杈懼埌楂樿川閲忕殑鏁版嵁浼犺緭錛熶粬浣跨敤浜嗏滀紶杈撴帶鍒跺崗璁?(The Transmission Control Protocol)鈥濓紝涔熷彨 鈥淭CP鈥?(璇峰弬鑰?RFC-793 鑾峰緱璇︾粏璧勬枡銆?TCP 鎺у埗浣犵殑鏁版嵁 鎸夐『搴忓埌杈懼茍涓旀病鏈夐敊璇備綘涔熻鍚埌 鈥淭CP鈥?鏄洜涓哄惉鍒拌繃 鈥淭CP/IP鈥濄傝繖閲岀殑 IP 鏄寚 鈥淚nternet 鍗忚鈥?璇峰弬鑰?RFC-791.) IP 鍙槸澶勭悊 Internet 璺敱鑰屽凡銆?<br />閭d箞鏁版嵁鎶ュ鎺ュ彛鍛紵涓轟粈涔堜粬鍙棤榪炴帴鍛紵涓轟粈涔堜粬鏄笉鍙潬鐨勫憿錛熸仼錛屾湁榪欐牱鐨勪簨瀹烇細濡傛灉浣犲彂閫佷竴涓暟鎹姤錛屼粬鍙兘鍒拌揪錛屼粬鍙兘嬈″簭棰犲掍簡銆傚鏋滀粬鍒拌揪錛岄偅涔堝湪榪欎釜鍖呯殑鍐呴儴鏄棤閿欒鐨勩?<br />鏁版嵁鎶ヤ篃浣跨敤 IP 浣滆礬鐢憋紝浣嗘槸浠栦笉閫夋嫨 TCP銆備粬浣跨敤鈥滅敤鎴鋒暟鎹姤鍗忚 (User Datagram Protocol)鈥濓紝涔熷彨 鈥淯DP鈥?(璇峰弬鑰?RFC-768.) <br />涓轟粈涔堜粬浠槸鏃犺繛鎺ョ殑鍛紵涓昏鍘熷洜鏄洜涓轟粬騫朵笉璞℃祦寮忓鎺ュ彛閭f牱緇存寔涓涓繛鎺ャ?浣犲彧瑕佸緩绔嬩竴涓寘錛屽湪鐩爣淇℃伅涓瀯閫犱竴涓?IP 澶達紝鐒跺悗鍙戝嚭鍘匯備笉闇瑕佽繛鎺ャ傚簲鐢ㄧ▼搴忔湁錛?tftp, bootp 絳夌瓑銆?<br />鈥滃 浜嗭紒鈥濅綘涔熻浼氭兂錛屸滃鏋滄暟鎹涪澶變簡榪欎簺紼嬪簭濡備綍姝e父宸ヤ綔錛熲濇垜鐨勬湅鍙嬶紝姣忎釜紼嬪簭鍦?UDP 涓婃湁鑷繁鐨勫崗璁備緥濡傦紝tftp 鍗忚姣忓彂鍑轟竴涓寘錛屾敹鍒拌呭彂鍥炰竴涓寘鏉ヨ鈥滄垜鏀跺埌浜嗭紒鈥?(涓涓滃懡浠ゆ紜簲絳斺濅篃鍙淎CK鈥? 鍖?銆傚鏋滃湪涓瀹氭椂闂村唴(渚嬪5縐?錛屽彂閫佹柟娌℃湁鏀跺埌搴旂瓟錛?浠栧皢閲嶆柊鍙戦侊紝鐩村埌寰楀埌 ACK銆傝繖涓鐐瑰湪瀹炵幇 SOCK_DGRAM 搴旂敤紼嬪簭鐨勬椂鍊欓潪甯擱噸瑕併?<br />----------------------------------------------------------------------------<br />緗戠粶鐞嗚 <br />鏃㈢劧鎴戝垰鎵嶆彁鍒頒簡鍗忚灞傦紝閭d箞鐜板湪鏄璁虹綉緇滅┒绔熷浣曞伐浣滃拰婕旂ず SOCK_DGRAM 鐨勫伐浣溿傚綋鐒訛紝浣犱篃鍙互璺寵繃榪欎竴孌碉紝濡傛灉浣犺涓?宸茬粡鐔熸倝鐨勮瘽銆?<br />鏈? 鍙嬩滑錛岀幇鍦ㄦ槸瀛︿範 鏁版嵁灝佽 (Data Encapsulation) 鐨勬椂鍊欎簡錛?榪欓潪甯擱潪甯擱噸瑕併侷t's so important that you might just learn about it if you take the networks course here at Chico State <img src="http://www.osprg.org/uploads/smil3dbd4e398ff7b.gif" alt="" />. 涓昏鐨勫唴瀹規槸錛氫竴涓寘錛屽厛鏄絎竴涓崗璁?鍦ㄨ繖閲屾槸 TFTP )鍖呰(鈥滃皝瑁呪?錛?鐒跺悗錛屾暣涓暟鎹?鍖呮嫭 TFTP 澶?琚彟澶栦竴涓崗璁?鍦ㄨ繖閲屾槸 UDP )灝佽錛岀劧鍚庝笅 涓涓? IP )錛屼竴鐩撮噸澶嶄笅鍘伙紝鐩村埌紜歡(鐗╃悊)灞? Ethernet )銆?<br />褰撳彟澶栦竴鍙版満鍣ㄦ帴鏀跺埌鍖咃紝紜歡鍏堝墺鍘?Ethernet 澶達紝鍐呮牳鍓ュ幓 IP 鍜?UDP 澶達紝TFTP 紼嬪簭鍐嶅墺鍘?TFTP 澶達紝鏈鍚庡緱鍒版暟鎹?<br />鐜? 鍦ㄦ垜浠粓浜庤鍒拌嚟鍚嶈繙鎾殑 緗戠粶鍒嗗眰妯″瀷 (Layered Network Model)銆傝繖縐嶇綉緇滄ā鍨嬪湪鎻忚堪緗戠粶緋葷粺涓婄浉瀵瑰叾浠栨ā鍨嬫湁寰堝浼樼偣銆備緥濡傦紝浣犲彲浠ュ啓涓涓鎺ュ彛 紼嬪簭鑰屼笉鐢ㄥ叧蹇冩暟鎹殑鐗╃悊浼犺緭(涓茶鍙o紝浠ュお緗戯紝榪炴帴鍗曞厓鎺ュ彛 (AUI) 榪樻槸鍏朵粬浠嬭川銆? 鍥犱負搴曞眰鐨勭▼搴忎負浣犲鐞嗕粬浠傚疄闄呯殑緗戠粶紜歡鍜屾嫇鎵戝浜庣▼搴忓憳鏉ヨ鏄忔槑鐨勩?<br />涓嶈鍏朵粬搴熻瘽浜嗭紝鎴戠幇鍦ㄥ垪鍑烘暣涓眰嬈℃ā鍨嬨傚鏋滀綘瑕佸弬鍔犵綉緇滆冭瘯錛屽彲涓瀹氳璁頒綇錛?<br />搴旂敤灞?(Application) <br />琛ㄧず灞?(Presentation) <br />浼氳瘽灞?(Session) <br />浼犺緭灞?(Transport) <br />緗戠粶灞?(Network) <br />鏁版嵁閾捐礬灞?(Data Link) <br />鐗╃悊灞?(Physical) <br />鐗╃悊灞傛槸紜歡(涓插彛錛屼互澶綉絳夌瓑)銆傚簲鐢ㄥ眰鏄拰紜歡灞傜浉闅旀渶榪滅殑--浠栨槸鐢ㄦ埛鍜岀綉緇?浜や簰鐨勫湴鏂廣?<br />榪欎釜妯″瀷濡傛閫氱敤錛屽鏋滀綘鎯籌紝浣犲彲浠ユ妸浠栦綔涓轟慨杞︽寚鍗椼傛妸浠栧簲鐢ㄥ埌 Unix錛岀粨鏋滄槸: <br />搴旂敤灞?(Application Layer) (telnet, ftp, 絳夌瓑) <br />浼犺緭灞?(Host-to-Host Transport Layer) (TCP, UDP) <br />Internet 灞?(Internet Layer) (IP 鍜岃礬鐢? <br />緗戠粶璁塊棶灞?(Network Access Layer) (緗戠粶灞傦紝鏁版嵁閾捐礬灞傚拰鐗╃悊灞? <br />鐜板湪錛屼綘鍙兘鐪嬪埌榪欎簺灞傛濡備綍鍗忚皟鏉ュ皝瑁呭師濮嬬殑鏁版嵁浜嗐?<br />鐪? 鐪嬪緩绔嬩竴涓畝鍗曠殑鏁版嵁鍖呮湁澶氬皯宸ヤ綔錛熷搸鍛錛屼綘灝嗕笉寰椾笉浣跨敤 "cat" 鏉ュ畬鎴?浠栦滑錛佺畝鐩存槸絎戣瘽銆傚浜庢祦寮忓鎺ュ彛浣犺浣滅殑鏄?send() 鍙戦佹暟鎹傚浜庢暟鎹姤 寮忓鎺ュ彛浣犳寜鐓т綘閫夋嫨鐨勬柟寮忓皝瑁呮暟鎹劧鍚庣敤 sendto()銆傚唴鏍稿皢涓轟綘寤虹珛浼犺緭 灞傚拰 Internet 灞傦紝紜歡瀹屾垚緗戠粶璁塊棶灞傘傝繖灝辨槸鐜頒唬縐戞妧銆?<br />鐜板湪緇撴潫鎴戜滑鐨勭綉緇滅悊璁洪熸垚鐝傚摝錛屽繕璁板憡璇変綘鍏充簬璺敱鐨勪簨鎯呬簡銆備絾鏄垜涓嶅噯澶囪皥浠栥?濡傛灉浣犵湡鐨勬兂鐭ラ亾錛岄偅涔堝弬鑰?IP RFC銆傚鏋滀綘浠庢潵涓嶆浘浜嗚В浠栵紝涔熸病鏈?鍏崇郴錛屼綘榪樻椿鐫涓嶆槸鍚椼?<br />----------------------------------------------------------------------------<br />structs <br />緇堜簬鍒拌揪榪欓噷浜嗭紝緇堜簬璋堝埌緙栫▼浜嗐傚湪榪欑珷錛屾垜灝嗚皥鍒拌濂楁帴鍙g敤鍒扮殑鍚勭鏁版嵁綾誨瀷銆傚洜涓?浠栦滑涓殑涓浜涘お閲嶈浜嗐?<br />棣栧厛鏄畝鍗曠殑涓涓細socket descriptor銆備粬鏄笅闈㈢殑綾誨瀷錛?<br /> int <br />浠呬粎鏄竴涓父瑙佺殑 int銆?<br />浠? 鐜板湪璧鳳紝浜嬫儏鍙樺緱涓嶅彲鎬濊浜嗐傝璺熸垜涓璧峰繊鍙楄嫤鎭煎惂銆傛敞鎰忚繖鏍風殑浜嬪疄錛?鏈変袱縐嶅瓧鑺傛帓鍒楅『搴忥細閲嶈鐨勫瓧鑺傚湪鍓嶉潰(鏈夋椂鍙? "octet")錛屾垨鑰呬笉閲嶈鐨勫瓧鑺傚湪鍓嶉潰銆?鍓嶄竴縐嶅彨鈥滅綉緇滃瓧鑺傞『搴?(Network Byte Order)鈥濄傛湁浜涙満鍣ㄥ湪鍐呴儴鏄寜鐓ц繖涓『搴忓偍瀛樻暟鎹紝鑰屽彟澶栦竴浜涘垯涓嶇劧銆傚綋鎴戣鏌愭暟鎹繀欏繪寜鐓?NBO 欏哄簭錛岄偅涔堜綘瑕佽皟鐢ㄥ嚱鏁?渚?濡? htons() )鏉ュ皢浠栦粠鏈満瀛楄妭欏哄簭 (Host Byte Order) 杞崲榪囨潵銆傚鏋滄垜 娌℃湁鎻愬埌 NBO錛?閭d箞灝辮浠栨槸鏈満瀛楄妭欏哄簭鍚с? <br />鎴戠殑絎竴涓粨鏋?TM)--struct sockaddr. 榪欎釜鏁版嵁緇撴瀯 涓鴻澶氱被鍨嬬殑濂楁帴鍙e偍瀛樺鎺ュ彛鍦板潃淇℃伅錛?<br />struct sockaddr { <br /> unsigned short sa_family; /* address family, AF_xxx */ <br /> char sa_data[14]; /* 14 bytes of protocol address */ <br />}; <br />sa_family 鑳藉鏄悇縐嶅悇鏍風殑浜嬫儏錛屼絾鏄湪榪欑瘒鏂囩珷涓槸 "AF_INET"銆?sa_data 涓哄鎺ュ彛鍌ㄥ瓨鐩爣鍦板潃鍜岀鍙d俊鎭傜湅涓婂幓寰堢鎷欙紝涓嶆槸鍚椼?<br />涓轟簡瀵逛粯 struct sockaddr錛岀▼搴忓憳鍒涢犱簡涓涓茍鍒楃殑緇撴瀯錛?struct sockaddr_in ("in" 浠h〃 "Internet".) <br />struct sockaddr_in { <br /> short int sin_family; /* Address family */ <br /> unsigned short int sin_port; /* Port number */ <br /> struct in_addr sin_addr; /* Internet address */ <br /> unsigned char sin_zero[8]; /* Same size as struct sockaddr */ <br /><br />}; <br />榪? 涓暟鎹粨鏋勮鍙互杞繪澗澶勭悊濂楁帴鍙e湴鍧鐨勫熀鏈厓绱犮傛敞鎰?sin_zero (浠?琚姞鍏ュ埌榪欎釜緇撴瀯錛屽茍涓旈暱搴﹀拰 struct sockaddr 涓鏍? 搴旇浣跨敤鍑芥暟 bzero() 鎴?memset() 鏉ュ叏閮ㄧ疆闆躲?Also, and this is the important bit, a pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice-versa. 榪欐牱鐨勮瘽 鍗充嬌 socket() 鎯寵鐨勬槸 struct sockaddr *錛?浣犱粛鐒跺彲浠ヤ嬌鐢?struct sockaddr_in錛宎nd cast it at the last minute! 鍚屾椂錛屾敞鎰? sin_family 鍜?struct sockaddr 涓殑 sa_family 涓鑷村茍鑳藉璁劇疆涓?"AF_INET"銆傛渶鍚庯紝 sin_port 鍜?sin_addr 蹇呴』鏄綉緇滃瓧鑺傞『搴?(Network Byte Order)錛?<br />浣犱篃璁鎬細鍙嶅閬擄細"浣嗘槸錛屾庝箞璁╂暣涓暟鎹粨鏋?struct in_addr sin_addr 鎸夌収緗戠粶瀛楄妭欏哄簭鍛?" 瑕佺煡閬撹繖涓棶棰樼殑絳旀錛屾垜浠氨瑕佷粩緇嗙殑鐪嬩竴 鐪嬭繖涓暟鎹粨鏋勶細 struct in_addr, 鏈夎繖鏍蜂竴涓仈鍚?(unions)錛?<br />/* Internet address (a structure for historical reasons) */ <br /> struct in_addr { <br /> unsigned long s_addr; <br /> }; <br />浠? 鏇劇粡鏄釜鏈鍧忕殑鑱斿悎錛屼絾鏄幇鍦ㄩ偅浜涙棩瀛愯繃鍘諱簡銆傚鏋滀綘澹版槑 "ina" 鏄?鏁版嵁緇撴瀯 struct sockaddr_in 鐨勫疄渚嬶紝閭d箞 "ina.sin_addr.s_addr" 灝卞偍瀛?瀛楄妭鐨?IP 鍦板潃(緗戠粶瀛楄妭欏哄簭)銆傚鏋滀綘涓嶅垢鐨?緋葷粺浣跨敤鐨勮繕鏄亹鎬栫殑鑱斿悎 struct in_addr 錛屼綘榪樻槸鍙互鏀懼績4瀛?鑺傜殑 IP 鍦板潃鏄拰涓婇潰鎴戣鐨勪竴鏍?榪欐槸鍥犱負 #define銆? <br />----------------------------------------------------------------------------<br />Convert the Natives! <br />鎴戜滑鐜板湪鍒拌揪涓嬩釜绔犺妭銆傛垜浠浘緇忚浜嗗緢澶氱綉緇滃埌鏈満瀛楄妭欏哄簭錛岀幇鍦ㄦ槸閲囧彇琛屽姩鐨勬椂鍒諱簡錛?<br />浣? 鑳藉杞崲涓ょ綾誨瀷錛?short (涓や釜瀛楄妭)鍜?long (鍥涗釜瀛楄妭)銆傝繖涓?鍑芥暟瀵逛簬鍙橀噺綾誨瀷 unsigned 涔熼傜敤銆傚亣璁句綘鎯沖皢 short 浠庢湰鏈哄瓧鑺傞『搴?杞崲涓虹綉緇滃瓧鑺傞『搴忋傜敤 "h" 琛ㄧず "鏈満 (host)"錛屾帴鐫鏄?"to"錛岀劧鍚庣敤 "n" 琛ㄧず "緗戠粶 (network)"錛屾渶鍚庣敤 "s" 琛ㄧず "short"錛?h-to-n-s, 鎴栬?htons() ("Host to Network Short")銆?<br />澶畝鍗曚簡... <br />濡傛灉涓嶆槸澶偦鐨勮瘽錛屼綘涓瀹氭兂鍒頒簡緇勫悎 "n"錛?h"錛?s"錛屽拰 "l"銆備絾鏄繖閲屾病鏈?stolh() ("Short to Long Host") 鍑芥暟錛屼絾鏄繖閲屾湁錛?<br />htons()--"Host to Network Short" <br />htonl()--"Host to Network Long" <br />ntohs()--"Network to Host Short" <br />ntohl()--"Network to Host Long" <br />鐜? 鍦紝浣犲彲鑳芥兂浣犲凡緇忕煡閬撲粬浠簡銆備綘涔熷彲鑳芥兂錛?濡傛灉鎴戞敼鍙?char 鐨勯『搴忎細 鎬庝箞鏍峰憿? 鎴戠殑 68000 鏈哄櫒宸茬粡浣跨敤浜嗙綉緇滃瓧鑺傞『搴忥紝鎴戞病鏈夊繀瑕佸幓璋冪敤 htonl() 杞崲 IP 鍦板潃銆? 浣犲彲鑳芥槸瀵圭殑錛屼絾鏄綋浣犵Щ妞嶄綘鐨勭▼搴忓埌鍒殑鏈哄櫒涓婄殑鏃跺欙紝浣犵殑紼嬪簭灝?澶辮觸銆傚彲縐繪鎬э紒榪欓噷鏄?Unix 涓栫晫錛佽浣忥細鍦ㄤ綘灝嗘暟鎹斁鍒扮綉緇滀笂鐨勬椂鍊欙紝紜俊浠栦滑鏄綉緇滃瓧 鑺傞『搴忋?<br />鏈鍚庝竴鐐癸細涓轟粈涔堝湪鏁版嵁緇撴瀯 struct sockaddr_in 涓紝 sin_addr 鍜?sin_port 闇瑕佽漿鎹負緗戠粶瀛楄妭欏哄簭錛岃?sin_family 涓嶉渶瑕佸憿? 絳旀鏄細sin_addr 鍜? sin_port 鍒嗗埆灝佽鍦ㄥ寘鐨?IP 鍜?UDP 灞傘傚洜姝わ紝浠栦滑蹇呴』瑕佹槸緗戠粶瀛楄妭欏哄簭銆?浣嗘槸 sin_family 鍩熷彧鏄鍐呮牳 (kernel) 浣跨敤鏉ュ喅瀹氬湪鏁版嵁緇撴瀯涓寘鍚粈涔堢被鍨嬬殑鍦板潃錛屾墍浠ヤ粬搴旇鏄湰鏈哄瓧鑺傞『搴忋備篃鍗?sin_family 娌℃湁 鍙? 閫佸埌緗戠粶涓婏紝浠栦滑鍙互鏄湰鏈哄瓧鑺傞『搴忋?<br />----------------------------------------------------------------------------<br />IP 鍦板潃鍜屽浣曞鐞嗕粬浠?<br />鐜板湪鎴戜滑寰堝垢榪愶紝鍥犱負鎴戜滑鏈夊緢澶氱殑鍑芥暟鏉ユ柟渚垮湴鎿嶄綔 IP 鍦板潃銆傛病鏈夊繀瑕佺敤鎵嬪伐璁$畻 浠栦滑錛屼篃娌℃湁蹇呰鐢?<< 鎿嶄綔絎︽潵鎿嶄綔 long銆?<br />棣? 鍏堬紝鍋囪浣犵敤 struct sockaddr_in ina錛屼綘鎯沖皢 IP 鍦板潃 "132.241.5.10" 鍌ㄥ瓨鍒板叾涓備綘瑕佺敤鐨勫嚱鏁版槸 inet_addr()錛岃漿鎹?numbers-and-dots 鏍煎紡鐨?IP 鍦板潃鍒?unsigned long銆傝繖涓伐浣滃彲浠ヨ繖鏍鋒潵鍋氾細 <br /> ina.sin_addr.s_addr = inet_addr("132.241.5.10"); <br />娉ㄦ剰錛歩net_addr() 榪斿洖鐨勫湴鍧宸茬粡鏄寜鐓х綉緇滃瓧鑺傞『搴忕殑錛屼綘娌℃湁蹇呰鍐嶅幓璋冪敤 htonl()銆?<br />涓? 闈㈢殑浠g爜鍙笉鏄緢鍋ュ. (robust)錛屽洜涓烘病鏈夐敊璇鏌ャ俰net_addr() 鍦ㄥ彂鐢熼敊璇?鐨勬椂鍊欒繑鍥?1銆傝寰椾簩榪涘埗鏁板悧? 鍦?IP 鍦板潃涓?255.255.255.255 鐨勬椂鍊欒繑鍥炵殑鏄?(unsigned)-1錛佽繖鏄釜騫挎挱鍦板潃錛佽浣忔紜殑浣跨敤閿欒媯鏌ャ?<br />濂戒簡錛屼綘鐜? 鍦ㄥ彲浠ヨ漿鎹㈠瓧絎︿覆褰㈠紡鐨?IP 鍦板潃涓?long 浜嗐傞偅涔堜綘鏈変竴涓暟鎹粨鏋?struct in_addr錛岃濡備綍鎸夌収 numbers-and-dots 鏍煎紡鎵撳嵃鍛? 鍦ㄨ繖涓?鏃跺欙紝涔熻浣犺鐢ㄥ嚱鏁?inet_ntoa() ("ntoa" 鎰忔濇槸 "network to ascii")錛?<br /> printf("%s",inet_ntoa(ina.sin_addr)); <br />浠栧皢鎵撳嵃 IP 鍦板潃銆傛敞鎰忕殑鏄細鍑芥暟 inet_ntoa() 鐨勫弬鏁版槸 struct in_addr錛岃屼笉鏄? long銆傚悓鏃惰娉ㄦ剰鐨勬槸浠栬繑鍥炵殑鏄竴涓寚鍚戝瓧絎︾殑鎸囬拡銆?鍦?inet_ntoa 鍐呴儴鐨勬寚閽堥潤鎬佸湴鍌ㄥ瓨瀛楃鏁扮粍錛屽洜姝ゆ瘡嬈′綘璋冪敤 inet_ntoa() 鐨勬椂鍊欎粬灝嗚鐩栦互鍓嶇殑鍐呭銆備緥濡傦細 <br /> char *a1, *a2; <br /> . <br /> . <br /> a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */ <br /> a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */ <br /> printf("address 1: %s\n",a1); <br /> printf("address 2: %s\n",a2); <br />榪愯緇撴灉鏄細 <br /> address 1: 132.241.5.10 <br /> address 2: 132.241.5.10 <br />濡傛灉浣犳兂淇濆瓨鍦板潃錛岄偅涔堢敤 strcpy() 淇濆瓨鍒拌嚜宸辯殑瀛楃鏁扮粍涓?<br />榪欏氨鏄繖绔犵殑鍐呭浜嗐備互鍚庯紝鎴戜滑灝嗗涔犺漿鎹?"whitehouse.gov" 褰㈠紡鐨勫瓧絎︿覆鍒版紜?鐨?IP 鍦板潃(璇風湅鍚庨潰鐨?DNS 涓绔犮? <br />----------------------------------------------------------------------------<br />socket()--寰楀埌鏂囦歡鎻忚堪絎︼紒 <br />鎴戠寽鎴戜笉浼氬啀鎵繙浜?-鎴戝繀欏昏 socket() 榪欎釜緋葷粺璋冪敤浜嗐傝繖閲屾槸璇︾粏鐨勫畾涔夛細 <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> int socket(int domain, int type, int protocol); <br />浣? 鏄粬浠殑鍙傛暟鎬庝箞鐢? 棣栧厛錛宒omain 搴旇璁劇疆鎴?"AF_INET"錛屽氨璞′笂闈㈢殑 鏁版嵁緇撴瀯 struct sockaddr_in 涓竴鏍楓傜劧鍚庯紝鍙傛暟 type 鍛婅瘔鍐呮牳鏄?SOCK_STREAM 綾誨瀷榪樻槸 SOCK_DGRAM 綾誨瀷銆傛渶鍚庯紝鎶?protocol 璁劇疆涓? "0"銆?娉ㄦ剰錛氭湁寰堝縐?domain銆乼ype錛?鎴戜笉鍙兘涓涓鍒楀嚭浜嗭紝璇風湅 socket() 鐨?man page銆傚綋鐒訛紝榪樻湁涓涓?鏇村ソ"鐨勬柟寮?鍘誨緱鍒?protocol銆傝鐪?getprotobyname() 鐨?man page銆? <br />socket() 鍙槸榪斿洖浣犱互鍚庡湪緋葷粺璋冪敤縐嶅彲鑳界敤鍒扮殑 socket 鎻忚堪絎︼紝鎴栬呭湪閿欒 鐨勬椂鍊欒繑鍥?1銆傚叏灞鍙橀噺 errno 涓偍瀛橀敊璇箋?璇峰弬鑰?perror() 鐨?man page銆? <br />----------------------------------------------------------------------------<br />bind()--鎴戝湪鍝釜绔彛? <br />涓 鏃︿綘寰楀埌濂楁帴鍙o紝浣犲彲鑳借灝嗗鎺ュ彛鍜屾満鍣ㄤ笂鐨勪竴瀹氱殑绔彛鍏寵仈璧鋒潵銆?濡傛灉浣犳兂鐢?listen() 鏉ヤ睛鍚竴瀹氱鍙g殑鏁版嵁錛岃繖鏄繀瑕佷竴姝?-MUD 緇忓父鍛婅瘔浣犺鐢ㄥ懡浠?"telnet x.y.z 6969".)濡傛灉浣犲彧鎯崇敤 connect()錛岄偅涔堣繖涓楠ゆ病鏈夊繀瑕併備絾鏄棤璁哄浣曪紝璇風戶緇涓嬪幓銆?<br />榪欓噷鏄郴緇熻皟鐢?bind() 鐨勫ぇ鐣ワ細 <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> int bind(int sockfd, struct sockaddr *my_addr, int addrlen); <br />sockfd 鏄皟鐢?socket 榪斿洖鐨勬枃浠舵弿榪扮銆俶y_addr 鏄寚鍚?鏁版嵁緇撴瀯 struct sockaddr 鐨勬寚閽堬紝浠栦繚瀛樹綘鐨勫湴鍧(鍗崇鍙e拰 IP 鍦板潃) 淇℃伅銆俛ddrlen 璁劇疆涓?sizeof(struct sockaddr)銆?<br />綆鍗曞緱寰堜笉鏄悧? 鍐嶇湅鐪嬩緥瀛愶細 <br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> #define MYPORT 3490 <br /> main() <br /> { <br /> int sockfd; <br /> struct sockaddr_in my_addr; <br /> sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ <br /> my_addr.sin_family = AF_INET; /* host byte order */ <br /> my_addr.sin_port = htons(MYPORT); /* short, network byte order */ <br /> my_addr.sin_addr.s_addr = inet_addr("132.241.5.10"); <br /> bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> /* don't forget your error checking for bind(): */ <br /> bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); <br /> . <br /> . <br /> . <br />榪欓噷涔熸湁瑕佹敞鎰忕殑鍑犱歡浜嬫儏銆俶y_addr.sin_port 鏄綉緇滃瓧鑺傞『搴忥紝my_addr.sin_addr.s_addr 涔熸槸鐨勩傚彟澶栬娉ㄦ剰鍒扮殑浜嬫儏鏄洜緋葷粺鐨勪笉鍚岋紝 鍖呭惈鐨勫ご鏂囦歡涔熶笉灝界浉鍚岋紝璇鋒煡闃呰嚜宸辯殑 man page銆?<br />鍦?bind() 涓婚涓渶鍚庤璇寸殑璇濇槸錛屽湪澶勭悊鑷繁鐨?IP 鍦板潃鍜?鎴栫鍙g殑鏃跺欙紝鏈変簺宸ヤ綔 鏄彲浠ヨ嚜鍔ㄥ鐞嗙殑銆?<br /> my_addr.sin_port = 0; /* choose an unused port at random */ <br /> my_addr.sin_addr.s_addr = INADDR_ANY; /* use my IP address */ <br />閫氳繃灝?璧嬬粰 my_addr.sin_port錛屼綘鍛婅瘔 bind() 鑷繁閫夋嫨鍚堥傜殑绔彛銆傚悓鏍鳳紝 灝?y_addr.sin_addr.s_addr 璁劇疆涓?INADDR_ANY錛屼綘鍛婅瘔浠栬嚜鍔ㄥ~涓?浠栨墍榪愯鐨勬満鍣ㄧ殑 IP 鍦板潃銆?<br />濡傛灉浣犱竴鍚戝皬蹇冭皚鎱庯紝閭d箞浣犲彲鑳芥敞鎰忓埌鎴戞病鏈夊皢 INADDR_ANY 杞崲涓虹綉緇滃瓧鑺傞『搴忥紒榪欐槸鍥犱負鎴戠煡閬撳唴閮ㄧ殑涓滆タ錛欼NADDR_ANY 瀹為檯涓婂氨鏄?0錛佸嵆浣夸綘 鏀瑰彉瀛楄妭鐨勯『搴忥紝0渚濈劧鏄?銆備絾鏄畬緹庝富涔夎呰瀹夊叏絎竴錛岄偅涔堢湅涓嬮潰鐨勪唬鐮侊細 <br /> my_addr.sin_port = htons(0); /* choose an unused port at random */ <br /> my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* use my IP address */ <br />浣犲彲鑳戒笉鐩鎬俊錛屼笂闈㈢殑浠g爜灝嗗彲浠ラ殢渚跨Щ妞嶃?<br />bind() 鍦ㄩ敊璇殑鏃跺欎緷鐒舵槸榪斿洖-1錛屽茍涓旇緗叏灞鍙橀噺 errno銆?<br />鍦ㄤ綘璋冪敤 bind() 鐨勬椂鍊欙紝浣犺灝忓績鐨勫彟涓浠朵簨鎯呮槸錛氫笉瑕侀噰鐢ㄥ皬浜?024鐨勭鍙e彿銆傛墍鏈夊皬浜?024鐨勭鍙e彿閮?琚郴緇熶繚鐣欙紒浣犲彲浠ラ夋嫨浠?024鍒?5535(濡傛灉浠栦滑娌℃湁琚埆鐨勭▼搴忎嬌鐢ㄧ殑璇?銆?<br />浣? 瑕佹敞鎰忕殑鍙﹀涓浠跺皬浜嬫槸錛氭湁鏃跺欎綘鏍規湰涓嶉渶瑕佽皟鐢ㄤ粬銆傚鏋滀綘浣跨敤 connect() 鏉ュ拰榪滅▼鏈哄櫒閫氳錛屼綘涓嶈鍏沖績浣犵殑鏈湴绔彛鍙?灝辮薄浣犲湪浣跨敤 telnet 鐨勬椂鍊?錛屼綘鍙 綆鍗曠殑璋冪敤 connect() 灝卞鍙紝浠栦細媯鏌ュ鎺ュ彛鏄惁緇戝畾錛屽鏋滄病鏈夛紝浠栦細鑷繁緇戝畾 涓涓病鏈変嬌鐢ㄧ殑鏈湴绔彛銆?<br />----------------------------------------------------------------------------<br />connect()--Hello錛?<br />鐜? 鍦ㄦ垜浠亣璁句綘鏄釜 telnet 紼嬪簭銆備綘鐨勭敤鎴峰懡浠や綘(灝辮薄鐢靛獎 TRON 涓竴鏍?寰楀埌濂楁帴鍙?鐨勬枃浠舵弿榪扮銆備綘鍚粠鍛戒護璋冪敤浜? socket()銆備笅涓姝ワ紝浣犵殑鐢ㄦ埛鍛婅瘔浣犻氳繃绔彛23(鏍?鍑?telnet 绔彛)榪炴帴鍒?132.241.5.10"銆備綘璇ユ庝箞鍋氬憿? <br />騫歌繍鐨勬槸錛屼綘姝e湪鐤媯鍦伴槄璇?connect()--濡備綍榪炴帴鍒拌繙紼嬩富鏈鴻繖涓绔犮備綘鍙笉鎯寵 浣犵殑鐢ㄦ埛澶辨湜銆?<br />connect() 緋葷粺璋冪敤鏄繖鏍風殑錛?<br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); <br />sockfd 鏄郴緇熻皟鐢?socket() 榪斿洖鐨勫鎺ュ彛鏂囦歡鎻忚堪絎︺俿erv_addr 鏄繚瀛樼潃鐩殑鍦扮鍙e拰 IP 鍦板潃鐨勬暟鎹粨鏋?struct sockaddr銆俛ddrlen 璁劇疆涓?sizeof(struct sockaddr)銆?<br />璁╂垜浠潵鐪嬩釜渚嬪瓙錛?<br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> #define DEST_IP "132.241.5.10" <br /> #define DEST_PORT 23 <br /> main() <br /> { <br /> int sockfd; <br /> struct sockaddr_in dest_addr; /* will hold the destination addr */ <br /> sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ <br /> dest_addr.sin_family = AF_INET; /* host byte order */ <br /> dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */ <br /> dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); <br /> bzero(&(dest_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> /* don't forget to error check the connect()! */ <br /> connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); <br /> . <br /> . <br /> . <br />鍐嶄竴嬈★紝浣犲簲璇ユ鏌?connect() 鐨勮繑鍥炲?-浠栧湪閿欒鐨勬椂鍊欒繑鍥?1錛屽茍 璁劇疆鍏ㄥ眬鍙橀噺 errno銆?<br />鍚屾椂錛屼綘鍙兘鐪嬪埌錛屾垜娌℃湁璋冪敤 bind()銆傚彟澶栵紝鎴戜篃娌℃湁綆℃湰鍦扮殑绔彛鍙楓傛垜鍙叧蹇?鎴戝湪榪炴帴銆傚唴鏍稿皢涓烘垜閫夋嫨涓涓悎閫傜殑绔彛鍙鳳紝鑰屾垜浠墍榪炴帴鐨勫湴鏂逛篃鑷姩鍦拌幏寰楄繖浜涗俊鎭?<br />----------------------------------------------------------------------------<br />listen()--Will somebody please call me? <br />Ok, time for a change of pace. What if you don't want to connect to a remote host. Say, just for kicks, that you want to wait for incoming connections and handle them in some way. 澶勭悊榪囩▼鍒嗕袱姝ワ細棣栧厛錛屼綘鍚?-listen()錛岀劧鍚庯紝浣犳帴鍙?-accept() (璇風湅 涓嬮潰鐨勫唴瀹?銆?<br />闄や簡瑕佷竴鐐硅В閲婂錛岀郴緇熻皟鐢?listen 鐩稿綋綆鍗曘?<br /> int listen(int sockfd, int backlog); <br />sockfd 鏄皟鐢?socket() 榪斿洖鐨勫鎺ュ彛鏂囦歡鎻忚堪絎︺俠acklog 鏄?鍦ㄨ繘鍏ラ槦鍒椾腑鍏佽鐨勮繛鎺ユ暟鐩傛槸浠涔堟剰鎬濆憿? 榪涘叆鐨勮繛鎺ユ槸鍦ㄩ槦鍒椾腑涓鐩寸瓑寰呯洿鍒頒綘鎺ュ彈 (accept() 璇風湅涓嬮潰鐨勬枃绔?鐨勮繛鎺ャ備粬浠殑鏁扮洰闄愬埗浜庨槦鍒楃殑鍏佽銆傚ぇ澶氭暟緋葷粺鐨勫厑璁告暟鐩槸20錛屼綘涔熷彲浠ヨ緗負5鍒?0銆?<br />鍜屽埆鐨勫嚱鏁頒竴鏍鳳紝鍦ㄥ彂鐢熼敊璇殑鏃跺欒繑鍥?1錛屽茍璁劇疆鍏ㄥ眬鍙橀噺 errno銆?<br />浣犲彲鑳芥兂璞″埌浜嗭紝鍦ㄤ綘璋冪敤 listen() 鍓嶄綘鎴栬呰璋冪敤 bind() 鎴栬呰 鍐呮牳闅忎究閫夋嫨涓涓鍙c傚鏋滀綘鎯充睛鍚繘鍏ョ殑榪炴帴錛岄偅涔堢郴緇熻皟鐢ㄧ殑欏哄簭鍙兘鏄繖鏍風殑錛?<br /> socket(); <br /> bind(); <br /> listen(); <br /> /* accept() goes here */ <br />鍥犱負浠栫浉褰撶殑鏄庝簡錛屾垜灝嗗湪榪欓噷涓嶇粰鍑轟緥瀛愪簡銆?鍦?accept() 閭d竴绔犵殑浠g爜灝嗘洿鍔?瀹屽叏銆?鐪熸楹葷儲鐨勯儴鍒嗗湪 accept()銆?<br />----------------------------------------------------------------------------<br />accept()--"Thank you for calling port 3490." <br />鍑? 澶囧ソ浜嗭紝緋葷粺璋冪敤 accept() 浼氭湁鐐瑰彜鎬殑鍦版柟鐨勶紒浣犲彲浠ユ兂璞″彂鐢熻繖鏍風殑浜嬫儏錛?鏈変漢浠庡緢榪滅殑鍦版柟閫氳繃涓涓綘鍦ㄤ睛鍚?(listen()) 鐨勭鍙h繛鎺?(connect()) 鍒頒綘鐨勬満鍣ㄣ備粬鐨勮繛鎺ュ皢鍔犲叆鍒扮瓑寰呮帴鍙?(accept()) 鐨勯槦鍒椾腑銆備綘璋冪敤 accept() 鍛婅瘔浠栦綘鏈夌┖闂茬殑榪炴帴銆備粬灝嗚繑鍥炰竴涓柊鐨勫鎺ュ彛鏂囦歡鎻忚堪絎︼紒 鍘熸潵鐨勪竴涓繕鍦ㄤ睛鍚綘鐨勯偅涓鍙o紝鏂扮殑鏈鍚庡湪鍑嗗鍙戦?(send()) 鍜屾帴鏀?( recv()) 鏁版嵁銆傝繖灝辨槸榪欎釜榪囩▼錛?<br />鍑芥暟鏄繖鏍峰畾涔夌殑錛?<br /> #include <sys/socket.h> <br /> int accept(int sockfd, void *addr, int *addrlen); <br />sockfd 鐩稿綋綆鍗曪紝鏄拰 listen() 涓竴鏍風殑濂楁帴鍙f弿榪扮銆俛ddr 鏄釜鎸囧悜灞閮ㄧ殑鏁版嵁緇撴瀯 struct sockaddr_in 鐨勬寚閽堛俆his is where the information about the incoming connection will go (and you can determine which host is calling you from which port). 鍦ㄤ粬鐨勫湴鍧浼犻掔粰 accept 涔嬪墠錛宎ddrlen 鏄釜灞閮ㄧ殑鏁村艦鍙橀噺錛岃緗負 sizeof(struct sockaddr_in)銆俛ccept 灝?涓嶄細灝嗗浣欑殑瀛楄妭緇?addr銆傚鏋滀綘鏀懼叆鐨勫皯浜涳紝閭d箞鍦?addrlen 鐨勫間腑鍙嶆槧 鍑烘潵銆?<br />鍚屾牱錛屽湪閿欒鏃惰繑鍥?1騫惰緗叏灞鍙橀噺 errno銆?<br />鐜板湪鏄綘搴旇鐔熸倝鐨勪唬鐮佺墖孌點?<br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <sys/socket.h> <br /> #define MYPORT 3490 /* the port users will be connecting to */ <br /> #define BACKLOG 10 /* how many pending connections queue will hold */ <br /> main() <br /> { <br /> int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ <br /> struct sockaddr_in my_addr; /* my address information */ <br /> struct sockaddr_in their_addr; /* connector's address information */ <br /> int sin_size; <br /> sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */ <br /> my_addr.sin_family = AF_INET; /* host byte order */ <br /> my_addr.sin_port = htons(MYPORT); /* short, network byte order */ <br /> my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ <br /> bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> /* don't forget your error checking for these calls: */ <br /> bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); <br /> listen(sockfd, BACKLOG); <br /> sin_size = sizeof(struct sockaddr_in); <br /> new_fd = accept(sockfd, &their_addr, &sin_size); <br /> . <br /> . <br /> . <br />娉ㄦ剰錛屽湪緋葷粺璋冪敤 send() 鍜?recv() 涓綘搴旇浣跨敤鏂扮殑鏂囦歡鎻忚堪絎︺?濡傛灉浣犲彧鎯寵涓涓繛鎺ヨ繘鏉ワ紝閭d箞浣犲彲浠ヤ嬌鐢?close() 鍘誨叧闂師鏉ョ殑鏂囦歡鎻忚堪 絎?sockfd 鏉ラ伩鍏嶅悓涓涓鍙f洿澶氱殑榪炴帴銆?<br />----------------------------------------------------------------------------<br />send() and recv()--Talk to me, baby! <br />榪欎袱涓嚱鏁扮敤浜庢祦寮忓鎺ュ彛鍜屾暟鎹姤濂楁帴鍙g殑閫氳銆傚鏋滀綘鍠滄浣跨敤鏃犺繛鎺ョ殑鏁版嵁鎶?濂楁帴鍙o紝浣犲簲璇ョ湅涓鐪嬩笅闈㈠叧浜?sendto() 鍜?recvfrom() 鐨勭珷鑺傘?<br />send() 鏄繖鏍風殑錛?<br /> int send(int sockfd, const void *msg, int len, int flags); <br />sockfd 鏄綘鎯沖彂閫佹暟鎹殑濂楁帴鍙f弿榪扮(鎴栬呮槸璋冪敤 socket() 鎴栬呮槸 accept() 榪斿洖鐨勩?msg 鏄寚鍚戜綘鎯沖彂閫佺殑鏁版嵁鐨勬寚閽堛俵en 鏄? 鏁版嵁鐨勯暱搴︺傛妸 flags 璁劇疆涓?0 灝卞彲浠ヤ簡銆?璇︾粏鐨勮祫鏂欒鐪?send() 鐨?man page)銆?<br />榪欓噷鏄竴浜涘彲鑳界殑渚嬪瓙錛?<br /> char *msg = "Beej was here!"; <br /> int len, bytes_sent; <br /> . <br /> . <br /> len = strlen(msg); <br /> bytes_sent = send(sockfd, msg, len, 0); <br /> . <br />. <br /> . <br />send() 榪斿洖瀹為檯鍙戦佺殑鏁版嵁鐨勫瓧鑺傛暟--浠栧彲鑳藉皬浜庝綘瑕佹眰鍙戦佺殑鏁扮洰錛佷篃鍗充綘鍛婅瘔浠栬鍙戦佷竴鍫嗘暟鎹彲鏄粬涓嶈兘澶勭悊鎴愬姛銆備粬鍙槸鍙戦佷粬鍙兘鍙戦佺殑鏁版嵁錛岀劧鍚? 甯屾湜浣犱互鍚庤兘澶熷彂閫佸叾浠栫殑鏁版嵁銆傝浣忥紝濡傛灉 send() 榪斿洖鐨勬暟鎹拰 len 涓? 鍖歸厤錛屼綘搴旇鍙戦佸叾浠栫殑鏁版嵁銆備絾鏄繖閲屼篃鏈変釜濂芥秷鎭細濡傛灉浣犺鍙戦佺殑鍖呭緢灝?灝忎簬澶х害 1K)錛屼粬鍙兘澶勭悊璁╂暟鎹竴嬈″彂閫佸畬銆傛渶鍚庯紝鍦ㄩ敊璇殑鏃跺欒繑鍥?1錛屽茍璁劇疆 errno銆?<br />recv() 鍑芥暟寰堢浉浼鹼細 <br /> int recv(int sockfd, void *buf, int len, unsigned int flags); <br />sockfd 鏄璇葷殑濂楁帴鍙f弿榪扮銆俠uf 鏄璇葷殑淇℃伅鐨勭紦鍐層俵en 鏄?緙撳啿鐨勬渶澶ч暱搴︺俧lags 涔熷彲浠ヨ緗負0銆?璇峰弬鑰價ecv() 鐨?man page銆? <br />recv() 榪斿洖瀹為檯璇誨叆緙撳啿鐨勬暟鎹殑瀛楄妭鏁般傛垨鑰呭湪閿欒鐨勬椂鍊欒繑鍥?1錛屽悓鏃惰緗?errno銆?<br />寰堢畝鍗曪紝涓嶆槸鍚? 浣犵幇鍦ㄥ彲浠ュ湪嫻佸紡濂楁帴鍙d笂鍙戦佹暟鎹拰鎺ユ敹鏁版嵁浜嗐備綘鐜板湪鏄?Unix 緗戠粶紼嬪簭鍛樹簡錛?<br />----------------------------------------------------------------------------<br />sendto() 鍜?recvfrom()--Talk to me, DGRAM-style <br />"榪欏緢涓嶉敊鍟?錛屾垜鍚埌浣犺錛?浣嗘槸浣犺繕娌℃湁璁叉棤榪炴帴鏁版嵁鎶ュ鎺ュ彛鍛€?娌¢棶棰橈紝鐜板湪鎴戜滑寮濮?榪欎釜鍐呭銆?<br />鏃㈢劧鏁版嵁鎶ュ鎺ュ彛涓嶆槸榪炴帴鍒拌繙紼嬩富鏈虹殑錛岄偅涔堝湪鎴戜滑鍙戦佷竴涓寘涔嬪墠闇瑕佷粈涔堜俊鎭憿? 涓嶉敊錛屾槸鐩爣鍦板潃錛佺湅涓嬮潰鐨勶細 <br /> int sendto(int sockfd, const void *msg, int len, unsigned int flags, <br /> const struct sockaddr *to, int tolen); <br />浣? 宸茬粡鐪嬪埌浜嗭紝闄や簡鍙﹀鐨勪袱涓俊鎭錛屽叾浣欑殑鍜屽嚱鏁?send() 鏄竴鏍風殑銆?to 鏄釜鎸囧悜鏁版嵁緇撴瀯 struct sockaddr 鐨勬寚閽堬紝浠栧寘鍚簡鐩殑鍦扮殑 IP 鍦板潃鍜屾柇鍙d俊鎭倀olen 鍙互綆鍗曞湴璁劇疆涓?sizeof(struct sockaddr)銆?<br />鍜屽嚱鏁?send() 綾諱技錛宻endto() 榪斿洖瀹為檯鍙戦佺殑瀛楄妭鏁?浠栦篃鍙兘灝忎簬浣?鎯寵鍙戦佺殑瀛楄妭鏁幫紒)錛屾垨鑰呭湪閿欒鐨勬椂鍊欒繑鍥?-1銆?<br />鐩鎬技鐨勮繕鏈夊嚱鏁?recv() 鍜?recvfrom()銆俽ecvfrom() 鐨勫畾涔夋槸 榪欐牱鐨勶細 <br /> int recvfrom(int sockfd, void *buf, int len, unsigned int flags <br /> struct sockaddr *from, int *fromlen); <br />鍙? 涓嬈★紝闄や簡涓鐐瑰浣欑殑鍙傛暟澶栵紝榪欎釜鍑芥暟鍜?recv() 涔熸槸涓鏍風殑銆俧rom 鏄?涓涓寚鍚戝眬閮ㄦ暟鎹粨鏋?struct sockaddr 鐨勬寚閽堬紝浠栫殑鍐呭鏄簮鏈哄櫒 鐨?IP 鍦板潃鍜岀鍙d俊鎭俧romlen 鏄釜 int 鍨嬬殑灞閮ㄦ寚閽堬紝浠栫殑鍒濆鍊?涓?sizeof(struct sockaddr)銆傚嚱鏁拌皟鐢ㄥ悗錛宖romlen 淇濆瓨鐫 瀹為檯鍌ㄥ瓨鍦?from 涓殑鍦板潃鐨勯暱搴︺?<br />recvfrom() 榪斿洖鏀跺埌鐨勫瓧鑺傞暱搴︼紝鎴栬呭湪鍙戠敓閿欒鍚庤繑鍥?-1銆?<br />璁頒綇錛屽鏋滀綘鏄敤 connect() 榪炴帴涓涓暟鎹姤濂楁帴鍙o紝浣犲彲浠ョ畝鍗曠殑璋冪敤 send() 鍜?recv() 鏉ユ弧瓚充綘鐨勮姹傘傝繖涓椂鍊欎緷鐒舵槸鏁版嵁鎶ュ鎺ュ彛錛屼緷鐒朵嬌鐢?UDP錛岀郴緇?鑷姩鐨勫姞涓婁簡鐩爣鍜屾簮鐨勪俊鎭?<br />----------------------------------------------------------------------------<br />close() 鍜?shutdown()--Get outta my face! <br />浣犲凡緇忔暣澶╅兘鍦ㄥ彂閫?(send()) 鍜屾帴鏀?(recv()) 鏁版嵁浜嗭紝鐜板湪浣犲噯澶?鍏抽棴浣犵殑濂楁帴鍙f弿榪扮浜嗐傝繖寰堢畝鍗曪紝浣犲彲浠ヤ嬌鐢ㄤ竴鑸殑 Unix 鏂囦歡鎻忚堪絎︾殑 close() 鍑?鏁幫細 <br /> close(sockfd); <br />浠栧皢闃叉濂楁帴鍙d笂鏇村鐨勬暟鎹殑璇誨啓銆備換浣曞湪鍙︿竴绔鍐欏鎺ュ彛鐨勪紒鍥鵑兘灝嗚繑鍥為敊璇俊鎭?<br />濡傛灉浣犳兂鍦ㄥ浣曞叧闂鎺ュ彛涓婃湁澶氫竴鐐圭殑鎺у埗錛屼綘鍙互浣跨敤鍑芥暟 shutdown()銆備粬鑳藉璁?浣犲皢涓瀹氭柟鍚戠殑閫氳鎴栬呭弻鍚戠殑閫氳(灝辮薄 close() 涓鏍?鍏抽棴錛屼綘鍙互浣跨敤錛?<br /> int shutdown(int sockfd, int how); <br />sockfd 鏄綘鎯寵鍏抽棴鐨勫鎺ュ彛鏂囦歡鎻忚堪澶嶃俬ow 鐨勫兼槸涓嬮潰鐨勫叾涓箣涓錛?<br />0 - Further receives are disallowed <br />1 - Further sends are disallowed <br />2 - Further sends and receives are disallowed (鍜?close() 涓鏍?<br />shutdown() 鎴愬姛鏃惰繑鍥?0錛屽け璐ユ椂榪斿洖 -1(鍚屾椂璁劇疆 errno銆? <br />濡傛灉鍦ㄦ棤榪炴帴鐨勬暟鎹姤濂楁帴鍙d腑浣跨敤 shutdown()錛岄偅涔堝彧涓嶈繃鏄 send() 鍜?recv() 涓嶈兘浣跨敤(璁板緱浣犲湪鏁版嵁鎶ュ鎺ュ彛涓嬌鐢ㄤ簡 connect 鍚庢槸鍙互 浣跨敤浠栦滑鐨勫悧?) <br />----------------------------------------------------------------------------<br />getpeername()--Who are you? <br />榪欎釜鍑芥暟澶畝鍗曚簡銆?<br />浠栧お綆鍗曚簡錛屼互鑷蟲垜閮戒笉鎯沖崟鍒椾竴绔犮備絾鏄垜榪樻槸榪欐牱鍋氫簡銆?<br />鍑芥暟 getpeername() 鍛婅瘔浣犲湪榪炴帴鐨勬祦寮忓鎺ュ彛涓婅皝鍦ㄥ彟澶栦竴杈廣傚嚱鏁版槸榪欐牱鐨勶細 <br /> #include <sys/socket.h> <br /> int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); <br />sockfd 鏄繛鎺ョ殑嫻佸紡濂楁帴鍙g殑鎻忚堪絎︺俛ddr 鏄竴涓寚鍚戠粨鏋?struct sockaddr (鎴栬呮槸 struct sockaddr_in) 鐨勬寚閽堬紝浠栦繚瀛樼潃 榪炴帴鐨勫彟涓杈圭殑淇℃伅銆俛ddrlen 鏄竴涓?int 鍨嬬殑鎸囬拡錛屼粬鍒濆鍖栦負 sizeof(struct sockaddr)銆?<br />鍑芥暟鍦ㄩ敊璇殑鏃跺欒繑鍥?-1錛岃緗浉搴旂殑 errno銆?<br />涓 鏃︿綘鑾峰緱浠栦滑鐨勫湴鍧錛屼綘鍙互浣跨敤 inet_ntoa() 鎴栬?gethostbyaddr() 鏉ユ墦鍗版垨鑰呰幏寰楁洿澶氱殑淇℃伅銆備絾鏄綘涓嶈兘寰楀埌浠栫殑甯愬彿銆?濡傛灉浠栬繍琛岀潃鎰氳牏鐨勫畧鎶よ繘紼嬶紝榪欐槸 鍙兘鐨勶紝浣嗘槸浠栫殑璁ㄨ宸茬粡瓚呭嚭浜嗘湰鏂囩殑鑼冨洿錛岃鍙傝? RFC-1413 浠ヨ幏寰楁洿澶氱殑淇℃伅銆? <br />------------------------------------------------------------------------------- <br />gethostname()--Who am I? <br />鐢氳嚦姣?getpeername() 榪樼畝鍗曠殑鍑芥暟鏄?gethostname()銆備粬榪斿洖浣犵▼搴?鎵榪愯鐨勬満鍣ㄧ殑涓繪満鍚嶅瓧銆傜劧鍚庝綘鍙互浣跨敤 gethostbyname() 浠ヨ幏寰椾綘鐨勬満鍣ㄧ殑 IP 鍦板潃銆?<br />涓嬮潰鏄畾涔夛細 <br /> #include <unistd.h> <br /> int gethostname(char *hostname, size_t size); <br />鍙傛暟寰堢畝鍗曪細hostname 鏄竴涓瓧絎︽暟緇勬寚閽堬紝浠栧皢鍦ㄥ嚱鏁拌繑鍥炴椂淇濆瓨 涓繪満鍚嶃俿ize 鏄?hostname 鏁扮粍鐨勫瓧鑺傞暱搴︺?<br />鍑芥暟璋冪敤鎴愬姛鏃惰繑鍥?0錛屽け璐ユ椂榪斿洖 -1錛屽茍璁劇疆 errno銆?<br />-------------------------------------------------------------------------------- <br />DNS--You say "whitehouse.gov", I say "198.137.240.100" <br />濡? 鏋滀綘涓嶇煡閬?DNS 鐨勬剰鎬濓紝閭d箞鎴戝憡璇変綘錛屼粬浠h〃"鍩熷悕鏈嶅姟 (Domain Name Service)"銆備粬涓昏鐨勫姛鑳芥槸錛氫綘緇欎粬涓涓鏄撹蹇嗙殑鏌愮珯鐐圭殑鍦板潃錛屼粬緇欎綘 IP 鍦板潃(鐒跺悗浣犲氨鍙互 浣跨敤 bind(), connect(), sendto() 鎴栬呭叾浠栧嚱鏁般?褰撲竴涓漢 杈撳叆錛?<br /> $ telnet whitehouse.gov <br />telnet 鑳界煡閬撲粬灝嗚繛鎺?(connect()) 鍒?"198.137.240.100"銆?<br />浣嗘槸榪欐槸濡備綍宸ヤ綔鐨勫憿? 浣犲彲浠ヨ皟鐢ㄥ嚱鏁?gethostbyname()錛?<br /> #include <netdb.h> <br /> struct hostent *gethostbyname(const char *name); <br />寰堟槑鐧界殑鏄紝浠栬繑鍥炰竴涓寚鍚?struct hostent 鐨勬寚閽堛傝繖涓暟鎹粨鏋勬槸 榪欐牱鐨勶細 <br /> struct hostent { <br /> char *h_name; <br /> char **h_aliases; <br /> int h_addrtype; <br /> int h_length; <br /> char **h_addr_list; <br /> }; <br /> #define h_addr h_addr_list[0] <br />榪欓噷鏄繖涓暟鎹粨鏋勭殑璇︾粏璧勬枡錛?struct hostent: <br />h_name - Official name of the host. <br />h_aliases - A NULL-terminated array of alternate names for the host. <br />h_addrtype - The type of address being returned; usually AF_INET. <br />h_length - The length of the address in bytes. <br />h_addr_list - A zero-terminated array of network addresses for the host. Host addresses are in Network Byte Order. <br />h_addr - The first address in h_addr_list. <br />gethostbyname() 鎴愬姛鏃惰繑鍥炰竴涓寚鍚?struct hostent 鐨?鎸囬拡錛屾垨鑰呮槸涓┖ (NULL) 鎸囬拡銆?浣嗘槸鍜屼互鍓嶄笉鍚岋紝errno 涓嶈緗紝h_errno 璁劇疆閿欒淇℃伅銆傝鐪嬩笅闈㈢殑 herror()銆? <br />浣嗘槸濡備綍浣跨敤鍛? 榪欎釜鍑芥暟鍙笉璞′粬鐪嬩笂鍘婚偅涔堥毦鐢ㄣ?<br />榪欓噷鏄釜渚嬪瓙錛?<br /> #include <stdio.h> <br /> #include <stdlib.h> <br /> #include <errno.h> <br /> #include <netdb.h> <br /> #include <sys/types.h> <br /> #include <netinet/in.h> <br /> int main(int argc, char *argv[]) <br /> { <br /> struct hostent *h; <br /> if (argc != 2) { /* error check the command line */ <br /> fprintf(stderr,"usage: getip address\n"); <br /> exit(1); <br /> } <br /> if ((h=gethostbyname(argv[1])) == NULL) { /* get the host info */ <br /> herror("gethostbyname"); <br /> exit(1); <br /> } <br /> printf("Host name : %s\n", h->h_name); <br /> printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr))); <br /> return 0; <br /> } <br />鍦ㄤ嬌鐢?gethostbyname() 鐨勬椂鍊欙紝浣犱笉鑳界敤 perror() 鎵撳嵃閿欒淇℃伅(鍥?涓?errno 娌℃湁浣跨敤)錛屼綘搴旇璋冪敤 herror()銆?<br />鐩稿綋綆鍗曪紝浣犲彧鏄紶閫掍竴涓繚瀛樻満鍣ㄥ悕鐨勮嚜璐熶覆(渚嬪 "whitehouse.gov") 緇?gethostbyname()錛岀劧鍚庝粠榪斿洖鐨勬暟鎹粨鏋?struct hostent 涓?鏀墮泦淇℃伅銆?<br />鍞竴璁╀漢榪鋒儜鐨勬槸鎵撳嵃 IP 鍦板潃淇℃伅銆俬->h_addr 鏄竴涓?char *錛?浣嗘槸 inet_ntoa() 闇瑕佺殑鏄?struct in_addr銆傚洜姝わ紝鎴?杞崲 h->h_addr 鎴?struct in_addr *錛岀劧鍚庡緱鍒版暟鎹?<br />-------------------------------------------------------------------------------- <br />Client-Server Background <br />榪? 閲屾槸涓鎴?-鏈嶅姟鍣ㄧ殑涓栫晫銆傚湪緗戠粶涓婄殑鎵鏈変笢瑗塊兘鏄湪澶勭悊瀹㈡埛榪涚▼鍜屾湇鍔″櫒榪涚▼鐨勪氦璋堛?涓句釜 telnet 鐨勪緥瀛愩傚綋浣犵敤 telnet (瀹㈡埛)閫氳繃 23 鍙風鍙g櫥闄嗗埌涓繪満錛屼富鏈轟笂榪愯 鐨勪竴涓▼搴?涓鑸彨 telnetd錛屾湇鍔″櫒)嬋媧匯備粬澶勭悊榪欎釜榪炴帴錛屾樉紺虹櫥闄嗙晫闈紝絳夌瓑銆?<br />Figure 2. The Client-Server Relationship. <br />鍥?2 璇存槑浜嗗鎴峰拰鏈嶅姟鍣ㄤ箣闂寸殑淇℃伅浜ゆ崲銆?<br />娉? 鎰忥紝瀹?-鏈嶅姟鍣ㄤ箣闂村彲浠ヤ嬌鐢⊿OCK_STREAM銆丼OCK_DGRAM 鎴栬呭叾浠?鍙浠栦滑閲囩敤鐩稿悓鐨?銆備竴浜涘緢濂界殑瀹㈡埛--鏈嶅姟鍣ㄧ殑渚嬪瓙鏈? telnet/telnetd銆?ftp/ftpd 鍜?bootp/bootpd銆傛瘡嬈′綘浣跨敤 ftp 鐨?鏃跺欙紝鍦ㄨ繙绔兘鏈変竴涓?ftpd 涓轟綘鏈嶅姟銆?<br />涓鑸紝鍦ㄦ湇鍔$鍙湁涓涓湇鍔″櫒錛屼粬閲囩敤 fork() 鏉ュ鐞嗗涓鎴風殑榪炴帴銆傚熀鏈殑 紼嬪簭鏄細鏈嶅姟鍣ㄧ瓑寰呬竴涓繛鎺ワ紝鎺ュ彈 (accept()) 榪炴帴錛岀劧鍚?fork() 涓涓?瀛愯繘紼嬪鐞嗕粬銆傝繖鏄笅涓绔犳垜浠殑渚嬪瓙涓細璁插埌鐨勩?<br />-------------------------------------------------------------------------------- <br />綆鍗曠殑鏈嶅姟鍣?<br />榪欎釜鏈嶅姟鍣ㄦ墍鍋氱殑鍏ㄩ儴宸ヤ綔鏄湪鐣欏紡榪炴帴涓婂彂閫佸瓧絎︿覆 "Hello, World!\n"銆備綘瑕?嫻嬭瘯榪欎釜紼嬪簭鐨勮瘽錛屽彲浠ュ湪涓鍙版満鍣ㄤ笂榪愯璇ョ▼搴忥紝鐒跺悗鍦ㄥ彟澶栦竴鏈哄櫒涓婄櫥闄嗭細 <br /> $ telnet remotehostname 3490 <br />remotehostname 鏄紼嬪簭榪愯鐨勬満鍣ㄧ殑鍚嶅瓧銆?<br />鏈嶅姟鍣ㄤ唬鐮侊細 <br /> #include <stdio.h> <br /> #include <stdlib.h> <br /> #include <errno.h> <br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <netinet/in.h> <br /> #include <sys/socket.h> <br /> #include <sys/wait.h> <br /> #define MYPORT 3490 /* the port users will be connecting to */ <br /> #define BACKLOG 10 /* how many pending connections queue will hold */ <br /> main() <br /> { <br /> int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ <br /> struct sockaddr_in my_addr; /* my address information */ <br /> struct sockaddr_in their_addr; /* connector's address information */ <br /> int sin_size; <br /> if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { <br /> perror("socket"); <br /> exit(1); <br /> } <br /> my_addr.sin_family = AF_INET; /* host byte order */ <br /> my_addr.sin_port = htons(MYPORT); /* short, network byte order */ <br /> my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ <br /> bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ <br /> == -1) { <br /> perror("bind"); <br /> exit(1); <br /> } <br /> if (listen(sockfd, BACKLOG) == -1) { <br /> perror("listen"); <br /> exit(1); <br /> } <br /> while(1) { /* main accept() loop */ <br /> sin_size = sizeof(struct sockaddr_in); <br /> if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ <br /> &sin_size)) == -1) { <br /> perror("accept"); <br /> continue; <br /> } <br /> printf("server: got connection from %s\n", \ <br /> inet_ntoa(their_addr.sin_addr)); <br /> if (!fork()) { /* this is the child process */ <br /> if (send(new_fd, "Hello, world!\n", 14, 0) == -1) <br /> perror("send"); <br /> close(new_fd); <br /> exit(0); <br /> } <br /> close(new_fd); /* parent doesn't need this */ <br /> while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ <br /> } <br /> } <br />濡傛灉浣犲緢鎸戝墧鐨勮瘽錛屼竴瀹氫笉婊℃剰鎴戞墍鏈夌殑浠g爜閮藉湪涓涓緢澶х殑 main() 鍑芥暟 涓傚鏋滀綘涓嶅枩嬈紝鍙互鍒掑垎寰楁洿緇嗙偣銆?<br />浣犱篃鍙互鐢ㄦ垜浠笅涓绔犱腑鐨勭▼搴忓緱鍒版湇鍔″櫒绔彂閫佺殑瀛楃涓層?<br />-------------------------------------------------------------------------------- <br />綆鍗曠殑瀹㈡埛紼嬪簭 <br />榪欎釜紼嬪簭姣旀湇鍔″櫒榪樼畝鍗曘傝繖涓▼搴忕殑鎵鏈夊伐浣滄槸閫氳繃 3490 绔彛榪炴帴鍒板懡浠よ涓埗瀹氱殑涓繪満錛?鐒跺悗寰楀埌鏈嶅姟鍣ㄧ殑瀛楃涓層?<br />瀹㈡埛浠g爜: <br /> #include <stdio.h> <br /> #include <stdlib.h> <br /> #include <errno.h> <br /> #include <string.h> <br /> #include <netdb.h> <br /> #include <sys/types.h> <br /> #include <netinet/in.h> <br /> #include <sys/socket.h> <br /> #define PORT 3490 /* the port client will be connecting to */ <br /> #define MAXDATASIZE 100 /* max number of bytes we can get at once */ <br /> int main(int argc, char *argv[]) <br /> { <br /> int sockfd, numbytes; <br /> char buf[MAXDATASIZE]; <br /> struct hostent *he; <br /> struct sockaddr_in their_addr; /* connector's address information */ <br /> if (argc != 2) { <br /> fprintf(stderr,"usage: client hostname\n"); <br /> exit(1); <br /> } <br /> if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ <br /> herror("gethostbyname"); <br /> exit(1); <br /> } <br /> if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { <br /> perror("socket"); <br /><br /> exit(1); <br /><br /> } <br /><br /> their_addr.sin_family = AF_INET; /* host byte order */ <br /><br /> their_addr.sin_port = htons(PORT); /* short, network byte order */ <br /><br /> their_addr.sin_addr = *((struct in_addr *)he->h_addr); <br /><br /> bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ <br /><br /> if (connect(sockfd, (struct sockaddr *)&their_addr, \ <br /> sizeof(struct sockaddr)) == -1) { <br /> perror("connect"); <br /> exit(1); <br /> } <br /> if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { <br /> perror("recv"); <br /> exit(1); <br /> } <br /> buf[numbytes] = '\0'; <br /> printf("Received: %s",buf); <br /> close(sockfd); <br /> return 0; <br /> } <br />娉ㄦ剰錛屽鏋滀綘鍦ㄨ繍琛屾湇鍔″櫒涔嬪墠榪愯瀹㈡埛紼嬪簭錛宑onnect() 灝嗚繑鍥?"Connection refused" 淇℃伅銆?<br />-------------------------------------------------------------------------------- <br />鏁版嵁鎶?Sockets <br />鎴戜笉鎯寵鏇村浜嗭紝鎵浠ユ垜緇欏嚭浠g爜 talker.c 鍜?listener.c銆?<br />listener 鍦ㄦ満鍣ㄤ笂絳夊緟鍦ㄧ鍙?4590 鏉ョ殑鏁版嵁鍖呫倀alker 鍙戦佹暟鎹寘鍒頒竴瀹氱殑 鏈哄櫒錛屼粬鍖呭惈鐢ㄦ埛鍦ㄥ懡浠よ杈撳叆鐨勪笢瑗褲?<br />榪欓噷灝辨槸 listener.c錛?<br /> #include <stdio.h> <br /> #include <stdlib.h> <br /> #include <errno.h> <br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <netinet/in.h> <br /> #include <sys/socket.h> <br /> #include <sys/wait.h> <br /> #define MYPORT 4950 /* the port users will be sending to */ <br /> #define MAXBUFLEN 100 <br /> main() <br /> { <br /> int sockfd; <br /> struct sockaddr_in my_addr; /* my address information */ <br /> struct sockaddr_in their_addr; /* connector's address information */ <br /> int addr_len, numbytes; <br /> char buf[MAXBUFLEN]; <br /> if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { <br /> perror("socket"); <br /> exit(1); <br /> } <br /> my_addr.sin_family = AF_INET; /* host byte order */ <br /> my_addr.sin_port = htons(MYPORT); /* short, network byte order */ <br /> my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ <br /> bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ <br /> == -1) { <br /> perror("bind"); <br /> exit(1); <br /> } <br /> addr_len = sizeof(struct sockaddr); <br /> if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \ <br /> (struct sockaddr *)&their_addr, &addr_len)) == -1) { <br /> perror("recvfrom"); <br /> exit(1); <br /> } <br /> printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr)); <br /> printf("packet is %d bytes long\n",numbytes); <br /> buf[numbytes] = '\0'; <br /> printf("packet contains \"%s\"\n",buf); <br /> close(sockfd); <br /> } <br />娉ㄦ剰鍦ㄦ垜浠殑璋冪敤 socket()錛屾垜浠渶鍚庝嬌鐢ㄤ簡 SOCK_DGRAM銆傚悓鏃訛紝娌℃湁 蹇呰鍘諱嬌鐢?listen() 鎴栬?accept()銆傛垜浠湪浣跨敤鏃犺繛鎺ョ殑鏁版嵁鎶ュ鎺ュ彛錛?<br />涓嬮潰鏄?talker.c錛?<br /> #include <stdio.h> <br /> #include <stdlib.h> <br /> #include <errno.h> <br /> #include <string.h> <br /> #include <sys/types.h> <br /> #include <netinet/in.h> <br /> #include <netdb.h> <br /> #include <sys/socket.h> <br /> #include <sys/wait.h> <br /> #define MYPORT 4950 /* the port users will be sending to */ <br /> int main(int argc, char *argv[]) <br /> { <br /> int sockfd; <br /> struct sockaddr_in their_addr; /* connector's address information */ <br /> struct hostent *he; <br /> int numbytes; <br /> if (argc != 3) { <br /> fprintf(stderr,"usage: talker hostname message\n"); <br /> exit(1); <br /> } <br /> if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */ <br /> herror("gethostbyname"); <br /> exit(1); <br /> } <br /> if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { <br /> perror("socket"); <br /> exit(1); <br /> } <br /> their_addr.sin_family = AF_INET; /* host byte order */ <br /> their_addr.sin_port = htons(MYPORT); /* short, network byte order */ <br /> their_addr.sin_addr = *((struct in_addr *)he->h_addr); <br /> bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ <br /> if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \ <br /> (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) { <br /> perror("sendto"); <br /> exit(1); <br /> } <br /> printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr)); <br /> close(sockfd); <br /> return 0; <br /> } <br />榪欏氨鏄墍鏈夌殑浜嗐傚湪涓鍙版満鍣ㄤ笂榪愯 listener錛岀劧鍚庡湪鍙﹀涓鍙版満鍣ㄤ笂榪愯 talker銆傝瀵熶粬浠殑閫氳錛?<br />Except for one more tiny detail that I've mentioned many times in the past: connected datagram sockets. I need to talk about this here, since we're in the datagram section of the document. Let's say that talker calls connect() and specifies the listener's address. From that point on, talker may only sent to and receive from the address specified by connect(). For this reason, you don't have to use sendto() and recvfrom(); you can simply use send() and recv(). <br />-------------------------------------------------------------------------------- <br />闃誨 <br />闃? 濉烇紝浣犱篃璁告棭灝卞惉璇翠簡銆?闃誨"鏄?"sleep" 鐨勭鎶琛岃瘽銆備綘鍙兘娉ㄦ剰鍒板墠闈㈣繍琛岀殑 listener 紼嬪簭錛屼粬鍦ㄩ偅閲屼笉鍋滃湴榪愯錛岀瓑寰呮暟鎹寘鐨勫埌鏉ャ傚疄闄呭湪榪愯鐨勬槸 浠栬皟鐢?recvfrom()錛岀劧鍚庢病鏈夋暟鎹紝鍥犳 recvfrom() 璇?闃誨 (block)" 鐩村埌鏁版嵁鐨勫埌鏉ャ?<br />寰堝鍑芥暟閮藉埄鐢ㄩ樆濉炪俛ccept() 闃誨錛屾墍鏈夌殑 recv*() 鍑芥暟闃誨銆備粬浠箣鎵浠ヨ兘榪欐牱鍋氭槸鍥犱負浠栦滑琚厑璁歌繖鏍峰仛銆傚綋浣犵涓嬈¤皟鐢?socket() 寤虹珛濂楁帴鍙f弿榪扮鐨勬椂鍊欙紝鍐呮牳灝卞皢浠栬緗負闃誨銆傚鏋滀綘涓嶆兂濂楁帴鍙i樆濉烇紝浣犲氨瑕佽皟鐢ㄥ嚱鏁?fcntl()錛?<br /> #include <unistd.h> <br /> #include <fcntl.h> <br /> . <br /> . <br /> sockfd = socket(AF_INET, SOCK_STREAM, 0); <br /> fcntl(sockfd, F_SETFL, O_NONBLOCK); <br /> . <br /> . <br />閫氳繃璁劇疆濂楁帴鍙d負闈為樆濉烇紝浣犺兘澶熸湁鏁堝湴"璇㈤棶"濂楁帴鍙d互鑾峰緱淇℃伅銆傚鏋滀綘灝濊瘯鐫 浠庝竴涓潪闃誨鐨勫鎺ュ彛璇諱俊鎭茍涓旀病鏈変換浣曟暟鎹紝浠栦笉浼氬彉鎴愰樆濉?-浠栧皢榪斿洖 -1 騫?灝?errno 璁劇疆涓?EWOULDBLOCK銆?<br />浣嗘槸涓鑸鏉ワ紝榪欑杞涓嶆槸涓ソ涓繪剰銆傚鏋滀綘璁╀綘鐨勭▼搴忓湪蹇欑瓑鐘舵佹煡璇㈠鎺ュ彛鐨勬暟鎹紝 浣犲皢嫻垂澶ч噺鐨?CPU 鏃墮棿銆傛洿濂界殑瑙e喅涔嬮亾鏄敤涓嬩竴绔犺鐨?select() 鍘繪煡璇?鏄惁鏈夋暟鎹璇昏繘鏉ャ?<br />-------------------------------------------------------------------------------- <br />select()--澶氳礬鍚屾 I/O <br />铏界劧榪欎釜鍑芥暟鏈夌偣濂囨紝浣嗘槸浠栧緢鏈夌敤銆傚亣璁捐繖鏍風殑鎯呭喌錛氫綘鏄釜鏈嶅姟鍣紝浣犱竴杈瑰湪涓嶅仠鍦?浠庤繛鎺ヤ笂璇繪暟鎹紝涓杈瑰湪渚﹀惉榪炴帴涓婄殑淇℃伅銆?<br />娌? 闂錛屼綘鍙兘浼氳錛屼笉灝辨槸涓涓?accept() 鍜屼袱涓?recv() 鍚? 榪欎箞瀹規槗 鍚楋紝鏈嬪弸? 濡傛灉浣犲湪璋冪敤 accept() 鐨勬椂鍊欓樆濉炲憿? 浣犳庝箞鑳藉鍚屾椂鎺ュ彈 recv() 鏁版嵁? "鐢ㄩ潪闃誨鐨勫鎺ュ彛鍟婏紒" 涓嶈錛佷綘涓嶆兂鑰楀敖鎵鏈夌殑 CPU錛屼笉鏄悧? 閭d箞錛岃濡備綍鏄ソ? <br />select() 璁╀綘鍙互鍚屾椂鐩戣澶氫釜濂楁帴鍙c傚鏋滀綘鎯崇煡閬撶殑璇濓紝閭d箞浠栧氨浼氬憡璇変綘鍝釜濂楁帴鍙e噯澶囪錛屽摢涓張 鍑嗗濂戒簡鍐欙紝鍝釜濂楁帴鍙e張鍙戠敓浜嗕緥澶?(exception)銆?<br />闂茶瘽灝戣錛屼笅闈㈡槸 select()錛?<br /> #include <sys/time.h> <br /> #include <sys/types.h> <br /> #include <unistd.h> <br /> int select(int numfds, fd_set *readfds, fd_set *writefds, <br /> fd_set *exceptfds, struct timeval *timeout); <br />榪? 涓嚱鏁扮洃瑙嗕竴緋誨垪鏂囦歡鎻忚堪絎︼紝鐗瑰埆鏄?readfds銆亀ritefds 鍜?exceptfds銆傚鏋滀綘鎯崇煡閬撲綘鏄惁鑳藉浠庢爣鍑嗚緭鍏ュ拰濂楁帴鍙f弿榪扮 sockfd 璇?鍏ユ暟鎹紝浣犲彧瑕佸皢鏂囦歡鎻忚堪絎?0 鍜?sockfd 鍔犲叆鍒伴泦鍚?readfds 涓?鍙傛暟 numfds 搴旇絳変簬鏈楂樼殑鏂囦歡鎻忚堪絎︾殑鍊煎姞1銆傚湪榪欎釜渚嬪瓙涓紝浣犲簲璇ヨ緗鍊?涓?sockfd+1銆傚洜涓轟粬涓瀹氬ぇ浜庢爣鍑嗚緭鍏ョ殑鏂囦歡鎻忚堪絎?(0)銆?<br />褰撳嚱鏁?select() 榪斿洖鐨勬椂鍊欙紝readfds 鐨勫間慨鏀逛負鍙嶆槧浣犻夋嫨鐨勫摢涓枃浠?鎻忚堪絎﹀彲浠ヨ銆備綘鍙互鐢ㄤ笅闈㈣鍒扮殑瀹?FD_ISSET() 鏉ユ祴璇曘?<br />鍦ㄦ垜浠戶緇笅鍘諱箣鍓嶏紝璁╂垜鏉ヨ璁插浣曞榪欎簺闆嗗悎榪涜鎿嶄綔銆傛瘡涓泦鍚堢被鍨嬮兘鏄?fd_set銆?涓嬮潰鏈変竴浜涘畯鏉ュ榪欎釜綾誨瀷榪涜鎿嶄綔錛?<br />FD_ZERO(fd_set *set) - clears a file descriptor set <br />FD_SET(int fd, fd_set *set) - adds fd to the set <br />FD_CLR(int fd, fd_set *set) - removes fd from the set <br />FD_ISSET(int fd, fd_set *set) - tests to see if fd is in the set <br />鏈 鍚庯紝鏄湁鐐瑰彜鎬殑鏁版嵁緇撴瀯 struct timeval銆傛湁鏃朵綘鍙笉鎯蟲案榪滅瓑寰呭埆浜哄彂閫佹暟鎹繃鏉ャ備篃璁鎬粈涔堜簨鎯呴兘娌℃湁鍙戠敓鐨勬椂鍊欎綘涔熸兂姣忛殧96縐掑湪緇堢 涓婃墦鍗板瓧絎︿覆 "Still Going..."銆傝繖涓暟鎹粨鏋勫厑璁鎬綘璁懼畾涓涓椂闂達紝濡傛灉鏃墮棿鍒頒簡錛?鑰?select() 榪樻病鏈夋壘鍒頒竴涓噯澶囧ソ鐨勬枃浠舵弿榪扮錛屼粬灝嗚繑鍥炶浣犵戶緇鐞嗐?<br />鏁版嵁緇撴瀯 struct timeval 鏄繖鏍風殑錛?<br /> struct timeval { <br /> int tv_sec; /* seconds */ <br /> int tv_usec; /* microseconds */ <br /> }; <br />鍙? 瑕佸皢 tv_sec 璁劇疆涓轟綘瑕佺瓑寰呯殑縐掓暟錛屽皢 tv_usec 璁劇疆涓轟綘瑕佺瓑寰呯殑寰鏁板氨鍙互浜嗐傛槸鐨勶紝鏄井縐掕屼笉鏄縐掋?,000寰絳変簬1璞錛?,000姣絳変簬1縐掋備篃灝辨槸璇達紝1縐掔瓑浜?,000,000寰? 縐掋備負浠涔堢敤絎﹀彿 "usec" 鍛? 瀛楁瘝 "u" 寰堣薄甯岃厞瀛楁瘝 Mu錛?鑰?Mu 琛ㄧず "寰? 鐨勬剰鎬濄傚綋鐒訛紝鍑芥暟榪斿洖鐨勬椂鍊?timeout 鍙兘鏄墿浣欑殑 鏃墮棿錛屼箣鎵浠ユ槸鍙兘錛屾槸鍥犱負浠栦緷璧栦簬浣犵殑 Unix 鎿嶄綔緋葷粺銆?<br />鍝堬紒鎴戜滑鐜板湪鏈変竴涓井縐掔駭鐨勫畾鏃跺櫒錛佷笉瑕佽綆椾簡錛屾爣鍑嗙殑 Unix 緋葷粺鐨勬椂闂寸墖鏄?00姣錛屾墍浠?鏃犺浣犲浣曡緗綘鐨勬暟鎹粨鏋?struct timeval錛屼綘閮借絳夊緟閭d箞闀跨殑 鏃墮棿銆?<br />榪? 鏈変竴浜涙湁瓚g殑浜嬫儏錛氬鏋滀綘璁劇疆鏁版嵁緇撴瀯 struct timeval 涓殑 鏁版嵁涓?0錛宻elect() 灝嗙珛鍗寵秴鏃訛紝榪欐牱灝卞彲浠ユ湁鏁堝湴杞闆嗗悎涓殑 鎵鏈夌殑鏂囦歡鎻忚堪絎︺傚鏋滀綘灝嗗弬鏁?timeout 璧嬪間負 NULL錛岄偅涔堝皢姘歌繙涓嶄細鍙戠敓瓚呮椂錛屽嵆涓鐩寸瓑鍒扮涓涓枃浠舵弿榪扮灝辯華銆傛渶鍚庯紝濡傛灉浣犱笉鏄緢鍏沖績絳夊緟澶氶暱鏃墮棿錛岄偅涔?灝辨妸浠栬祴涓?NULL 鍚с?<br />涓嬮潰鐨勪唬鐮佹紨紺轟簡鍦ㄦ爣鍑嗚緭鍏ヤ笂絳夊緟 2.5 縐掞細 <br /> #include <sys/time.h> <br /> #include <sys/types.h> <br /> #include <unistd.h> <br /> #define STDIN 0 /* file descriptor for standard input */ <br /> main() <br /> { <br /> struct timeval tv; <br /> fd_set readfds; <br /> tv.tv_sec = 2; <br /> tv.tv_usec = 500000; <br /> FD_ZERO(&readfds); <br /> FD_SET(STDIN, &readfds); <br /> /* don't care about writefds and exceptfds: */ <br /> select(STDIN+1, &readfds, NULL, NULL, &tv); <br /> if (FD_ISSET(STDIN, &readfds)) <br /> printf("A key was pressed!\n"); <br /> else <br /> printf("Timed out.\n"); <br /> } <br />濡傛灉浣犳槸鍦ㄤ竴涓?line buffered 緇堢涓婏紝閭d箞浣犳暡鐨勯敭搴旇鏄洖杞?(RETURN)錛屽惁鍒欐棤璁哄浣?浠栭兘浼氳秴鏃躲?<br />鐜板湪錛屼綘鍙兘鍥炶涓鴻繖灝辨槸鍦ㄦ暟鎹姤濂楁帴鍙d笂絳夊緟鏁版嵁鐨勬柟寮?-浣犳槸瀵圭殑錛氫粬鍙兘鏄?鏈変簺 Unix 緋葷粺鍙互鎸夎繖縐嶆柟寮忥紝鑰屽彟澶栦竴浜涘垯涓嶈兘銆備綘鍦ㄥ皾璇曚互鍓嶅彲鑳借鍏堢湅鐪嬫湰緋葷粺 鐨?man page 浜嗐?<br />鏈鍚庝竴浠跺叧浜?select() 鐨勪簨鎯咃細濡傛灉浣犳湁涓涓鍦ㄤ睛鍚?(listen()) 鐨勫鎺ュ彛錛屼綘鍙互閫氳繃灝嗚濂楁帴鍙g殑鏂囦歡鎻忚堪絎﹀姞鍏ュ埌 readfds 闆嗗悎涓潵鐪?鏄惁鏈夋柊鐨勮繛鎺ャ?<br />榪欏氨鏄垜鍏充簬鍑芥暟 select() 瑕佽鐨勬墍鏈夌殑涓滆タ銆?img src ="http://m.shnenglu.com/lmlf001/aggbug/6370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lmlf001/" target="_blank">鑺ヤ箣鑸?/a> 2006-04-27 12:11 <a href="http://m.shnenglu.com/lmlf001/archive/2006/04/27/6370.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux緗戠粶緙栫▼-- 鏈嶅姟鍣ㄦā鍨嬶紙ZZ錛?/title><link>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6369.html</link><dc:creator>鑺ヤ箣鑸?/dc:creator><author>鑺ヤ箣鑸?/author><pubDate>Thu, 27 Apr 2006 03:58:00 GMT</pubDate><guid>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6369.html</guid><wfw:comment>http://m.shnenglu.com/lmlf001/comments/6369.html</wfw:comment><comments>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lmlf001/comments/commentRss/6369.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lmlf001/services/trackbacks/6369.html</trackback:ping><description><![CDATA[ <p align="left"> <font size="4">鍘熸枃鍦板潃錛歨ttp://study.pay500.com/1/s12212.htm<br /></font> </p> <p align="center"> <font size="4">Linux緗戠粶緙栫▼--9. 鏈嶅姟鍣ㄦā鍨?/font> <br /> <br /> </p> <br /> 瀛︿範榪囥婅蔣浠跺伐紼嬨嬪惂.杞歡宸ョ▼鍙槸姣忎竴涓▼搴忓憳"蹇呬慨"鐨勮紼嬪晩.濡傛灉浣犳病鏈夊涔犺繃, 寤鴻浣犲幓鐪嬩竴鐪? 鍦ㄨ繖涓绔犻噷闈?鎴戜滑涓璧鋒潵浠庤蔣浠跺伐紼嬬殑瑙掑害瀛︿範緗戠粶緙栫▼鐨勬濇兂.鍦ㄦ垜浠啓紼嬪簭涔嬪墠, 鎴戜滑閮藉簲璇ヤ粠杞歡宸ョ▼鐨勮搴﹁鍒掑ソ鎴戜滑鐨勮蔣浠?榪欐牱鎴戜滑寮鍙戣蔣浠剁殑鏁堢巼鎵嶄細楂? 鍦ㄧ綉緇滅▼搴忛噷闈?涓鑸殑鏉ヨ閮芥槸璁稿瀹㈡埛鏈哄搴斾竴涓湇鍔″櫒.涓轟簡澶勭悊瀹㈡埛鏈虹殑璇鋒眰, 瀵規湇鍔$鐨勭▼搴忓氨鎻愬嚭浜嗙壒孌婄殑瑕佹眰.鎴戜滑瀛︿範涓涓嬬洰鍓嶆渶甯哥敤鐨勬湇鍔″櫒妯″瀷. <br /><br />寰幆鏈嶅姟鍣?寰幆鏈嶅姟鍣ㄥ湪鍚屼竴涓椂鍒誨彧鍙互鍝嶅簲涓涓鎴風鐨勮姹? <br /><br />騫跺彂鏈嶅姟鍣?騫跺彂鏈嶅姟鍣ㄥ湪鍚屼竴涓椂鍒誨彲浠ュ搷搴斿涓鎴風鐨勮姹? <br /><br /><br />9.1 寰幆鏈嶅姟鍣?UDP鏈嶅姟鍣? <br />UDP寰幆鏈嶅姟鍣ㄧ殑瀹炵幇闈炲父綆鍗?UDP鏈嶅姟鍣ㄦ瘡嬈′粠濂楁帴瀛椾笂璇誨彇涓涓鎴風鐨勮姹?澶勭悊, 鐒跺悗灝嗙粨鏋滆繑鍥炵粰瀹㈡埛鏈? <br /><br />鍙互鐢ㄤ笅闈㈢殑綆楁硶鏉ュ疄鐜? <br /><br /> socket(...); <br /> bind(...); <br /> while(1) <br /> { <br /> recvfrom(...); <br /> process(...); <br /> sendto(...); <br /> } <br /><br />鍥犱負UDP鏄潪闈㈠悜榪炴帴鐨?娌℃湁涓涓鎴風鍙互鑰佹槸鍗犱綇鏈嶅姟绔? 鍙澶勭悊榪囩▼涓嶆槸姝誨驚鐜? 鏈嶅姟鍣ㄥ浜庢瘡涓涓鎴鋒満鐨勮姹傛繪槸鑳藉婊¤凍. <br />9.2 寰幆鏈嶅姟鍣?TCP鏈嶅姟鍣? <br />TCP寰幆鏈嶅姟鍣ㄧ殑瀹炵幇涔熶笉闅?TCP鏈嶅姟鍣ㄦ帴鍙椾竴涓鎴風鐨勮繛鎺?鐒跺悗澶勭悊,瀹屾垚浜嗚繖涓鎴風殑鎵鏈夎姹傚悗,鏂紑榪炴帴. <br /><br />綆楁硶濡備笅: <br /><br /> socket(...); <br /> bind(...); <br /> listen(...); <br /> while(1) <br /> { <br /> accept(...); <br /> while(1) <br /> { <br /> read(...); <br /> process(...); <br /> write(...); <br /> } <br /> close(...); <br /> } <br /><br />TCP寰幆鏈嶅姟鍣ㄤ竴嬈″彧鑳藉鐞嗕竴涓鎴風鐨勮姹?鍙湁鍦ㄨ繖涓鎴風殑鎵鏈夎姹傞兘婊¤凍鍚? 鏈嶅姟鍣ㄦ墠鍙互緇х畫鍚庨潰鐨勮姹?榪欐牱濡傛灉鏈変竴涓鎴風鍗犱綇鏈嶅姟鍣ㄤ笉鏀炬椂,鍏跺畠鐨勫鎴鋒満閮戒笉鑳藉伐浣滀簡.鍥犳,TCP鏈嶅姟鍣ㄤ竴鑸緢灝戠敤寰幆鏈嶅姟鍣ㄦā鍨嬬殑. <br /><br />9.3 騫跺彂鏈嶅姟鍣?TCP鏈嶅姟鍣? <br />涓轟簡寮ヨˉ寰幆TCP鏈嶅姟鍣ㄧ殑緙洪櫡,浜轟滑鍙堟兂鍑轟簡騫跺彂鏈嶅姟鍣ㄧ殑妯″瀷. 騫跺彂鏈嶅姟鍣ㄧ殑鎬濇兂鏄瘡涓涓鎴鋒満鐨勮姹傚茍涓嶇敱鏈嶅姟鍣ㄧ洿鎺ュ鐞?鑰屾槸鏈嶅姟鍣ㄥ垱寤轟竴涓?瀛愯繘紼嬫潵澶勭悊. <br /><br />綆楁硶濡備笅: <br /><br /> socket(...); <br /> bind(...); <br /> listen(...); <br /> while(1) <br /> { <br /> accept(...); <br /> if(fork(..)==0) <br /> { <br /> while(1) <br /> { <br /> read(...); <br /> process(...); <br /> write(...); <br /> } <br /> close(...); <br /> exit(...); <br /> } <br /> close(...); <br /> } <br /><br />TCP騫跺彂鏈嶅姟鍣ㄥ彲浠ヨВ鍐砊CP寰幆鏈嶅姟鍣ㄥ鎴鋒満鐙崰鏈嶅姟鍣ㄧ殑鎯呭喌. 涓嶈繃涔熷悓鏃跺甫鏉ヤ簡涓涓笉灝忕殑闂.涓轟簡鍝嶅簲瀹㈡埛鏈虹殑璇鋒眰,鏈嶅姟鍣ㄨ鍒涘緩瀛愯繘紼嬫潵澶勭悊. 鑰屽垱寤哄瓙榪涚▼鏄竴縐嶉潪甯告秷鑰楄祫婧愮殑鎿嶄綔. <br /><br />9.4 騫跺彂鏈嶅姟鍣?澶氳礬澶嶇敤I/O <br />涓轟簡瑙e喅鍒涘緩瀛愯繘紼嬪甫鏉ョ殑緋葷粺璧勬簮娑堣?浜轟滑鍙堟兂鍑轟簡澶氳礬澶嶇敤I/O妯″瀷. <br /><br />棣栧厛浠嬬粛涓涓嚱鏁皊elect <br /><br /> int select(int nfds,fd_set *readfds,fd_set *writefds, <br /> fd_set *except fds,struct timeval *timeout) <br /> void FD_SET(int fd,fd_set *fdset) <br /> void FD_CLR(int fd,fd_set *fdset) <br /> void FD_ZERO(fd_set *fdset) <br /> int FD_ISSET(int fd,fd_set *fdset) <br /><br />涓鑸殑鏉ヨ褰撴垜浠湪鍚戞枃浠惰鍐欐椂,榪涚▼鏈夊彲鑳藉湪璇誨啓鍑洪樆濉?鐩村埌涓瀹氱殑鏉′歡婊¤凍. 姣斿鎴戜滑浠庝竴涓鎺ュ瓧璇繪暟鎹椂,鍙兘緙撳啿鍖洪噷闈㈡病鏈夋暟鎹彲璇?閫氫俊鐨勫鏂硅繕娌℃湁 鍙戦佹暟鎹繃鏉?,榪欎釜鏃跺欐垜浠殑璇昏皟鐢ㄥ氨浼氱瓑寰?闃誨)鐩村埌鏈夋暟鎹彲璇?濡傛灉鎴戜滑涓?甯屾湜闃誨,鎴戜滑鐨勪竴涓夋嫨鏄敤select緋葷粺璋冪敤. 鍙鎴戜滑璁劇疆濂絪elect鐨勫悇涓弬鏁?閭d箞褰撴枃浠跺彲浠ヨ鍐欑殑鏃跺檚elect鍥?閫氱煡"鎴戜滑 璇村彲浠ヨ鍐欎簡. readfds鎵鏈夎璇葷殑鏂囦歡鏂囦歡鎻忚堪絎︾殑闆嗗悎 <br />writefds鎵鏈夎鐨勫啓鏂囦歡鏂囦歡鎻忚堪絎︾殑闆嗗悎 <br /><br />exceptfds鍏朵粬鐨勬湇瑕佸悜鎴戜滑閫氱煡鐨勬枃浠舵弿榪扮 <br /><br />timeout瓚呮椂璁劇疆. <br /><br />nfds鎵鏈夋垜浠洃鎺х殑鏂囦歡鎻忚堪絎︿腑鏈澶х殑閭d竴涓姞1 <br /><br />鍦ㄦ垜浠皟鐢╯elect鏃惰繘紼嬩細涓鐩撮樆濉炵洿鍒頒互涓嬬殑涓縐嶆儏鍐靛彂鐢? 1)鏈夋枃浠跺彲浠ヨ.2)鏈夋枃浠跺彲浠ュ啓.3)瓚呮椂鎵璁劇疆鐨勬椂闂村埌. <br /><br />涓轟簡璁劇疆鏂囦歡鎻忚堪絎︽垜浠浣跨敤鍑犱釜瀹? FD_SET灝唂d鍔犲叆鍒癴dset <br /><br />FD_CLR灝唂d浠巉dset閲岄潰娓呴櫎 <br /><br />FD_ZERO浠巉dset涓竻闄ゆ墍鏈夌殑鏂囦歡鎻忚堪絎? <br /><br />FD_ISSET鍒ゆ柇fd鏄惁鍦╢dset闆嗗悎涓? <br /><br />浣跨敤select鐨勪竴涓緥瀛? <br /><br />int use_select(int *readfd,int n) <br />{ <br /> fd_set my_readfd; <br /> int maxfd; <br /> int i; <br /><br /> maxfd=readfd[0]; <br /> for(i=1;i<br /> if(readfd[i]>maxfd) maxfd=readfd[i]; <br /> while(1) <br /> { <br /> /* 灝嗘墍鏈夌殑鏂囦歡鎻忚堪絎﹀姞鍏? */ <br /> FD_ZERO(&my_readfd); <br /> for(i=0;i<br /> FD_SET(readfd[i],*my_readfd); <br /> /* 榪涚▼闃誨 */ <br /> select(maxfd+1,& my_readfd,NULL,NULL,NULL); <br /> /* 鏈変笢瑗垮彲浠ヨ浜? */ <br /> for(i=0;i<br /> if(FD_ISSET(readfd[i],&my_readfd)) <br /> { <br /> /* 鍘熸潵鏄垜鍙互璇諱簡 */ <br /> we_read(readfd[i]); <br /> } <br /> } <br />} <br /><br />浣跨敤select鍚庢垜浠殑鏈嶅姟鍣ㄧ▼搴忓氨鍙樻垚浜? <br /><br /><br /> 鍒濆璇?socket,bind,listen); <br /><br /> while(1) <br /> { <br /> 璁劇疆鐩戝惉璇誨啓鏂囦歡鎻忚堪絎?FD_*); <br /><br /> 璋冪敤select; <br /><br /> 濡傛灉鏄懼惉濂楁帴瀛楀氨緇?璇存槑涓涓柊鐨勮繛鎺ヨ姹傚緩绔? <br /> { <br /> 寤虹珛榪炴帴(accept); <br /> 鍔犲叆鍒扮洃鍚枃浠舵弿榪扮涓幓; <br /> } <br /> 鍚﹀垯璇存槑鏄竴涓凡緇忚繛鎺ヨ繃鐨勬弿榪扮 <br /> { <br /> 榪涜鎿嶄綔(read鎴栬厀rite); <br /> } <br /><br /> } <br /><br />澶氳礬澶嶇敤I/O鍙互瑙e喅璧勬簮闄愬埗鐨勯棶棰?鐫妯″瀷瀹為檯涓婃槸灝哢DP寰幆妯″瀷鐢ㄥ湪浜員CP涓婇潰. 榪欎篃灝卞甫鏉ヤ簡涓浜涢棶棰?濡傜敱浜庢湇鍔″櫒渚濇澶勭悊瀹㈡埛鐨勮姹?鎵浠ュ彲鑳戒細瀵艱嚧鏈夌殑瀹㈡埛 浼氱瓑寰呭緢涔? <br /><br />9.5 騫跺彂鏈嶅姟鍣?UDP鏈嶅姟鍣? <br />浜轟滑鎶婂茍鍙戠殑姒傚康鐢ㄤ簬UDP灝卞緱鍒頒簡騫跺彂UDP鏈嶅姟鍣ㄦā鍨? 騫跺彂UDP鏈嶅姟鍣ㄦā鍨嬪叾瀹炴槸綆鍗曠殑.鍜屽茍鍙戠殑TCP鏈嶅姟鍣ㄦā鍨嬩竴鏍鋒槸鍒涘緩涓涓瓙榪涚▼鏉ュ鐞嗙殑 綆楁硶鍜屽茍鍙戠殑TCP妯″瀷涓鏍? <br /><br />闄ら潪鏈嶅姟鍣ㄥ湪澶勭悊瀹㈡埛绔殑璇鋒眰鎵鐢ㄧ殑鏃墮棿姣旇緝闀夸互澶?浜轟滑瀹為檯涓婂緢灝戠敤榪欑妯″瀷. <br /><br /><br />9.6 涓涓茍鍙慣CP鏈嶅姟鍣ㄥ疄渚? <br /><br />#include <br />#include <br />#include <br />#include <br />#include <br />#define MY_PORT 8888 <br /><br />int main(int argc ,char **argv) <br />{ <br /> int listen_fd,accept_fd; <br /> struct sockaddr_in client_addr; <br /> int n; <br /><br /> if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0) <br /> { <br /> printf("Socket Error:%s\n\a",strerror(errno)); <br /> exit(1); <br /> } <br /><br /> bzero(&client_addr,sizeof(struct sockaddr_in)); <br /> client_addr.sin_family=AF_INET; <br /> client_addr.sin_port=htons(MY_PORT); <br /> client_addr.sin_addr.s_addr=htonl(INADDR_ANY); <br /> n=1; <br /> /* 濡傛灉鏈嶅姟鍣ㄧ粓姝㈠悗,鏈嶅姟鍣ㄥ彲浠ョ浜屾蹇熷惎鍔ㄨ屼笉鐢ㄧ瓑寰呬竴孌墊椂闂? */ <br /> setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int)); <br /> if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) <br /> { <br /> printf("Bind Error:%s\n\a",strerror(errno)); <br /> exit(1); <br /> } <br /> listen(listen_fd,5); <br /> while(1) <br /> { <br /> accept_fd=accept(listen_fd,NULL,NULL); <br /> if((accept_fd<0)&&(errno==EINTR)) <br /> continue; <br /> else if(accept_fd<0) <br /> { <br /> printf("Accept Error:%s\n\a",strerror(errno)); <br /> continue; <br /> } <br /> if((n=fork())==0) <br /> { <br /> /* 瀛愯繘紼嬪鐞嗗鎴風鐨勮繛鎺?*/ <br /> char buffer[1024]; <br /><br /> close(listen_fd); <br /> n=read(accept_fd,buffer,1024); <br /> write(accept_fd,buffer,n); <br /> close(accept_fd); <br /> exit(0); <br /> } <br /> else if(n<0) <br /> printf("Fork Error:%s\n\a",strerror(errno)); <br /> close(accept_fd); <br /> } <br />} <br /><br />浣犲彲浠ョ敤鎴戜滑鍓嶉潰鍐欏鎴風紼嬪簭鏉ヨ皟璇曠潃紼嬪簭,鎴栬呮槸鐢ㄦ潵telnet璋冭瘯 <img src ="http://m.shnenglu.com/lmlf001/aggbug/6369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lmlf001/" target="_blank">鑺ヤ箣鑸?/a> 2006-04-27 11:58 <a href="http://m.shnenglu.com/lmlf001/archive/2006/04/27/6369.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓涓畝鍗曡亰澶╁鐨勪袱縐嶅疄鐜?(fcntl 鍜?select)(ZZ錛?/title><link>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6368.html</link><dc:creator>鑺ヤ箣鑸?/dc:creator><author>鑺ヤ箣鑸?/author><pubDate>Thu, 27 Apr 2006 03:51:00 GMT</pubDate><guid>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6368.html</guid><wfw:comment>http://m.shnenglu.com/lmlf001/comments/6368.html</wfw:comment><comments>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6368.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/lmlf001/comments/commentRss/6368.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lmlf001/services/trackbacks/6368.html</trackback:ping><description><![CDATA[ <div id="hvzpftn" class="blogbody"> <h2 class="title">涓涓畝鍗曡亰澶╁鐨勪袱縐嶅疄鐜?(fcntl 鍜?select)(杞?</h2> </div> <br /> <font size="2"> 鍦ㄤ簰鑱旂綉鐩稿綋鏅強鐨勪粖澶╋紝鍦ㄤ簰鑱旂綉涓婅亰澶╁寰堝鈥滅綉铏濇潵璇村凡緇忔槸瀹跺父渚塊キ浜嗐傝亰澶╁紼嬪簭鍙互璇存槸緗戜笂鏈綆鍗曠殑澶氱偣閫氫俊紼嬪簭銆傝亰澶╁鐨勫疄鐜版柟娉曟湁寰堝錛屼絾 閮芥槸鍒╃敤鎵璋撶殑鈥滃鐢ㄦ埛絀洪棿鈥濇潵瀵逛俊鎭繘琛屼氦鎹紝鍏鋒湁鍏稿瀷鐨勫璺疘/O鐨勬灦鏋勩備竴涓畝鍗曠殑鑱婂ぉ瀹? 浠庣▼搴忓憳鐨勮鐐規潵鐪嬪氨鏄湪澶氫釜I/O绔偣涔嬮棿瀹炵幇澶氬澶氱殑閫氫俊銆傚叾鏋舵瀯濡傚浘涓鎵紺恒傝繖鏍風殑瀹炵幇鍦ㄧ敤鎴風殑鐪奸噷灝辨槸鑱婂ぉ瀹ゅ唴浠諱綍涓涓漢杈撳叆涓孌靛瓧絎︿箣鍚?鍏朵粬 鐢ㄦ埛閮藉彲浠ュ緱鍒拌繖涓鍙ヨ瘽銆傝繖縐嶁滃鐢ㄦ埛絀洪棿鈥濈殑鏋舵瀯鍦ㄥ叾浠栧鐐歸氫俊紼嬪簭涓簲鐢ㄧ殑闈炲父騫挎硾錛屽叾鏍稿績灝辨槸澶氳礬I/O閫氫俊銆傚璺疘/O閫氫俊鍙堣縐頒負I/O澶氳礬澶? 鐢紙I/O Multiplexing錛変竴鑸浣跨敤鍦ㄤ互涓嬬殑鍦哄悎錛?<br /> 瀹㈡埛紼嬪簭闇瑕佸悓鏃跺鐞嗕氦浜掑紡鐨勮緭鍏ュ拰鍚屾湇鍔″櫒涔嬮棿鐨勭綉緇滆繛鎺ユ椂闇瑕佸鐞咺/O澶氳礬澶嶇敤闂錛?<br /> 瀹㈡埛绔渶瑕佸悓鏃跺澶氫釜緗戠粶榪炴帴浣滃嚭鍙嶅簲錛堣繖縐嶆儏鍐靛緢灝戣錛夛紱 <br /> TCP鏈嶅姟鍣ㄩ渶瑕佸悓鏃跺鐞嗗浜庣洃鍚姸鎬佸拰澶氫釜榪炴帴鐘舵佺殑socket錛?<br /> 鏈嶅姟鍣ㄩ渶瑕佸鐞嗗涓綉緇滃崗璁殑socket; <br /> 鏈嶅姟鍣ㄩ渶瑕佸悓鏃跺鐞嗕笉鍚岀殑緗戠粶鏈嶅姟鍜屽崗璁?<br /> 鑱婂ぉ瀹ゆ墍闇瑕侀潰瀵圭殑鎯呭喌姝f槸絎竴鍜岀涓変袱縐嶆儏鍐點傛垜浠皢閫氳繃鍦═CP/IP鍗忚涔嬩笂寤虹珛涓涓姛鑳界畝鍗曠殑鑱婂ぉ瀹よ澶у鏇村姞浜嗚В澶氳礬I/O浠ュ強瀹冪殑瀹炵幇鏂規硶銆?<br /> 鎴戜滑瑕佽璁虹殑鑱婂ぉ瀹ゅ姛鑳介潪甯哥畝鍗? 鎰熷叴瓚g殑鏈嬪弸鍙互灝嗗叾鍔熻兘鎵╁睍, 鍙戝睍鎴愪竴涓姛鑳芥瘮杈冨畬鏁寸殑鑱婂ぉ瀹? 濡傚姞涓婄敤鎴瘋璇? 鐢ㄦ埛鏄電О, 縐樺瘑淇℃伅, semote 絳夊姛鑳? <br /> 棣栧厛瀹冩槸涓涓?client/server 緇撴瀯鐨勭▼搴? 棣栧厛鍚姩 server, 鐒跺悗鐢ㄦ埛浣跨敤 client 榪涜榪炴帴. client/server 緇撴瀯鐨勪紭鐐規槸閫熷害蹇? 緙虹偣鏄綋 server 榪涜鏇存柊鏃? client 涔熷繀闇鏇存柊. <br /> 銆 <br /> 緗戠粶鍒濆鍖?<br /> 銆 <br /> 棣栧厛鏄垵濮嬪寲 server, 浣縮erver 榪涘叆鐩戝惉鐘舵? (涓轟簡綆媧佽搗瑙?浠ヤ笅寮曠敤鐨勭▼搴忎笌瀹為檯紼嬪簭鐣ユ湁鍑哄叆, 涓嬪悓) <br /> sockfd = socket( AF_INET,SOCK_STREAM, 0); <br /> // 棣栧厛寤虹珛涓涓?socket, 鏃忎負 AF_INET, 綾誨瀷涓?SOCK_STREAM. <br /> // AF_INET = ARPA Internet protocols 鍗充嬌鐢?TCP/IP 鍗忚鏃?<br /> // SOCK_STREAM 綾誨瀷鎻愪緵浜嗛『搴忕殑, 鍙潬鐨? 鍩轟簬瀛楄妭嫻佺殑鍏ㄥ弻宸ヨ繛鎺? <br /> // 鐢變簬璇ュ崗璁棌涓彧鏈変竴涓崗璁? 鍥犳絎笁涓弬鏁頒負 0 <br /> 銆 <br /> bind( sockfd, ( struct sockaddr *)&serv_addr, sizeof( serv_addr)); <br /> // 鍐嶅皢榪欎釜 socket 涓庢煇涓湴鍧榪涜緇戝畾. <br /> // serv_addr 鍖呮嫭 sin_family = AF_INET 鍗忚鏃忓悓 socket <br /> // sin_addr.s_addr = htonl( INADDR_ANY) server 鎵鎺ュ彈鐨勬墍鏈夊叾浠?<br /> // 鍦板潃璇鋒眰寤虹珛鐨勮繛鎺? <br /> // sin_port = htons( SERV_TCP_PORT) server 鎵鐩戝惉鐨勭鍙?<br /> // 鍦ㄦ湰紼嬪簭涓? server 鐨?IP鍜岀洃鍚殑绔彛閮藉瓨鏀懼湪 config 鏂囦歡涓? <br /> listen( sockfd, MAX_CLIENT); <br /> // 鍦板潃緇戝畾涔嬪悗, server 榪涘叆鐩戝惉鐘舵? <br /> // MAX_CLIENT 鏄彲浠ュ悓鏃跺緩绔嬭繛鎺ョ殑 client 鎬繪暟. <br /> server 榪涘叆 listen 鐘舵佸悗, 絳夊緟 client 寤虹珛榪炴帴銆?<br /> Client绔寤虹珛榪炴帴棣栧厛涔熼渶瑕佸垵濮嬪寲榪炴帴錛?<br /> sockfd = socket( AF_INET,SOCK_STREAM,0)); <br /> // 鍚屾牱鐨? client 涔熷厛寤虹珛涓涓?socket, 鍏跺弬鏁頒笌 server 鐩稿悓. <br /> connect( sockfd, ( struct sockaddr *)&serv_addr, sizeof( serv_addr)); <br /> // client 浣跨敤 connect 寤虹珛涓涓繛鎺? <br /> // serv_addr 涓殑鍙橀噺鍒嗗埆璁劇疆涓? <br /> // sin_family = AF_INET 鍗忚鏃忓悓 socket <br /> // sin_addr.s_addr = inet_addr( SERV_HOST_ADDR) 鍦板潃涓?server <br /> // 鎵鍦ㄧ殑璁$畻鏈虹殑鍦板潃. <br /> // sin_port = htons( SERV_TCP_PORT) 绔彛涓?server 鐩戝惉鐨勭鍙? <br /> 褰?client 寤虹珛鏂拌繛鎺ョ殑璇鋒眰琚佸埌Server绔椂, server 浣跨敤 accept 鏉ユ帴鍙楄榪炴帴: <br /> accept( sockfd, (struct sockaddr*)&cli_addr, &cli_len); <br /> // 鍦ㄥ嚱鏁拌繑鍥炴椂, cli_addr 涓繚鐣欑殑鏄榪炴帴瀵規柟鐨勪俊鎭?<br /> // 鍖呮嫭瀵規柟鐨?IP 鍦板潃鍜屽鏂逛嬌鐢ㄧ殑绔彛. <br /> // accept 榪斿洖涓涓柊鐨勬枃浠舵弿榪扮. <br /> 鍦?server 榪涘叆 listen 鐘舵佷箣鍚? 鐢變簬宸叉湁澶氫釜鐢ㄦ埛鍦ㄧ嚎錛屾墍浠ョ▼搴忛渶瑕佸悓鏃跺榪欎簺鐢ㄦ埛榪涜鎿嶄綔錛屽茍鍦ㄥ畠浠箣闂村疄鐜頒俊鎭氦鎹€傝繖鍦ㄥ疄鐜頒笂縐頒負I/O澶氳礬澶嶇敤鎶鏈傚璺鐢ㄤ竴鑸湁浠ヤ笅鍑犵鏂規硶錛?<br /> 闈為樆濉為氫俊鏂規硶錛氬皢鏂囦歡綆¢亾閫氳繃fcntl()璁句負闈為樆濉為氫俊鏂瑰紡錛屾瘡闅斾竴绔椂闂村浠栦滑瀹炶涓嬈¤疆璇紝浠ュ垽鏂槸鍚﹀彲浠ヨ繘琛岃鍐欐搷浣溿傝繖縐嶆柟寮忕殑緙虹偣鏄垂鐢ㄥお楂橈紝澶ч儴鍒嗚祫婧愭氮璐瑰湪杞涓娿?<br /> 瀛愯繘紼嬫柟娉曪細搴旂敤澶氫釜瀛愯繘紼嬶紝姣忎竴涓涓涓崟宸ラ樆濉炴柟寮忛氫俊銆傛墍鏈夊瓙榪涚▼閫氳繃IPC鍜岀埗榪涚▼榪涜閫氫俊銆傜埗榪涚▼鎺岀鎵鏈変俊鎭傝繖縐嶆柟寮忕殑緙虹偣鏄疄鐜板鏉傦紝鑰屼笖鐢變簬IPC鍦ㄥ悇涓搷浣滅郴緇熷鉤鍙頒笂騫朵笉瀹屽叏涓鑷達紝浼氬鑷村彲縐繪鎬ч檷浣庛?<br /> 淇″彿椹卞姩錛圫IGIO錛夌殑寮傛I/O鏂規硶錛氶鍏堬紝寮傛I/O鏄熀浜庝俊鍙鋒満鍒剁殑錛屽茍涓嶅彲闈犮傚叾嬈″崟涓鐨勪俊鍙蜂笉瓚充互鎻愪緵鏇村鐨勪俊鎭潵婧愩傝繕鏄渶瑕佽緟鍔╀互鍏朵粬鐨勬墜孌碉紝瀹炵幇涓婃湁寰堥珮鐨勯毦搴︺?<br /> select ()鏂規硶錛氬湪BSD涓彁渚涗簡涓縐嶅彲浠ュ澶氳礬I/O榪涜闃誨寮忔煡璇㈢殑鏂規硶鈥斺攕elect()銆傚畠鎻愪緵鍚屾椂瀵瑰涓狪/O鎻忚堪絎﹁繘琛岄樆濉炲紡鏌ヨ鐨勬柟娉曪紝鍒╃敤 瀹冿紝鎴戜滑鍙互寰堟柟渚跨殑瀹炵幇澶氳礬澶嶇敤銆傛牴鎹粺涓UNIX瑙勮寖鐨勫崗璁?POSIX涔熼噰鐢ㄤ簡榪欑鏂規硶錛屽洜姝わ紝鎴戜滑鍙互鍦ㄥぇ澶氭暟鎿嶄綔緋葷粺涓嬌鐢╯elect鏂規硶銆? <br /> 浣跨敤涓撻棬鐨処/O澶氳礬澶嶇敤鍣細鍦ㄢ淯NIX? SYSTEM V Programmer's Guide: STREAMS鈥濅竴涔︿腑璇︾粏鐨勮鏄庝簡鏋勯犲拰浣跨敤澶氳礬澶嶇敤鍣ㄧ殑鏂規硶銆傝繖閲屽氨涓嶅啀璇﹁堪浜嗐?<br /> 銆 <br /> 鎴戜滑涓嬮潰鍒嗗埆璁ㄨ澶氳礬I/O鐨勪袱縐嶅疄鐜版柟娉? <br /> 1. 闈為樆濉為氫俊鏂規硶 <br />瀵? 涓涓枃浠舵弿榪扮鎸囧畾鐨勬枃浠舵垨璁懼, 鏈変袱縐嶅伐浣滄柟寮? 闃誨涓庨潪闃誨銆傛墍璋撻樆濉炴柟寮忕殑鎰忔濇槸鎸? 褰撹瘯鍥懼璇ユ枃浠舵弿榪扮榪涜璇誨啓鏃? 濡傛灉褰撴椂娌℃湁涓滆タ鍙,鎴栬呮殏鏃朵笉鍙啓, 紼嬪簭灝辮繘鍏ョ瓑寰呯姸鎬? 鐩村埌鏈変笢瑗垮彲璇繪垨鑰呭彲鍐欎負姝€傝屽浜庨潪闃誨鐘舵? 濡傛灉娌℃湁涓滆タ鍙, 鎴栬呬笉鍙啓, 璇誨啓鍑芥暟椹笂榪斿洖, 鑰屼笉浼氱瓑寰呫傜己鐪佹儏鍐典笅, 鏂囦歡鎻忚堪絎﹀浜庨樆濉炵姸鎬併傚湪瀹炵幇鑱婂ぉ瀹ゆ椂, server 闇瑕佽疆嫻佹煡璇笌鍚刢lient 寤虹珛鐨? socket, 涓鏃﹀彲璇誨氨灝嗚 socket 涓殑瀛楃璇誨嚭鏉ュ茍鍚戞墍鏈夊叾浠朿lient 鍙戦併傚茍涓? server 榪樿闅忔椂鏌ョ湅鏄惁鏈夋柊鐨? client 璇曞浘寤虹珛榪炴帴,榪欐牱, 濡傛灉 server 鍦ㄤ換浣曚竴涓湴鏂歸樆濉炰簡, 鍏朵粬 client 鍙戦佺殑鍐呭灝變細鍙楀埌褰卞搷,寰椾笉鍒版湇鍔″櫒鐨勫強鏃跺搷搴斻傛柊 client 璇曞浘寤虹珛榪炴帴涔熶細鍙楀埌褰卞搷銆傛墍浠ユ垜浠湪榪欓噷涓嶈兘浣跨敤緙虹渷鐨勯樆濉炵殑鏂囦歡宸ヤ綔鏂瑰紡錛岃岄渶瑕佸皢鏂囦歡鐨勫伐浣滄柟寮忓彉鎴愰潪闃誨鏂瑰紡銆傚湪UNIX涓嬶紝鍑芥暟fcntl() 鍙互鐢ㄦ潵鏀瑰彉鏂囦歡I/O鎿嶄綔鐨勫伐浣滄柟寮忥紝鍑芥暟鎻忚堪濡備笅錛?<br /> fcntl( sockfd, F_SETFL, O_NONBLOCK); <br /> // sockfd 鏄鏀瑰彉鐘舵佺殑鏂囦歡鎻忚堪絎? <br /> // F_SETFL 琛ㄦ槑瑕佹敼鍙樻枃浠舵弿榪扮鐨勭姸鎬?<br /> // O_NONBLOCK 琛ㄧず灝嗘枃浠舵弿榪扮鍙樹負闈為樆濉炵殑. <br /> 涓轟簡鑺傜渷綃囧箙鎴戜滑浣跨敤鑷劧璇█鎻忚堪鑱婂ぉ瀹?server : <br /> while ( 1) { <br /> if 鏈夋柊榪炴帴 then 寤虹珛騫惰褰曡鏂拌繛鎺? <br /> for ( 鎵鏈夌殑鏈夋晥榪炴帴) <br /> begin <br /> if 璇ヨ繛鎺ヤ腑鏈夊瓧絎﹀彲璇?then <br /> begin <br /> 璇誨叆瀛楃涓詫紱 <br /> for ( 鎵鏈夊叾浠栫殑鏈夋晥榪炴帴) <br /> begin <br /> 灝嗚瀛楃涓插彂閫佺粰璇ヨ繛鎺? <br /> end; <br /> end; <br /> end; <br /> end. <br /> 鐢變簬鍒ゆ柇鏄惁鏈夋柊榪炴帴, 鏄惁鍙閮芥槸闈為樆濉炵殑, 鍥犳姣忔鍒ゆ柇,涓嶇鏈夎繕鏄病鏈? 閮戒細椹笂榪斿洖. 榪欐牱,浠諱綍涓涓?client 鍚?server 鍙戦佸瓧絎︽垨鑰呰瘯鍥懼緩绔嬫柊榪炴帴, 閮戒笉浼氬鍏朵粬 client 鐨勬椿鍔ㄩ犳垚褰卞搷銆?<br /> 瀵?client 鑰岃█, 寤虹珛榪炴帴涔嬪悗, 鍙渶瑕佸鐞嗕袱涓枃浠舵弿榪扮, 涓涓槸寤虹珛浜嗚繛鎺ョ殑 socket 鎻忚堪絎? 鍙︿竴涓槸鏍囧噯杈撳叆. 鍜? server 涓鏍? 濡傛灉浣跨敤闃誨鏂瑰紡鐨勮瘽, 寰堝鏄撳洜涓哄叾涓竴涓殏鏃舵病鏈夎緭鍏ヨ屽獎鍝嶅彟澶栦竴涓殑璇誨叆.. 鍥犳灝嗗畠浠兘鍙樻垚闈為樆濉炵殑, 鐒跺悗client 榪涜濡備笅鍔ㄤ綔: <br /> while ( 涓嶆兂閫鍑? <br /> begin <br /> if ( 涓?server 鐨勮繛鎺ユ湁瀛楃鍙) <br /> begin <br /> 浠庤榪炴帴璇誨叆, 騫惰緭鍑哄埌鏍囧噯杈撳嚭涓婂幓. <br /> End; <br /> if ( 鏍囧噯杈撳叆鍙) <br /> Begin <br /> 浠庢爣鍑嗚緭鍏ヨ鍏? 騫惰緭鍑哄埌涓?server 鐨勮繛鎺ヤ腑鍘? <br /> End; <br /> End. <br /> 涓婇潰鐨勮鍐欏垎鍒皟鐢ㄨ繖鏍蜂袱涓嚱鏁? <br /> read( userfd[i], line, MAX_LINE); <br /> // userfd[i] 鏄寚絎?i 涓?client 榪炴帴鐨勬枃浠舵弿榪扮. <br /> // line 鏄寚璇誨嚭鐨勫瓧絎﹀瓨鏀劇殑浣嶇疆. <br /> // MAX_LINE 鏄竴嬈℃渶澶氳鍑虹殑瀛楃鏁? <br /> // 榪斿洖鍊兼槸瀹為檯璇誨嚭鐨勫瓧絎︽暟. <br /> write( userfd[j], line, strlen( line)); <br /> // userfd[j] 鏄 j 涓?client 鐨勬枃浠舵弿榪扮. <br /> // line 鏄鍙戦佺殑瀛楃涓? <br /> // strlen( line) 鏄鍙戦佺殑瀛楃涓查暱搴? <br /> 鍒嗘瀽涓婇潰鐨勭▼搴忓彲浠ョ煡閬? 涓嶇鏄?server 榪樻槸 client, 瀹冧滑閮戒笉鍋滅殑杞祦鏌ヨ鍚勪釜鏂囦歡鎻忚堪絎? 涓鏃﹀彲璇誨氨璇誨叆騫惰繘琛屽鐞? 榪欐牱鐨勭▼搴? 涓嶅仠鐨勫湪鎵ц, 鍙鏈塁PU 璧勬簮, 灝變笉浼氭斁榪囥傚洜姝ゅ緋葷粺璧勬簮鐨勬秷鑰楅潪甯稿ぇ銆俿erver 鎴栬?client 鍗曠嫭鎵ц鏃? CPU 璧勬簮鐨?98% 宸﹀彸閮借鍏跺崰鐢ㄣ傛瀬澶х殑娑堣椾簡緋葷粺璧勬簮銆?<br /> select 鏂規硶 <br /> 鍥犳錛岃櫧鐒舵垜浠笉甯屾湜鍦ㄦ煇涓涓敤鎴鋒病鏈夊弽搴旀椂闃誨鍏朵粬鐨勭敤鎴鳳紝浣嗘垜浠嵈搴旇鍦ㄦ病鏈変換浣曠敤鎴鋒湁鍙嶅簲鐨勬儏鍐典箣涓嬪仠姝㈢▼搴忕殑榪愯錛岃鍑烘姠鍗犵殑緋葷粺璧勬簮錛岃繘鍏ラ樆濉炵姸鎬併傛湁娌℃湁榪欑鏂規硶鍛紵鐜板湪鐨刄NIX緋葷粺涓兘鎻愪緵浜唖elect鏂規硶錛屽叿浣撳疄鐜版柟寮忓涓嬶細 <br /> select 鏂規硶涓? 鎵鏈夋枃浠舵弿榪扮閮芥槸闃誨鐨? 浣跨敤 select 鍒ゆ柇涓緇勬枃浠舵弿榪扮涓槸鍚︽湁涓涓彲璇?鍐?, 濡傛灉娌℃湁灝遍樆濉? 鐩村埌鏈変竴涓殑鏃跺欏氨琚敜閱? 鎴戜滑鍏堢湅姣旇緝綆鍗曠殑 client 鐨勫疄鐜? <br /> 鐢變簬 client 鍙渶瑕佸鐞嗕袱涓枃浠舵弿榪扮, 鍥犳, 闇瑕佸垽鏂槸鍚︽湁鍙鍐欑殑鏂囦歡鎻忚堪絎﹀彧闇瑕佸姞鍏ヤ袱欏? <br /> FD_ZERO( sockset); <br /> // 灝?sockset 娓呯┖ <br /> FD_SET( sockfd, sockset); <br /> // 鎶?sockfd 鍔犲叆鍒?sockset 闆嗗悎涓?<br /> FD_SET( 0, sockset); <br /> // 鎶?0 (鏍囧噯杈撳叆) 鍔犲叆鍒?sockset 闆嗗悎涓?<br /> 鐒跺悗 client 鐨勫鐞嗗涓? <br /> while ( 涓嶆兂閫鍑? { <br /> select( sockfd+1, &sockset, NULL, NULL, NULL); <br /> // 姝ゆ椂璇ュ嚱鏁板皢闃誨鐩村埌鏍囧噯杈撳叆鎴栬?sockfd 涓湁涓涓彲璇諱負姝?<br /> // 絎竴涓弬鏁版槸 0 鍜?sockfd 涓殑鏈澶у煎姞涓 <br /> // 絎簩涓弬鏁版槸 璇婚泦, 涔熷氨鏄?sockset <br /> // 絎笁, 鍥涗釜鍙傛暟鏄啓闆嗗拰寮傚父闆? 鍦ㄦ湰紼嬪簭涓兘涓虹┖ <br /> // 絎簲涓弬鏁版槸瓚呮椂鏃墮棿, 鍗沖湪鎸囧畾鏃墮棿鍐呬粛娌℃湁鍙, 鍒欏嚭閿?<br /> // 騫惰繑鍥? 褰撹繖涓弬鏁頒負NULL 鏃? 瓚呮椂鏃墮棿琚緗負鏃犻檺闀? <br /> // 褰?select 鍥犱負鍙榪斿洖鏃? sockset 涓寘鍚殑鍙槸鍙鐨?<br /> // 閭d簺鏂囦歡鎻忚堪絎? <br /> if ( FD_ISSET( sockfd, &sockset)) { <br /> // FD_ISSET 榪欎釜瀹忓垽鏂?sockfd 鏄惁灞炰簬鍙鐨勬枃浠舵弿榪扮 <br /> 浠?sockfd 涓鍏? 杈撳嚭鍒版爣鍑嗚緭鍑轟笂鍘? <br /> } <br /> if ( FD_ISSET( 0, &sockset)) { <br /> // FD_ISSET 榪欎釜瀹忓垽鏂?sockfd 鏄惁灞炰簬鍙鐨勬枃浠舵弿榪扮 <br /> 浠庢爣鍑嗚緭鍏ヨ鍏? 杈撳嚭鍒?sockfd 涓幓. <br /> } <br /> 閲嶆柊璁劇疆 sockset. (鍗沖皢 sockset 娓呯┖, 騫跺皢 sockfd 鍜?0 鍔犲叆) <br /> } <br /> 涓嬮潰鐪?server 鐨勬儏鍐? <br /> 璁劇疆 sockset 濡備笅: <br /> FD_ZERO( sockset); <br /> FD_SET( sockfd, sockset); <br /> for ( 鎵鏈夋湁鏁堣繛鎺? <br /> FD_SET( userfd[i], sockset); <br /> } <br /> maxfd = 鏈澶х殑鏂囦歡鎻忚堪絎﹀彿 + 1; <br /> server 澶勭悊濡備笅: <br /> while ( 1) { <br /> select( maxfd, &sockset, NULL, NULL, NULL); <br /> if ( FD_ISSET( sockfd, &sockset)) { <br /> // 鏈夋柊榪炴帴 <br /> 寤虹珛鏂拌繛鎺? 騫跺皢璇ヨ繛鎺ユ弿榪扮鍔犲叆鍒?sockset 涓幓浜? <br /> } <br /> for ( 鎵鏈夋湁鏁堣繛鎺? { <br /> if ( FD_ISSET ( userfd[i], &sockset)) { <br /> // 璇ヨ繛鎺ヤ腑鏈夊瓧絎﹀彲璇?<br /> 浠庤榪炴帴涓鍏ュ瓧絎? 騫跺彂閫佸埌鍏朵粬鏈夋晥榪炴帴涓幓. <br /> } <br /> } <br /> 閲嶆柊璁劇疆 sockset; <br /> } <br /> 鎬ц兘姣旇緝 <br /> 鐢變簬閲囩敤 select 鏈哄埗, 鍥犳褰撴病鏈夊瓧絎﹀彲璇繪椂, 紼嬪簭澶勪簬闃誨鐘舵?鏈灝忕▼搴︾殑鍗犵敤CPU 璧勬簮, 鍦ㄥ悓涓鍙版満鍣ㄤ笂鎵ц涓涓?server 鍜岃嫢騫蹭釜client 鏃? 緋葷粺璐熻澆鍙湁 0.1 宸﹀彸, 鑰岄噰鐢ㄥ師鏉ョ殑闈為樆濉為氫俊鏂規硶, 鍙繍琛屼竴涓?server, 緋葷粺璐熻澆灝卞彲浠ヨ揪鍒?1.5 宸﹀彸. 鍥犳鎴戜滑鎺ㄨ崘浣跨敤 select. </font> <img src ="http://m.shnenglu.com/lmlf001/aggbug/6368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lmlf001/" target="_blank">鑺ヤ箣鑸?/a> 2006-04-27 11:51 <a href="http://m.shnenglu.com/lmlf001/archive/2006/04/27/6368.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux鐜涓嬬殑Socket緙栫▼錛圸Z錛?/title><link>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6367.html</link><dc:creator>鑺ヤ箣鑸?/dc:creator><author>鑺ヤ箣鑸?/author><pubDate>Thu, 27 Apr 2006 03:46:00 GMT</pubDate><guid>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6367.html</guid><wfw:comment>http://m.shnenglu.com/lmlf001/comments/6367.html</wfw:comment><comments>http://m.shnenglu.com/lmlf001/archive/2006/04/27/6367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lmlf001/comments/commentRss/6367.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lmlf001/services/trackbacks/6367.html</trackback:ping><description><![CDATA[ <span id="hvzpftn" class="title">Linux鐜涓嬬殑Socket緙栫▼</span> <br /> <br /> <br /> <!----> <br /> <table style="table-layout: fixed;" align="center" bgcolor="#ffffff" cellpadding="5" cellspacing="0"> <tbody> <tr> <td valign="top"> <span id="hvzpftn" class="pg" id="xydwtext"> 浠涔堟槸Socket <br />銆銆Socket鎺ュ彛鏄疶CP/IP緗戠粶鐨凙PI錛孲ocket鎺ュ彛瀹氫箟浜嗚澶氬嚱鏁版垨渚嬬▼錛岀▼搴忓憳鍙互鐢ㄥ畠浠潵寮鍙慣CP/IP緗戠粶涓婄殑搴旂敤紼嬪簭銆傝瀛nternet涓婄殑TCP/IP緗戠粶緙栫▼錛屽繀欏葷悊瑙ocket鎺ュ彛銆?<br />銆 銆Socket鎺ュ彛璁捐鑰呮渶鍏堟槸灝嗘帴鍙f斁鍦║nix鎿嶄綔緋葷粺閲岄潰鐨勩傚鏋滀簡瑙nix緋葷粺鐨勮緭鍏ュ拰杈撳嚭鐨勮瘽錛屽氨寰堝鏄撲簡瑙ocket浜嗐傜綉緇滅殑 Socket鏁版嵁浼犺緭鏄竴縐嶇壒孌婄殑I/O錛孲ocket涔熸槸涓縐嶆枃浠舵弿榪扮銆係ocket涔熷叿鏈変竴涓被浼間簬鎵撳紑鏂囦歡鐨勫嚱鏁拌皟鐢⊿ocket()錛岃鍑芥暟榪? 鍥炰竴涓暣鍨嬬殑Socket鎻忚堪絎︼紝闅忓悗鐨勮繛鎺ュ緩绔嬨佹暟鎹紶杈撶瓑鎿嶄綔閮芥槸閫氳繃璇ocket瀹炵幇鐨勩傚父鐢ㄧ殑Socket綾誨瀷鏈変袱縐嶏細嫻佸紡Socket 錛圫OCK_STREAM錛夊拰鏁版嵁鎶ュ紡Socket錛圫OCK_DGRAM錛夈傛祦寮忔槸涓縐嶉潰鍚戣繛鎺ョ殑Socket錛岄拡瀵逛簬闈㈠悜榪炴帴鐨凾CP鏈嶅姟搴旂敤錛涙暟鎹? 鎶ュ紡Socket鏄竴縐嶆棤榪炴帴鐨凷ocket錛屽搴斾簬鏃犺繛鎺ョ殑UDP鏈嶅姟搴旂敤銆?<br /><br />Socket寤虹珛 <br />銆銆涓轟簡寤虹珛Socket錛岀▼搴忓彲浠ヨ皟鐢⊿ocket鍑芥暟錛岃鍑芥暟榪斿洖涓涓被浼間簬鏂囦歡鎻忚堪絎︾殑鍙ユ焺銆俿ocket鍑芥暟鍘熷瀷涓猴細 <br />銆銆int socket(int domain, int type, int protocol); <br />銆 銆domain鎸囨槑鎵浣跨敤鐨勫崗璁棌錛岄氬父涓篜F_INET錛岃〃紺轟簰鑱旂綉鍗忚鏃忥紙TCP/IP鍗忚鏃忥級錛泃ype鍙傛暟鎸囧畾socket鐨勭被鍨嬶細 SOCK_STREAM 鎴朣OCK_DGRAM錛孲ocket鎺ュ彛榪樺畾涔変簡鍘熷Socket錛圫OCK_RAW錛夛紝鍏佽紼嬪簭浣跨敤浣庡眰鍗忚錛沺rotocol閫氬父璧嬪?0"銆? Socket()璋冪敤榪斿洖涓涓暣鍨媠ocket鎻忚堪絎︼紝浣犲彲浠ュ湪鍚庨潰鐨勮皟鐢ㄤ嬌鐢ㄥ畠銆?<br />銆銆Socket鎻忚堪絎︽槸涓涓寚鍚戝唴閮ㄦ暟鎹粨鏋勭殑鎸囬拡錛屽畠鎸囧悜鎻忚堪絎﹁〃鍏ュ彛銆傝皟鐢⊿ocket鍑芥暟鏃訛紝socket鎵ц浣撳皢寤虹珛涓涓猄ocket錛屽疄闄呬笂"寤虹珛涓涓猄ocket"鎰忓懗鐫涓轟竴涓猄ocket鏁版嵁緇撴瀯鍒嗛厤瀛樺偍絀洪棿銆係ocket鎵ц浣撲負浣犵鐞嗘弿榪扮琛ㄣ?<br />銆銆涓や釜緗戠粶紼嬪簭涔嬮棿鐨勪竴涓綉緇滆繛鎺ュ寘鎷簲縐嶄俊鎭細閫氫俊鍗忚銆佹湰鍦板崗璁湴鍧銆佹湰鍦頒富鏈虹鍙c佽繙绔富鏈哄湴鍧鍜岃繙绔崗璁鍙c係ocket鏁版嵁緇撴瀯涓寘鍚繖浜旂淇℃伅銆?<br /><br />Socket閰嶇疆 <br />銆 銆閫氳繃socket璋冪敤榪斿洖涓涓猻ocket鎻忚堪絎﹀悗錛屽湪浣跨敤socket榪涜緗戠粶浼犺緭浠ュ墠錛屽繀欏婚厤緗socket銆傞潰鍚戣繛鎺ョ殑socket瀹㈡埛绔氳繃 璋冪敤Connect鍑芥暟鍦╯ocket鏁版嵁緇撴瀯涓繚瀛樻湰鍦板拰榪滅淇℃伅銆傛棤榪炴帴socket鐨勫鎴風鍜屾湇鍔$浠ュ強闈㈠悜榪炴帴socket鐨勬湇鍔$閫氳繃璋冪敤 bind鍑芥暟鏉ラ厤緗湰鍦頒俊鎭?<br />Bind鍑芥暟灝唖ocket涓庢湰鏈轟笂鐨勪竴涓鍙g浉鍏寵仈錛岄殢鍚庝綘灝卞彲浠ュ湪璇ョ鍙g洃鍚湇鍔¤姹傘侭ind鍑芥暟鍘熷瀷涓猴細 <br />銆銆int bind(int sockfd,struct sockaddr *my_addr, int addrlen); <br />銆銆Sockfd鏄皟鐢╯ocket鍑芥暟榪斿洖鐨剆ocket鎻忚堪絎?my_addr鏄竴涓寚鍚戝寘鍚湁鏈満IP鍦板潃鍙婄鍙e彿絳変俊鎭殑sockaddr綾誨瀷鐨勬寚閽堬紱addrlen甯歌璁劇疆涓簊izeof(struct sockaddr)銆?<br />銆銆struct sockaddr緇撴瀯綾誨瀷鏄敤鏉ヤ繚瀛榮ocket淇℃伅鐨勶細 <br />銆銆struct sockaddr { <br />銆銆 unsigned short sa_family; /* 鍦板潃鏃忥紝 AF_xxx */ <br />char sa_data[14]; /* 14 瀛楄妭鐨勫崗璁湴鍧 */ <br />}; <br />銆銆sa_family涓鑸負AF_INET錛屼唬琛↖nternet錛圱CP/IP錛夊湴鍧鏃忥紱sa_data鍒欏寘鍚socket鐨処P鍦板潃鍜岀鍙e彿銆?<br />銆銆鍙﹀榪樻湁涓縐嶇粨鏋勭被鍨嬶細 <br />銆銆struct sockaddr_in { <br />銆銆 short int sin_family; /* 鍦板潃鏃?*/ <br />銆銆 unsigned short int sin_port; /* 绔彛鍙?*/ <br />銆銆 struct in_addr sin_addr; /* IP鍦板潃 */ <br />銆銆 unsigned char sin_zero[8]; /* 濉厖0 浠ヤ繚鎸佷笌struct sockaddr鍚屾牱澶у皬 */ <br />銆銆}; <br />銆 銆榪欎釜緇撴瀯鏇存柟渚夸嬌鐢ㄣ俿in_zero鐢ㄦ潵灝唖ockaddr_in緇撴瀯濉厖鍒頒笌struct sockaddr鍚屾牱鐨勯暱搴︼紝鍙互鐢╞zero()鎴杕emset()鍑芥暟灝嗗叾緗負闆躲傛寚鍚憇ockaddr_in 鐨勬寚閽堝拰鎸囧悜sockaddr鐨勬寚閽堝彲浠ョ浉浜掕漿鎹紝榪欐剰鍛崇潃濡傛灉涓涓嚱鏁版墍闇鍙傛暟綾誨瀷鏄痵ockaddr鏃訛紝浣犲彲浠ュ湪鍑芥暟璋冪敤鐨勬椂鍊欏皢涓涓寚鍚? sockaddr_in鐨勬寚閽堣漿鎹負鎸囧悜sockaddr鐨勬寚閽堬紱鎴栬呯浉鍙嶃?<br />銆銆浣跨敤bind鍑芥暟鏃訛紝鍙互鐢ㄤ笅闈㈢殑璧嬪煎疄鐜拌嚜鍔ㄨ幏寰楁湰鏈篒P鍦板潃鍜岄殢鏈鴻幏鍙栦竴涓病鏈夎鍗犵敤鐨勭鍙e彿錛?<br />銆銆my_addr.sin_port = 0; /* 緋葷粺闅忔満閫夋嫨涓涓湭琚嬌鐢ㄧ殑绔彛鍙?*/ <br />銆銆my_addr.sin_addr.s_addr = INADDR_ANY; /* 濉叆鏈満IP鍦板潃 */ <br />閫氳繃灝唌y_addr.sin_port緗負0錛屽嚱鏁頒細鑷姩涓轟綘閫夋嫨涓涓湭鍗犵敤鐨勭鍙f潵浣跨敤銆傚悓鏍鳳紝閫氳繃灝唌y_addr.sin_addr.s_addr緗負INADDR_ANY錛岀郴緇熶細鑷姩濉叆鏈満IP鍦板潃銆?<br />娉ㄦ剰鍦ㄤ嬌鐢╞ind鍑芥暟鏄渶瑕佸皢sin_port鍜宻in_addr杞崲鎴愪負緗戠粶瀛楄妭浼樺厛欏哄簭錛涜宻in_addr鍒欎笉闇瑕佽漿鎹€?<br />銆銆璁$畻鏈烘暟鎹瓨鍌ㄦ湁涓ょ瀛楄妭浼樺厛欏哄簭錛氶珮浣嶅瓧鑺備紭鍏堝拰浣庝綅瀛楄妭浼樺厛銆侷nternet涓婃暟鎹互楂樹綅瀛楄妭浼樺厛欏哄簭鍦ㄧ綉緇滀笂浼犺緭錛屾墍浠ュ浜庡湪鍐呴儴鏄互浣庝綅瀛楄妭浼樺厛鏂瑰紡瀛樺偍鏁版嵁鐨勬満鍣紝鍦↖nternet涓婁紶杈撴暟鎹椂灝遍渶瑕佽繘琛岃漿鎹紝鍚﹀垯灝變細鍑虹幇鏁版嵁涓嶄竴鑷淬?<br />銆銆涓嬮潰鏄嚑涓瓧鑺傞『搴忚漿鎹㈠嚱鏁幫細 <br />路htonl()錛氭妸32浣嶅間粠涓繪満瀛楄妭搴忚漿鎹㈡垚緗戠粶瀛楄妭搴?<br />路htons()錛氭妸16浣嶅間粠涓繪満瀛楄妭搴忚漿鎹㈡垚緗戠粶瀛楄妭搴?<br />路ntohl()錛氭妸32浣嶅間粠緗戠粶瀛楄妭搴忚漿鎹㈡垚涓繪満瀛楄妭搴?<br />路ntohs()錛氭妸16浣嶅間粠緗戠粶瀛楄妭搴忚漿鎹㈡垚涓繪満瀛楄妭搴?<br />銆銆Bind()鍑芥暟鍦ㄦ垚鍔熻璋冪敤鏃惰繑鍥?錛涘嚭鐜伴敊璇椂榪斿洖"-1"騫跺皢errno緗負鐩稿簲鐨勯敊璇彿銆傞渶瑕佹敞鎰忕殑鏄紝鍦ㄨ皟鐢╞ind鍑芥暟鏃朵竴鑸笉瑕佸皢绔彛鍙風疆涓哄皬浜?024鐨勫鹼紝鍥犱負1鍒?024鏄繚鐣欑鍙e彿錛屼綘鍙互閫夋嫨澶т簬1024涓殑浠諱綍涓涓病鏈夎鍗犵敤鐨勭鍙e彿銆?<br /><br />榪炴帴寤虹珛 <br />銆銆闈㈠悜榪炴帴鐨勫鎴風▼搴忎嬌鐢–onnect鍑芥暟鏉ラ厤緗畇ocket騫朵笌榪滅鏈嶅姟鍣ㄥ緩绔嬩竴涓猅CP榪炴帴錛屽叾鍑芥暟鍘熷瀷涓猴細 <br />銆銆int connect(int sockfd, struct sockaddr *serv_addr,int addrlen); <br />Sockfd 鏄痵ocket鍑芥暟榪斿洖鐨剆ocket鎻忚堪絎︼紱serv_addr鏄寘鍚繙绔富鏈篒P鍦板潃鍜岀鍙e彿鐨勬寚閽堬紱addrlen鏄繙绔湴璐ㄧ粨鏋勭殑闀垮害銆? Connect鍑芥暟鍦ㄥ嚭鐜伴敊璇椂榪斿洖-1錛屽茍涓旇緗甧rrno涓虹浉搴旂殑閿欒鐮併傝繘琛屽鎴風紼嬪簭璁捐鏃犻』璋冪敤bind()錛屽洜涓鴻繖縐嶆儏鍐典笅鍙渶鐭ラ亾鐩殑鏈哄櫒 鐨処P鍦板潃錛岃屽鎴烽氳繃鍝釜绔彛涓庢湇鍔″櫒寤虹珛榪炴帴騫朵笉闇瑕佸叧蹇冿紝socket鎵ц浣撲負浣犵殑紼嬪簭鑷姩閫夋嫨涓涓湭琚崰鐢ㄧ殑绔彛錛屽茍閫氱煡浣犵殑紼嬪簭鏁版嵁浠涔堟椂鍊欏埌 鎵撴柇鍙c?<br />銆銆Connect鍑芥暟鍚姩鍜岃繙绔富鏈虹殑鐩存帴榪炴帴銆傚彧鏈夐潰鍚戣繛鎺ョ殑瀹㈡埛紼嬪簭浣跨敤socket鏃舵墠闇瑕佸皢姝ocket涓庤繙绔富鏈虹浉榪炪傛棤榪炴帴鍗忚浠庝笉寤虹珛鐩存帴榪炴帴銆傞潰鍚戣繛鎺ョ殑鏈嶅姟鍣ㄤ篃浠庝笉鍚姩涓涓繛鎺ワ紝瀹冨彧鏄鍔ㄧ殑鍦ㄥ崗璁鍙g洃鍚鎴風殑璇鋒眰銆?<br />銆銆Listen鍑芥暟浣縮ocket澶勪簬琚姩鐨勭洃鍚ā寮忥紝騫朵負璇ocket寤虹珛涓涓緭鍏ユ暟鎹槦鍒楋紝灝嗗埌杈劇殑鏈嶅姟璇鋒眰淇濆瓨鍦ㄦ闃熷垪涓紝鐩村埌紼嬪簭澶勭悊瀹冧滑銆?<br />銆銆int listen(int sockfd錛?int backlog); <br />Sockfd 鏄疭ocket緋葷粺璋冪敤榪斿洖鐨剆ocket 鎻忚堪絎︼紱backlog鎸囧畾鍦ㄨ姹傞槦鍒椾腑鍏佽鐨勬渶澶ц姹傛暟錛岃繘鍏ョ殑榪炴帴璇鋒眰灝嗗湪闃熷垪涓瓑寰卆ccept()瀹冧滑錛堝弬鑰冧笅鏂囷級銆侭acklog瀵歸槦鍒椾腑絳夊緟 鏈嶅姟鐨勮姹傜殑鏁扮洰榪涜浜嗛檺鍒訛紝澶у鏁扮郴緇熺己鐪佸間負20銆傚鏋滀竴涓湇鍔¤姹傚埌鏉ユ椂錛岃緭鍏ラ槦鍒楀凡婊★紝璇ocket灝嗘嫆緇濊繛鎺ヨ姹傦紝瀹㈡埛灝嗘敹鍒頒竴涓嚭閿欎俊鎭? <br />褰撳嚭鐜伴敊璇椂listen鍑芥暟榪斿洖-1錛屽茍緗浉搴旂殑errno閿欒鐮併?<br />銆銆accept()鍑芥暟璁╂湇鍔″櫒鎺ユ敹瀹㈡埛鐨勮繛鎺ヨ姹傘傚湪寤虹珛濂借緭鍏ラ槦鍒楀悗錛屾湇鍔″櫒灝辮皟鐢╝ccept鍑芥暟錛岀劧鍚庣潯鐪犲茍絳夊緟瀹㈡埛鐨勮繛鎺ヨ姹傘?<br />銆銆int accept(int sockfd, void *addr, int *addrlen); <br />銆 銆sockfd鏄鐩戝惉鐨剆ocket鎻忚堪絎︼紝addr閫氬父鏄竴涓寚鍚憇ockaddr_in鍙橀噺鐨勬寚閽堬紝璇ュ彉閲忕敤鏉ュ瓨鏀炬彁鍑鴻繛鎺ヨ姹傛湇鍔$殑涓繪満鐨勪俊鎭? 錛堟煇鍙頒富鏈轟粠鏌愪釜绔彛鍙戝嚭璇ヨ姹傦級錛沘ddrten閫氬父涓轟竴涓寚鍚戝間負sizeof(struct sockaddr_in)鐨勬暣鍨嬫寚閽堝彉閲忋傚嚭鐜伴敊璇椂accept鍑芥暟榪斿洖-1騫剁疆鐩稿簲鐨別rrno鍊箋?<br />銆銆棣栧厛錛屽綋accept鍑芥暟鐩戣鐨? socket鏀跺埌榪炴帴璇鋒眰鏃訛紝socket鎵ц浣撳皢寤虹珛涓涓柊鐨剆ocket錛屾墽琛屼綋灝嗚繖涓柊socket鍜岃姹傝繛鎺ヨ繘紼嬬殑鍦板潃鑱旂郴璧鋒潵錛屾敹鍒版湇鍔¤姹傜殑 鍒濆socket浠嶅彲浠ョ戶緇湪浠ュ墠鐨?socket涓婄洃鍚紝鍚屾椂鍙互鍦ㄦ柊鐨剆ocket鎻忚堪絎︿笂榪涜鏁版嵁浼犺緭鎿嶄綔銆?<br /><br />鏁版嵁浼犺緭 <br />銆銆Send()鍜宺ecv()榪欎袱涓嚱鏁扮敤浜庨潰鍚戣繛鎺ョ殑socket涓婅繘琛屾暟鎹紶杈撱?<br />銆銆Send()鍑芥暟鍘熷瀷涓猴細 <br />銆銆int send(int sockfd, const void *msg, int len, int flags); <br />Sockfd鏄綘鎯崇敤鏉ヤ紶杈撴暟鎹殑socket鎻忚堪絎︼紱msg鏄竴涓寚鍚戣鍙戦佹暟鎹殑鎸囬拡錛汱en鏄互瀛楄妭涓哄崟浣嶇殑鏁版嵁鐨勯暱搴︼紱flags涓鑸儏鍐典笅緗負0錛堝叧浜庤鍙傛暟鐨勭敤娉曞彲鍙傜収man鎵嬪唽錛夈?<br />銆銆Send()鍑芥暟榪斿洖瀹為檯涓婂彂閫佸嚭鐨勫瓧鑺傛暟錛屽彲鑳戒細灝戜簬浣犲笇鏈涘彂閫佺殑鏁版嵁銆傚湪紼嬪簭涓簲璇ュ皢send()鐨勮繑鍥炲間笌嬈插彂閫佺殑瀛楄妭鏁拌繘琛屾瘮杈冦傚綋send()榪斿洖鍊間笌len涓嶅尮閰嶆椂錛屽簲璇ュ榪欑鎯呭喌榪涜澶勭悊銆?<br />char *msg = "Hello!"; <br />int len, bytes_sent; <br />鈥︹?<br />len = strlen(msg); <br />bytes_sent = send(sockfd, msg,len,0); <br />鈥︹?<br />銆銆recv()鍑芥暟鍘熷瀷涓猴細 <br />銆銆int recv(int sockfd,void *buf,int len,unsigned int flags); <br />銆銆Sockfd鏄帴鍙楁暟鎹殑socket鎻忚堪絎︼紱buf 鏄瓨鏀炬帴鏀舵暟鎹殑緙撳啿鍖猴紱len鏄紦鍐茬殑闀垮害銆侳lags涔熻緗負0銆俁ecv()榪斿洖瀹為檯涓婃帴鏀剁殑瀛楄妭鏁幫紝褰撳嚭鐜伴敊璇椂錛岃繑鍥?1騫剁疆鐩稿簲鐨別rrno鍊箋?<br />Sendto()鍜宺ecvfrom()鐢ㄤ簬鍦ㄦ棤榪炴帴鐨勬暟鎹姤socket鏂瑰紡涓嬭繘琛屾暟鎹紶杈撱傜敱浜庢湰鍦皊ocket騫舵病鏈変笌榪滅鏈哄櫒寤虹珛榪炴帴錛屾墍浠ュ湪鍙戦佹暟鎹椂搴旀寚鏄庣洰鐨勫湴鍧銆?<br />sendto()鍑芥暟鍘熷瀷涓猴細 <br />銆銆int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen); <br />銆銆璇ュ嚱鏁版瘮send()鍑芥暟澶氫簡涓や釜鍙傛暟錛宼o琛ㄧず鐩湴鏈虹殑IP鍦板潃鍜岀鍙e彿淇℃伅錛岃宼olen甯稿父琚祴鍊間負sizeof (struct sockaddr)銆係endto 鍑芥暟涔熻繑鍥炲疄闄呭彂閫佺殑鏁版嵁瀛楄妭闀垮害鎴栧湪鍑虹幇鍙戦侀敊璇椂榪斿洖-1銆?<br />銆銆Recvfrom()鍑芥暟鍘熷瀷涓猴細 <br />銆銆int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen); <br />銆 銆from鏄竴涓猻truct sockaddr綾誨瀷鐨勫彉閲忥紝璇ュ彉閲忎繚瀛樻簮鏈虹殑IP鍦板潃鍙婄鍙e彿銆俧romlen甯哥疆涓簊izeof (struct sockaddr)銆傚綋recvfrom()榪斿洖鏃訛紝fromlen鍖呭惈瀹為檯瀛樺叆from涓殑鏁版嵁瀛楄妭鏁般俁ecvfrom()鍑芥暟榪斿洖鎺ユ敹鍒扮殑瀛楄妭鏁版垨 褰撳嚭鐜伴敊璇椂榪斿洖-1錛屽茍緗浉搴旂殑errno銆?<br />濡傛灉浣犲鏁版嵁鎶ocket璋冪敤浜哻onnect()鍑芥暟鏃訛紝浣犱篃鍙互鍒╃敤send()鍜宺ecv()榪涜鏁版嵁浼犺緭錛屼絾璇ocket浠嶇劧鏄暟鎹姤socket錛屽茍涓斿埄鐢ㄤ紶杈撳眰鐨刄DP鏈嶅姟銆備絾鍦ㄥ彂閫佹垨鎺ユ敹鏁版嵁鎶ユ椂錛屽唴鏍鎬細鑷姩涓轟箣鍔犱笂鐩湴鍜屾簮鍦板潃淇℃伅銆?<br /><br />緇撴潫浼犺緭 <br />銆銆褰撴墍鏈夌殑鏁版嵁鎿嶄綔緇撴潫浠ュ悗錛屼綘鍙互璋冪敤close()鍑芥暟鏉ラ噴鏀捐socket錛屼粠鑰屽仠姝㈠湪璇ocket涓婄殑浠諱綍鏁版嵁鎿嶄綔錛?<br />close(sockfd); <br />銆銆浣犱篃鍙互璋冪敤shutdown()鍑芥暟鏉ュ叧闂socket銆傝鍑芥暟鍏佽浣犲彧鍋滄鍦ㄦ煇涓柟鍚戜笂鐨勬暟鎹紶杈擄紝鑰屼竴涓柟鍚戜笂鐨勬暟鎹紶杈撶戶緇繘琛屻傚浣犲彲浠ュ叧闂煇socket鐨勫啓鎿嶄綔鑰屽厑璁哥戶緇湪璇ocket涓婃帴鍙楁暟鎹紝鐩磋嚦璇誨叆鎵鏈夋暟鎹?<br />銆銆int shutdown(int sockfd,int how); <br />銆銆Sockfd鏄渶瑕佸叧闂殑socket鐨勬弿榪扮銆傚弬鏁?how鍏佽涓簊hutdown鎿嶄綔閫夋嫨浠ヤ笅鍑犵鏂瑰紡錛?<br />銆銆路0-------涓嶅厑璁哥戶緇帴鏀舵暟鎹?<br />銆銆路1-------涓嶅厑璁哥戶緇彂閫佹暟鎹?<br />路2-------涓嶅厑璁哥戶緇彂閫佸拰鎺ユ敹鏁版嵁錛?<br />路鍧囦負鍏佽鍒欒皟鐢╟lose () <br />銆銆shutdown鍦ㄦ搷浣滄垚鍔熸椂榪斿洖0錛屽湪鍑虹幇閿欒鏃惰繑鍥?1騫剁疆鐩稿簲errno銆?<br /><br />闈㈠悜榪炴帴鐨凷ocket瀹炰緥 <br />銆銆浠g爜瀹炰緥涓殑鏈嶅姟鍣ㄩ氳繃socket榪炴帴鍚戝鎴風鍙戦佸瓧絎︿覆"Hello, you are connected!"銆傚彧瑕佸湪鏈嶅姟鍣ㄤ笂榪愯璇ユ湇鍔″櫒杞歡錛屽湪瀹㈡埛绔繍琛屽鎴瘋蔣浠訛紝瀹㈡埛绔氨浼氭敹鍒拌瀛楃涓層?<br />銆銆璇ユ湇鍔″櫒杞歡浠g爜濡備笅錛?<br />#include <stdio.h> <br />#include <stdlib.h> <br />#include <errno.h> <br />#include <string.h> <br />#include <sys/types.h> <br />#include <netinet/in.h> <br />#include <sys/socket.h> <br />#include <sys/wait.h> <br />#define SERVPORT 3333 /*鏈嶅姟鍣ㄧ洃鍚鍙e彿 */ <br />#define BACKLOG 10 /* 鏈澶у悓鏃惰繛鎺ヨ姹傛暟 */ <br />main() <br />{ <br />int sockfd,client_fd; /*sock_fd錛氱洃鍚瑂ocket錛沜lient_fd錛氭暟鎹紶杈搒ocket */ <br />銆struct sockaddr_in my_addr; /* 鏈満鍦板潃淇℃伅 */ <br />銆struct sockaddr_in remote_addr; /* 瀹㈡埛绔湴鍧淇℃伅 */ <br />if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { <br />銆銆perror("socket鍒涘緩鍑洪敊錛?); exit(1); <br />} <br />my_addr.sin_family=AF_INET; <br />銆my_addr.sin_port=htons(SERVPORT); <br />銆my_addr.sin_addr.s_addr = INADDR_ANY; <br />bzero(&(my_addr.sin_zero),8); <br />銆if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \ <br />銆銆 == -1) { <br />perror("bind鍑洪敊錛?); <br />exit(1); <br />} <br />銆if (listen(sockfd, BACKLOG) == -1) { <br />perror("listen鍑洪敊錛?); <br />exit(1); <br />} <br />while(1) { <br />銆銆sin_size = sizeof(struct sockaddr_in); <br />銆銆if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, \ <br />銆銆&sin_size)) == -1) { <br />perror("accept鍑洪敊"); <br />continue; <br />} <br />銆銆printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); <br />銆 if (!fork()) { /* 瀛愯繘紼嬩唬鐮佹 */ <br />銆銆 if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) <br />銆銆 perror("send鍑洪敊錛?); <br />close(client_fd); <br />exit(0); <br />} <br />銆銆close(client_fd); <br />銆銆} <br />銆} <br />} <br />銆 銆鏈嶅姟鍣ㄧ殑宸ヤ綔嫻佺▼鏄繖鏍風殑錛氶鍏堣皟鐢╯ocket鍑芥暟鍒涘緩涓涓猄ocket錛岀劧鍚庤皟鐢╞ind鍑芥暟灝嗗叾涓庢湰鏈哄湴鍧浠ュ強涓涓湰鍦扮鍙e彿緇戝畾錛岀劧鍚庤皟鐢? listen鍦ㄧ浉搴旂殑socket涓婄洃鍚紝褰揳ccpet鎺ユ敹鍒頒竴涓繛鎺ユ湇鍔¤姹傛椂錛屽皢鐢熸垚涓涓柊鐨剆ocket銆傛湇鍔″櫒鏄劇ず璇ュ鎴鋒満鐨処P鍦板潃錛屽茍閫氳繃 鏂扮殑socket鍚戝鎴風鍙戦佸瓧絎︿覆"Hello錛寉ou are connected!"銆傛渶鍚庡叧闂socket銆?<br />銆銆浠g爜瀹炰緥涓殑fork()鍑芥暟鐢熸垚涓涓瓙榪涚▼鏉ュ鐞嗘暟鎹紶杈撻儴鍒嗭紝fork()璇彞瀵逛簬瀛愯繘紼嬭繑鍥炵殑鍊間負0銆傛墍浠ュ寘鍚玣ork鍑芥暟鐨刬f璇彞鏄瓙榪涚▼浠g爜閮ㄥ垎錛屽畠涓巌f璇彞鍚庨潰鐨勭埗榪涚▼浠g爜閮ㄥ垎鏄茍鍙戞墽琛岀殑銆?<br /><br />瀹㈡埛绔▼搴忎唬鐮佸涓嬶細 <br />#include<stdio.h> <br />#include <stdlib.h> <br />#include <errno.h> <br />#include <string.h> <br />#include <netdb.h> <br />#include <sys/types.h> <br />#include <netinet/in.h> <br />#include <sys/socket.h> <br />#define SERVPORT 3333 <br />#define MAXDATASIZE 100 /*姣忔鏈澶ф暟鎹紶杈撻噺 */ <br />main(int argc, char *argv[]){ <br />銆int sockfd, recvbytes; <br />銆char buf[MAXDATASIZE]; <br />銆struct hostent *host; <br />銆struct sockaddr_in serv_addr; <br />銆if (argc < 2) { <br />fprintf(stderr,"Please enter the server's hostname!\n"); <br />exit(1); <br />} <br />銆if((host=gethostbyname(argv[1]))==NULL) { <br />herror("gethostbyname鍑洪敊錛?); <br />exit(1); <br />} <br />銆if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ <br />perror("socket鍒涘緩鍑洪敊錛?); <br />exit(1); <br />} <br />銆serv_addr.sin_family=AF_INET; <br />銆serv_addr.sin_port=htons(SERVPORT); <br />銆serv_addr.sin_addr = *((struct in_addr *)host->h_addr); <br />銆bzero(&(serv_addr.sin_zero),8); <br />銆if (connect(sockfd, (struct sockaddr *)&serv_addr, \ <br />銆銆 sizeof(struct sockaddr)) == -1) { <br />perror("connect鍑洪敊錛?); <br />exit(1); <br />} <br />銆if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) { <br />perror("recv鍑洪敊錛?); <br />exit(1); <br />} <br />銆buf[recvbytes] = '\0'; <br />銆printf("Received: %s",buf); <br />銆close(sockfd); <br />} <br />銆銆瀹㈡埛绔▼搴忛鍏堥氳繃鏈嶅姟鍣ㄥ煙鍚嶈幏寰楁湇鍔″櫒鐨処P鍦板潃錛岀劧鍚庡垱寤轟竴涓猻ocket錛岃皟鐢╟onnect鍑芥暟涓庢湇鍔″櫒寤虹珛榪炴帴錛岃繛鎺ユ垚鍔熶箣鍚庢帴鏀朵粠鏈嶅姟鍣ㄥ彂閫佽繃鏉ョ殑鏁版嵁錛屾渶鍚庡叧闂璼ocket銆?<br />銆銆鍑芥暟gethostbyname()鏄畬鎴愬煙鍚嶈漿鎹㈢殑銆傜敱浜嶪P鍦板潃闅句互璁板繂鍜岃鍐欙紝鎵浠ヤ負浜嗘柟渚匡紝浜轟滑甯稿父鐢ㄥ煙鍚嶆潵琛ㄧず涓繪満錛岃繖灝遍渶瑕佽繘琛屽煙鍚嶅拰IP鍦板潃鐨勮漿鎹€傚嚱鏁板師鍨嬩負錛?<br />銆銆struct hostent *gethostbyname(const char *name); <br />銆銆鍑芥暟榪斿洖涓篽osten鐨勭粨鏋勭被鍨嬶紝瀹冪殑瀹氫箟濡備笅錛?<br />銆銆struct hostent { <br />銆 char *h_name; /* 涓繪満鐨勫畼鏂瑰煙鍚?*/ <br />銆銆 char **h_aliases; /* 涓涓互NULL緇撳熬鐨勪富鏈哄埆鍚嶆暟緇?*/ <br />銆銆 int h_addrtype; /* 榪斿洖鐨勫湴鍧綾誨瀷錛屽湪Internet鐜涓嬩負AF-INET */ <br />銆銆int h_length; /* 鍦板潃鐨勫瓧鑺傞暱搴?*/ <br />銆銆 char **h_addr_list; /* 涓涓互0緇撳熬鐨勬暟緇勶紝鍖呭惈璇ヤ富鏈虹殑鎵鏈夊湴鍧*/ <br />銆銆}; <br />銆銆#define h_addr h_addr_list[0] /*鍦╤-addr-list涓殑絎竴涓湴鍧*/ <br />銆銆褰?gethostname()璋冪敤鎴愬姛鏃訛紝榪斿洖鎸囧悜struct hosten鐨勬寚閽堬紝褰撹皟鐢ㄥけ璐ユ椂榪斿洖-1銆傚綋璋冪敤gethostbyname鏃訛紝浣犱笉鑳戒嬌鐢╬error()鍑芥暟鏉ヨ緭鍑洪敊璇俊鎭紝鑰屽簲璇ヤ嬌鐢╤error()鍑芥暟鏉ヨ緭鍑恒?<br /><br />銆銆鏃犺繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄧ▼搴忕殑鍦ㄥ師鐞嗕笂鍜岃繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄦ槸涓鏍風殑錛屼袱鑰呯殑鍖哄埆鍦ㄤ簬鏃犺繛鎺ョ殑瀹㈡埛/鏈嶅姟鍣ㄤ腑鐨勫鎴蜂竴鑸笉闇瑕佸緩绔嬭繛鎺ワ紝鑰屼笖鍦ㄥ彂閫佹帴鏀舵暟鎹椂錛岄渶瑕佹寚瀹氳繙绔満鐨勫湴鍧銆?<br /><br />闃誨鍜岄潪闃誨 <br />銆 銆闃誨鍑芥暟鍦ㄥ畬鎴愬叾鎸囧畾鐨勪換鍔′互鍓嶄笉鍏佽紼嬪簭璋冪敤鍙︿竴涓嚱鏁般備緥濡傦紝紼嬪簭鎵ц涓涓鏁版嵁鐨勫嚱鏁拌皟鐢ㄦ椂錛屽湪姝ゅ嚱鏁板畬鎴愯鎿嶄綔浠ュ墠灝嗕笉浼氭墽琛屼笅涓紼嬪簭璇彞銆傚綋 鏈嶅姟鍣ㄨ繍琛屽埌accept璇彞鏃訛紝鑰屾病鏈夊鎴瘋繛鎺ユ湇鍔¤姹傚埌鏉ワ紝鏈嶅姟鍣ㄥ氨浼氬仠姝㈠湪accept璇彞涓婄瓑寰呰繛鎺ユ湇鍔¤姹傜殑鍒版潵銆傝繖縐嶆儏鍐電О涓洪樆濉? 錛坆locking錛夈傝岄潪闃誨鎿嶄綔鍒欏彲浠ョ珛鍗沖畬鎴愩傛瘮濡傦紝濡傛灉浣犲笇鏈涙湇鍔″櫒浠呬粎娉ㄦ剰媯鏌ユ槸鍚︽湁瀹㈡埛鍦ㄧ瓑寰呰繛鎺ワ紝鏈夊氨鎺ュ彈榪炴帴錛屽惁鍒欏氨緇х畫鍋氬叾浠栦簨鎯咃紝鍒? 鍙互閫氳繃灝哠ocket璁劇疆涓洪潪闃誨鏂瑰紡鏉ュ疄鐜般傞潪闃誨socket鍦ㄦ病鏈夊鎴峰湪絳夊緟鏃跺氨浣縜ccept璋冪敤绔嬪嵆榪斿洖銆?<br />銆銆#include <unistd.h> <br />銆銆#include <fcntl.h> <br />銆銆鈥︹?<br />sockfd = socket(AF_INET,SOCK_STREAM,0); <br />fcntl(sockfd,F_SETFL,O_NONBLOCK)錛?<br />鈥︹?<br />銆 銆閫氳繃璁劇疆socket涓洪潪闃誨鏂瑰紡錛屽彲浠ュ疄鐜?杞"鑻ュ共Socket銆傚綋浼佸浘浠庝竴涓病鏈夋暟鎹瓑寰呭鐞嗙殑闈為樆濉濻ocket璇誨叆鏁版嵁鏃訛紝鍑芥暟灝嗙珛鍗寵繑 鍥烇紝榪斿洖鍊間負-1錛屽茍緗甧rrno鍊間負EWOULDBLOCK銆備絾鏄繖縐?杞"浼氫嬌CPU澶勪簬蹇欑瓑寰呮柟寮忥紝浠庤岄檷浣庢ц兘錛屾氮璐圭郴緇熻祫婧愩傝岃皟鐢? select()浼氭湁鏁堝湴瑙e喅榪欎釜闂錛屽畠鍏佽浣犳妸榪涚▼鏈韓鎸傝搗鏉ワ紝鑰屽悓鏃朵嬌緋葷粺鍐呮牳鐩戝惉鎵瑕佹眰鐨勪竴緇勬枃浠舵弿榪扮鐨勪換浣曟椿鍔紝鍙紜鍦ㄤ換浣曡鐩戞帶鐨勬枃浠? 鎻忚堪絎︿笂鍑虹幇媧誨姩錛宻elect()璋冪敤灝嗚繑鍥炴寚紺鴻鏂囦歡鎻忚堪絎﹀凡鍑嗗濂界殑淇℃伅錛屼粠鑰屽疄鐜頒簡涓鴻繘紼嬮夊嚭闅忔満鐨勫彉鍖栵紝鑰屼笉蹇呯敱榪涚▼鏈韓瀵硅緭鍏ヨ繘琛屾祴璇曡屾氮璐? CPU寮閿銆係elect鍑芥暟鍘熷瀷涓? <br />int select(int numfds,fd_set *readfds,fd_set *writefds錛?<br />fd_set *exceptfds,struct timeval *timeout); <br />銆 銆鍏朵腑readfds銆亀ritefds銆乪xceptfds鍒嗗埆鏄select()鐩戣鐨勮銆佸啓鍜屽紓甯稿鐞嗙殑鏂囦歡鎻忚堪絎﹂泦鍚堛傚鏋滀綘甯屾湜紜畾鏄惁鍙互 浠庢爣鍑嗚緭鍏ュ拰鏌愪釜socket鎻忚堪絎﹁鍙栨暟鎹紝浣犲彧闇瑕佸皢鏍囧噯杈撳叆鐨勬枃浠舵弿榪扮0鍜岀浉搴旂殑sockdtfd鍔犲叆鍒皉eadfds闆嗗悎涓紱numfds鐨勫? 鏄渶瑕佹鏌ョ殑鍙風爜鏈楂樼殑鏂囦歡鎻忚堪絎﹀姞1錛岃繖涓緥瀛愪腑numfds鐨勫煎簲涓簊ockfd+1錛涘綋select榪斿洖鏃訛紝readfds灝嗚淇敼錛屾寚紺烘煇涓枃浠? 鎻忚堪絎﹀凡緇忓噯澶囪璇誨彇錛屼綘鍙互閫氳繃FD_ISSSET()鏉ユ祴璇曘備負浜嗗疄鐜癴d_set涓搴旂殑鏂囦歡鎻忚堪絎︾殑璁劇疆銆佸浣嶅拰嫻嬭瘯錛屽畠鎻愪緵浜嗕竴緇勫畯錛?<br />銆銆FD_ZERO(fd_set *set)----娓呴櫎涓涓枃浠舵弿榪扮闆嗭紱 <br />銆銆FD_SET(int fd,fd_set *set)----灝嗕竴涓枃浠舵弿榪扮鍔犲叆鏂囦歡鎻忚堪絎﹂泦涓紱 <br />銆銆FD_CLR(int fd,fd_set *set)----灝嗕竴涓枃浠舵弿榪扮浠庢枃浠舵弿榪扮闆嗕腑娓呴櫎錛?<br />銆銆FD_ISSET(int fd,fd_set *set)----璇曞垽鏂槸鍚︽枃浠舵弿榪扮琚疆浣嶃?<br />銆銆Timeout鍙傛暟鏄竴涓寚鍚憇truct timeval綾誨瀷鐨勬寚閽堬紝瀹冨彲浠ヤ嬌select()鍦ㄧ瓑寰卼imeout闀挎椂闂村悗娌℃湁鏂囦歡鎻忚堪絎﹀噯澶囧ソ鍗寵繑鍥炪俿truct timeval鏁版嵁緇撴瀯涓猴細 <br />銆銆struct timeval { <br />銆銆 int tv_sec; /* seconds */ <br />銆銆 int tv_usec; /* microseconds */ <br />}; <br /><br />POP3瀹㈡埛绔疄渚?<br />銆銆涓嬮潰鐨勪唬鐮佸疄渚嬪熀浜嶱OP3鐨勫鎴峰崗璁紝涓庨偖浠舵湇鍔″櫒榪炴帴騫跺彇鍥炴寚瀹氱敤鎴峰笎鍙風殑閭歡銆備笌閭歡鏈嶅姟鍣ㄤ氦浜掔殑鍛戒護瀛樺偍鍦ㄥ瓧絎︿覆鏁扮粍POPMessage涓紝紼嬪簭閫氳繃涓涓猟o-while寰幆渚濇鍙戦佽繖浜涘懡浠ゃ?<br />#include<stdio.h> <br />#include <stdlib.h> <br />#include <errno.h> <br />#include <string.h> <br />#include <netdb.h> <br />#include <sys/types.h> <br />#include <netinet/in.h> <br />#include <sys/socket.h> <br />#define POP3SERVPORT 110 <br />#define MAXDATASIZE 4096 <br /><br />main(int argc, char *argv[]){ <br />int sockfd; <br />struct hostent *host; <br />struct sockaddr_in serv_addr; <br />char *POPMessage[]={ <br />"USER userid\r\n", <br />"PASS password\r\n", <br />"STAT\r\n", <br />"LIST\r\n", <br />"RETR 1\r\n", <br />"DELE 1\r\n", <br />"QUIT\r\n", <br />NULL <br />}; <br />int iLength; <br />int iMsg=0; <br />int iEnd=0; <br />char buf[MAXDATASIZE]; <br /><br />if((host=gethostbyname("your.server"))==NULL) { <br />perror("gethostbyname error"); <br />exit(1); <br />} <br />if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ <br />perror("socket error"); <br />exit(1); <br />} <br />serv_addr.sin_family=AF_INET; <br />serv_addr.sin_port=htons(POP3SERVPORT); <br />serv_addr.sin_addr = *((struct in_addr *)host->h_addr); <br />bzero(&(serv_addr.sin_zero),8); <br />if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){ <br />perror("connect error"); <br />exit(1); <br />} <br /><br />do { <br />send(sockfd,POPMessage[iMsg],strlen(POPMessage[iMsg]),0); <br />printf("have sent: %s",POPMessage[iMsg]); <br /><br />iLength=recv(sockfd,buf+iEnd,sizeof(buf)-iEnd,0); <br />iEnd+=iLength; <br />buf[iEnd]='\0'; <br />printf("received: %s,%d\n",buf,iMsg); <br /><br />iMsg++; <br />} while (POPMessage[iMsg]); <br /><br />close(sockfd); <br />}</span> </td> </tr> <!----> <tr> <td> <hr /> </td> </tr> </tbody> </table> <img src ="http://m.shnenglu.com/lmlf001/aggbug/6367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lmlf001/" target="_blank">鑺ヤ箣鑸?/a> 2006-04-27 11:46 <a href="http://m.shnenglu.com/lmlf001/archive/2006/04/27/6367.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://qscxx3.com" target="_blank">亚洲色在线视频</a>| <a href="http://anquye16.com" target="_blank">久久国产精品久久久久久</a>| <a href="http://www433ad.com" target="_blank">一本色道久久综合</a>| <a href="http://343119.com" target="_blank">亚洲精品麻豆</a>| <a href="http://4254888.com" target="_blank">夜久久久久久</a>| <a href="http://www49966.com" target="_blank">小嫩嫩精品导航</a>| <a href="http://2015xiaomingkankan.com" target="_blank">亚洲一区二区三区影院</a>| <a href="http://72966t.com" target="_blank">亚洲一区二区三区成人在线视频精品</a>| <a href="http://78gde.com" target="_blank">亚洲午夜精品久久</a>| <a href="http://chuangke168.com" target="_blank">亚洲日本激情</a>| <a href="http://5b6c.com" target="_blank">国产伦精品一区</a>| <a href="http://yx3369.com" target="_blank">国产乱人伦精品一区二区</a>| <a href="http://118936.com" target="_blank">国产欧美日韩另类视频免费观看</a>| <a href="http://metagasa.com" target="_blank">国产欧美大片</a>| <a href="http://www57669.com" target="_blank">亚洲黄页一区</a>| <a href="http://www-kj777.com" target="_blank">亚洲视频精选</a>| <a href="http://xilxx.com" target="_blank">久久久久久噜噜噜久久久精品</a>| <a href="http://tsjcmm.com" target="_blank">欧美大片一区二区</a>| <a href="http://778877k.com" target="_blank">亚洲精品亚洲人成人网</a>| <a href="http://xccp4888.com" target="_blank">亚洲欧美日韩精品综合在线观看</a>| <a href="http://402626com.com" target="_blank">欧美中文字幕精品</a>| <a href="http://xiaobi13.com" target="_blank">欧美激情五月</a>| <a href="http://tzhsdy.com" target="_blank">国产欧美日韩三级</a>| <a href="http://131397.com" target="_blank">亚洲欧洲日本一区二区三区</a>| <a href="http://9uu91.com" target="_blank">亚洲欧美日韩一区</a>| <a href="http://goldure.com" target="_blank">母乳一区在线观看</a>| <a href="http://www-q28.com" target="_blank">亚洲午夜久久久久久久久电影院 </a>| <a href="http://xuanxuan88.com" target="_blank">久久精品99无色码中文字幕</a>| <a href="http://566805.com" target="_blank">免费看精品久久片</a>| <a href="http://uuuu30.com" target="_blank">国产精品欧美一区喷水</a>| <a href="http://www-136hk.com" target="_blank">永久域名在线精品</a>| <a href="http://www344399.com" target="_blank">亚洲私人影院在线观看</a>| <a href="http://345kt.com" target="_blank">免费成人黄色</a>| <a href="http://yh5557.com" target="_blank">亚洲欧美综合精品久久成人</a>| <a href="http://969093.com" target="_blank">欧美激情精品久久久久</a>| <a href="http://www-35777.com" target="_blank">国产亚洲精品aa</a>| <a href="http://543422.com" target="_blank">亚洲一区国产一区</a>| <a href="http://cfqcgw.com" target="_blank">欧美国产一区视频在线观看</a>| <a href="http://aaa211.com" target="_blank">午夜精品久久久久久久久久久久 </a>| <a href="http://777888789.com" target="_blank">亚洲欧美激情视频</a>| <a href="http://coolpaly.com" target="_blank">欧美国产日韩一区二区三区</a>| <a href="http://hmm47.com" target="_blank">性做久久久久久久久</a>| <a href="http://chengli88.com" target="_blank">欧美激情中文字幕乱码免费</a>| <a href="http://www333393.com" target="_blank">国语对白精品一区二区</a>| <a href="http://erzhuzi.com" target="_blank">亚洲欧美日韩视频一区</a>| <a href="http://456dv.com" target="_blank">99精品欧美一区二区三区</a>| <a href="http://199372.com" target="_blank">美女脱光内衣内裤视频久久影院 </a>| <a href="http://tuiliqi.com" target="_blank">国产欧美日韩在线</a>| <a href="http://filmcameralibrary.com" target="_blank">亚洲精品三级</a>| <a href="http://avtb2120.com" target="_blank">你懂的一区二区</a>| <a href="http://dayomall.com" target="_blank">久久国产夜色精品鲁鲁99</a>| <a href="http://797298.com" target="_blank">国产精品免费福利</a>| <a href="http://428368.com" target="_blank">亚洲网站在线观看</a>| <a href="http://2938476.com" target="_blank">99国产精品99久久久久久</a>| <a href="http://by3787.com" target="_blank">欧美激情久久久久</a>| <a href="http://http456446.com" target="_blank">91久久亚洲</a>| <a href="http://www24699.com" target="_blank">亚洲欧洲精品天堂一级</a>| <a href="http://gaobb52.com" target="_blank">国产一区二区精品久久</a>| <a href="http://xb989.com" target="_blank">国产精品vvv</a>| <a href="http://1397h.com" target="_blank">99精品视频免费观看</a>| <a href="http://2502255.com" target="_blank">欧美电影免费观看网站</a>| <a href="http://heyzo1031.com" target="_blank">久热国产精品视频</a>| <a href="http://qiruiwangluo.com" target="_blank">伊人久久婷婷色综合98网</a>| <a href="http://xshgwy.com" target="_blank">久久久精品2019中文字幕神马</a>| <a href="http://sdxinqi.com" target="_blank">亚洲男女毛片无遮挡</a>| <a href="http://411233.com" target="_blank">国产精品美女久久</a>| <a href="http://16kkkk.com" target="_blank">亚洲在线不卡</a>| <a href="http://www8xvi.com" target="_blank">亚洲一区综合</a>| <a href="http://1277k.com" target="_blank">国产婷婷色一区二区三区四区</a>| <a href="http://hazymall.com" target="_blank">欧美制服丝袜第一页</a>| <a href="http://7755mm.com" target="_blank">欧美一区精品</a>| <a href="http://eee104.com" target="_blank">亚洲国产成人一区</a>| <a href="http://t3gg.com" target="_blank">亚洲二区在线视频</a>| <a href="http://z10669.com" target="_blank">欧美精品观看</a>| <a href="http://1323123.com" target="_blank">亚洲综合视频1区</a>| <a href="http://318823.com" target="_blank">性高湖久久久久久久久</a>| <a href="http://cm1-100.com" target="_blank">在线观看欧美日本</a>| <a href="http://vvv3939.com" target="_blank">亚洲高清自拍</a>| <a href="http://www107aa.com" target="_blank">欧美私人网站</a>| <a href="http://babylonmovi.com" target="_blank">久久精品水蜜桃av综合天堂</a>| <a href="http://3bmmxyz.com" target="_blank">久久日韩精品</a>| <a href="http://xindefalv.com" target="_blank">日韩视频免费看</a>| <a href="http://gjjlzs.com" target="_blank">一区二区三区福利</a>| <a href="http://lctongda.com" target="_blank">国产亚洲精品7777</a>| <a href="http://www-666638.com" target="_blank">欧美黄色免费</a>| <a href="http://1177898.com" target="_blank">欧美性大战久久久久久久蜜臀</a>| <a href="http://www666se.com" target="_blank">欧美一区二区高清在线观看</a>| <a href="http://www201314.com" target="_blank">欧美一区国产在线</a>| <a href="http://0085212.com" target="_blank">亚洲精品在线视频</a>| <a href="http://233116.com" target="_blank">亚洲欧美国产日韩天堂区</a>| <a href="http://www-76577c.com" target="_blank">激情成人亚洲</a>| <a href="http://sp106.com" target="_blank">99热在这里有精品免费</a>| <a href="http://anxingou365.com" target="_blank">国产日韩精品一区观看 </a>| <a href="http://jm1688e.com" target="_blank">美女露胸一区二区三区</a>| <a href="http://9a9u.com" target="_blank">欧美国产日本在线</a>| <a href="http://erodasy.com" target="_blank">午夜精品一区二区在线观看</a>| <a href="http://www-119049.com" target="_blank">欧美在线在线</a>| <a href="http://haohetour.com" target="_blank">99亚洲一区二区</a>| <a href="http://hy1598.com" target="_blank">欧美一级二区</a>| <a href="http://yimeimc.com" target="_blank">aa成人免费视频</a>| <a href="http://527937.com" target="_blank">欧美在线日韩</a>| <a href="http://samucorvin.com" target="_blank">在线亚洲观看</a>| <a href="http://ylsnuha.com" target="_blank">老司机精品导航</a>| <a href="http://www-yh6.com" target="_blank">欧美亚洲视频一区二区</a>| <a href="http://13501680.com" target="_blank">免费成人在线视频网站</a>| <a href="http://868482.com" target="_blank">欧美一区二区成人6969</a>| <a href="http://muwendada.com" target="_blank">欧美高清视频在线播放</a>| <a href="http://ww4477.com" target="_blank">久久gogo国模裸体人体</a>| <a href="http://xp1025.com" target="_blank">欧美久久久久久久久</a>| <a href="http://ibenbio.com" target="_blank">久久青草久久</a>| <a href="http://017455.com" target="_blank">国产精品亚洲精品</a>| <a href="http://wwwhaodd116.com" target="_blank">亚洲区中文字幕</a>| <a href="http://fyfsds.com" target="_blank">欲色影视综合吧</a>| <a href="http://goldure.com" target="_blank">亚洲在线不卡</a>| <a href="http://by2565.com" target="_blank">亚洲午夜激情在线</a>| <a href="http://dailymailnepal.com" target="_blank">免费成人网www</a>| <a href="http://jafzjz.com" target="_blank">乱人伦精品视频在线观看</a>| <a href="http://noeljgq.com" target="_blank">国产精品你懂的</a>| <a href="http://66gg6.com" target="_blank">日韩天天综合</a>| <a href="http://aberyco.com" target="_blank">老司机凹凸av亚洲导航</a>| <a href="http://www-444454.com" target="_blank">一本色道久久99精品综合</a>| <a href="http://sththg.com" target="_blank">黄色精品网站</a>| <a href="http://91porn42.com" target="_blank">亚洲欧美综合精品久久成人</a>| <a href="http://794238.com" target="_blank">亚洲一二三区精品</a>| <a href="http://555yye.com" target="_blank">欧美国产先锋</a>| <a href="http://ccc982.com" target="_blank">欧美成人精品在线视频</a>| <a href="http://917729.com" target="_blank">国产婷婷色综合av蜜臀av</a>| <a href="http://hhsj31.com" target="_blank">亚洲视频在线免费观看</a>| <a href="http://739822.com" target="_blank">99精品国产热久久91蜜凸</a>| <a href="http://ddixx.com" target="_blank">久久综合五月</a>| <a href="http://tefahsop.com" target="_blank">麻豆精品网站</a>| <a href="http://chunhuigk.com" target="_blank">好吊一区二区三区</a>| <a href="http://8484vivo.com" target="_blank">校园春色国产精品</a>| <a href="http://626tw.com" target="_blank">性欧美超级视频</a>| <a href="http://korean-edu.com" target="_blank">欧美午夜电影在线</a>| <a href="http://xingzhiyin85.com" target="_blank">亚洲精品一区二区三区在线观看</a>| <a href="http://32tun.com" target="_blank">最新国产成人在线观看</a>| <a href="http://www-4564949.com" target="_blank">鲁大师成人一区二区三区</a>| <a href="http://yp77741.com" target="_blank">久久五月天婷婷</a>| <a href="http://xhs015.com" target="_blank">亚洲国产激情</a>| <a href="http://www34523.com" target="_blank">久久综合色综合88</a>| <a href="http://kk8c.com" target="_blank">亚洲第一精品夜夜躁人人爽</a>| <a href="http://9955377.com" target="_blank">亚洲激情第一页</a>| <a href="http://zzmzit.com" target="_blank">欧美国产日韩精品</a>| <a href="http://777777hb.com" target="_blank">亚洲国产成人精品女人久久久 </a>| <a href="http://erzhuzi.com" target="_blank">亚洲欧美日韩国产一区二区</a>| <a href="http://avtb2068.com" target="_blank">欧美午夜片在线观看</a>| <a href="http://qiezisp2.com" target="_blank">一本色道久久综合亚洲精品小说</a>| <a href="http://caerusmdx.com" target="_blank">亚洲视频在线播放</a>| <a href="http://www524141.com" target="_blank">国产精品久久久久99</a>| <a href="http://97aixxxx.com" target="_blank">亚洲一区美女视频在线观看免费</a>| <a href="http://aimashe.com" target="_blank">亚洲欧美成人一区二区在线电影 </a>| <a href="http://44cgcg.com" target="_blank">久久精品论坛</a>| <a href="http://gzxyh88.com" target="_blank">激情欧美一区二区三区在线观看</a>| <a href="http://668www.com" target="_blank">久久久999精品视频</a>| <a href="http://jxjx11.com" target="_blank">欧美/亚洲一区</a>| <a href="http://dailymailnepal.com" target="_blank">最近中文字幕mv在线一区二区三区四区</a>| <a href="http://660507jj.com" target="_blank">久久香蕉国产线看观看av</a>| <a href="http://511caifu.com" target="_blank">欧美激情性爽国产精品17p</a>| <a href="http://428368.com" target="_blank">亚洲精品免费一二三区</a>| <a href="http://372469.com" target="_blank">欧美日韩在线免费视频</a>| <a href="http://psykoptic.com" target="_blank">亚洲影音一区</a>| <a href="http://042225.com" target="_blank">免播放器亚洲</a>| <a href="http://eshop999.com" target="_blank">一本色道久久99精品综合 </a>| <a href="http://8868866.com" target="_blank">久久久精品午夜少妇</a>| <a href="http://895658.com" target="_blank">欧美激情精品久久久久久大尺度</a>| <a href="http://yzsss.com" target="_blank">亚洲免费电影在线观看</a>| <a href="http://www36633.com" target="_blank">国产精品高潮呻吟</a>| <a href="http://music444.com" target="_blank">久久激情视频久久</a>| <a href="http://56lw.com" target="_blank">亚洲精品乱码久久久久久按摩观</a>| <a href="http://jiujiuri8.com" target="_blank">亚洲一区免费网站</a>| <a href="http://bjlaosha.com" target="_blank">国产在线精品成人一区二区三区</a>| <a href="http://bjmrkj.com" target="_blank">麻豆91精品91久久久的内涵</a>| <a href="http://zd-jm.com" target="_blank">一区二区免费看</a>| <a href="http://www-119049.com" target="_blank">久久综合久久久</a>| <a href="http://6faa.com" target="_blank">在线一区二区三区四区五区</a>| <a href="http://5177jy.com" target="_blank">韩国av一区二区</a>| <a href="http://teloregen.com" target="_blank">欧美日本中文</a>| <a href="http://www227ee.com" target="_blank">久久久精品国产免大香伊</a>| <a href="http://qq666qq.com" target="_blank">亚洲免费观看在线观看</a>| <a href="http://szxrdr.com" target="_blank">久久久夜精品</a>| <a href="http://www-37277.com" target="_blank">亚洲一区二区三区精品动漫</a>| <a href="http://wanzhixue.com" target="_blank">精品999在线播放</a>| <a href="http://412342.com" target="_blank">亚洲欧美国产77777</a>| <a href="http://119552.com" target="_blank">国产精品久久久久久久久久直播 </a>| <a href="http://dracotek.com" target="_blank">久久精品女人天堂</a>| <a href="http://2312138.com" target="_blank">亚洲毛片一区</a>| <a href="http://3333347.com" target="_blank">99精品视频免费观看</a>| <a href="http://xss521.com" target="_blank">日韩一级片网址</a>| <a href="http://caogb.com" target="_blank">一区二区三区久久</a>| <a href="http://junhuatesu.com" target="_blank">亚洲婷婷在线</a>| <a href="http://tristooges.com" target="_blank">香蕉乱码成人久久天堂爱免费</a>| <a href="http://cfqcgw.com" target="_blank">午夜久久一区</a>| <a href="http://guanghezixun.com" target="_blank">久久精品国产91精品亚洲</a>| <a href="http://89wbw.com" target="_blank">久久久亚洲欧洲日产国码αv </a>| <a href="http://chongpiapia.com" target="_blank">欧美大胆人体视频</a>| <a href="http://www-4890.com" target="_blank">欧美日韩成人综合</a>| <a href="http://32m8.com" target="_blank">国产精品久久久久久超碰</a>| <a href="http://www35353.com" target="_blank">国产色视频一区</a>| <a href="http://456kp.com" target="_blank">亚洲第一成人在线</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>