锘??xml version="1.0" encoding="utf-8" standalone="yes"?>在线观看亚洲,欧美私人啪啪vps,亚洲国产精品一区二区第一页 http://m.shnenglu.com/tankzhouqiang/category/16141.htmlzh-cnSun, 07 Aug 2011 15:08:24 GMTSun, 07 Aug 2011 15:08:24 GMT60linux RPC 嫻嬭瘯錛堣漿杞斤級http://m.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.html鍛ㄥ己鍛ㄥ己Sun, 07 Aug 2011 08:44:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/152718.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/152718.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/152718.html杞嚜:
http://www.justwinit.cn/post/3960/


RPC鏄痝libc鎻愪緵鐨勫嚱鏁板弬鏁?榪斿洖鍊煎皝瑁呮湇鍔? 騫跺皢灝佽緇撴灉閫氳繃緗戠粶浼犲埌鏈嶅姟鍣?
RPC鏈嶅姟绔鍏堣鍚姩portmapper鏈嶅姟.
嫻嬭瘯涓涓畝鍗曠殑RPC浼犺緭紺轟緥, 鍏堝畾涔変竴涓ā鏉挎枃浠秚est.x

program TESTPROG{
        version VERSION{
                int int_echo(int)=1;
                int get_str_len(string)=2;
                int add ( int, int ) = 3;
        }=1;
}=30000;
鍐呭惈3涓嚱鏁? 娉ㄦ剰鍏朵腑涓涓湁2涓弬鏁?
鐒跺悗鍙互鐢╮pcgen鐢熸垚涓涓狹akefile:

rpcgen -a -N test.x

榪欎細鐢熸垚Makefile, 瀹㈡埛绔拰鏈嶅姟绔殑紼嬪簭, 鍜屽嚱鏁扮ず渚?
鎴戜滑鎵嬪伐淇敼涓涓婱akefile

# This is a template Makefile generated by rpcgen
# Parameters
CLIENT = test_client
SERVER = test_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = test.x
TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g -pipe
LDLIBS += -lnsl
RPCGENFLAGS = -N
# Targets
all : $(CLIENT) $(SERVER)
$(TARGETS) : $(SOURCES.x)
        rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
        $(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
        $(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
         $(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)

淇敼test_server.c鏈嶅姟绔殑澶勭悊鍑芥暟, 鎻愪緵3縐嶆湇鍔?

/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
int *
int_echo_1_svc(int arg1,  struct svc_req *rqstp)
{
        static int  result;
        //echo.
        result=arg1;
        printf("[RPC1] source=%d, echo=%d\n", arg1, result);
        return &result;
}
int *
get_str_len_1_svc(char *arg1,  struct svc_req *rqstp)
{
        static int  result;
        //get strlen.
        result=strlen(arg1);
        printf("[PRC2] str=%s, len=%d\n", arg1, result);
        return &result;
}
int *
add_1_svc(int arg1, int arg2,  struct svc_req *rqstp)
{
        static int  result;
        result=arg1+arg2;
        printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
        return &result;
}

瀹㈡埛绔痶est_client.c, 璋冪敤榪欎笁縐嶆湇鍔?

/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
void
testprog_1(char *host)
{
        CLIENT *clnt;
        int  *result_1;
        int int_echo_1_arg1=55;
        int  *result_2;
        char *get_str_len_1_arg1="Hello, world";
        int  *result_3;
        int add_1_arg1=10;
        int add_1_arg2=20;
        clnt = clnt_create (host, TESTPROG, VERSION, "udp");
        if (clnt == NULL) {
                clnt_pcreateerror (host);
                exit (1);
        }
        result_1 = int_echo_1(int_echo_1_arg1, clnt);
        if (result_1 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[PRC1] echo %d, source %d\n", *result_1,
                        int_echo_1_arg1);
        result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
        if (result_2 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[RPC2] return %d, should %d\n", *result_2,
                        strlen(get_str_len_1_arg1));
        result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
        if (result_3 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
                        *result_3);
        clnt_destroy (clnt);
}
OK, 鍙互璋冪敤make浜?
鐢熸垚鍙墽琛岀▼搴弔est_server鍜宼est_client.
鎴戜滑鍚姩./test_server, 鐢╮pcinfo鐪嬬湅:

$rpcinfo -p 127.0.0.1
program vers proto port
100000 2 tcp 111 portmapper
30000 1 udp 36307
30000 1 tcp 34883
Bingo! 鍚姩鎴愬姛.

鍐嶅紑涓粓绔? 灝濊瘯涓涓嬭皟鐢?

./test_client 127.0.0.1
[PRC1] echo 55, source 55
[RPC2] return 12, should 12
[PRC3] 10+20=30

姝f槸鎴戜滑鏈熸湜鐨?

Add By錛欽ackxiang
make -f Makefile.test


鍛ㄥ己 2011-08-07 16:44 鍙戣〃璇勮
]]>
瀹㈡埛/鏈嶅姟鍣ㄧ▼搴忚璁¤寖寮?/title><link>http://m.shnenglu.com/tankzhouqiang/archive/2011/04/04/143413.html</link><dc:creator>鍛ㄥ己</dc:creator><author>鍛ㄥ己</author><pubDate>Mon, 04 Apr 2011 11:38:00 GMT</pubDate><guid>http://m.shnenglu.com/tankzhouqiang/archive/2011/04/04/143413.html</guid><wfw:comment>http://m.shnenglu.com/tankzhouqiang/comments/143413.html</wfw:comment><comments>http://m.shnenglu.com/tankzhouqiang/archive/2011/04/04/143413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tankzhouqiang/comments/commentRss/143413.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tankzhouqiang/services/trackbacks/143413.html</trackback:ping><description><![CDATA[鍙傝?nbsp; unix緗戠粶緙栫▼<br>瀹㈡埛/鏈嶅姟鍣ㄧ▼搴忚璁¤寖寮忔湁<br>錛?錛夎凱浠f湇鍔″櫒錛堟棤榪涚▼鎺у埗)<br>錛?錛夊茍鍙戞湇鍔″櫒錛屾瘡涓鎴瘋姹俧ork 涓涓瓙榪涚▼<br>錛?錛夐鍏堟淳鐢熷瓙榪涚▼錛屾瘡涓瓙榪涚▼鏃犱繚鎶ゅ湴璋冪敤accept<br>錛?錛夐鍏堟淳鐢熷瓙榪涚▼錛屼嬌鐢ㄦ枃浠朵笂閿佷繚鎶ccept<br>錛?錛夐鍏堟淳鐢熷瓙榪涚▼錛屼嬌鐢ㄧ嚎紼嬩簰鏂ラ攣淇濇姢accept錛堝叡浜唴瀛?<br>錛?錛夐鍏堟淳鐢熷瓙榪涚▼錛岀埗榪涚▼鍚戝瓙榪涚▼浼犻掑鎺ュ彛鎻忚堪瀛?br>錛?錛夊茍鍙戞湇鍔″櫒錛屾瘡涓鎴瘋姹傚垱寤轟竴涓嚎紼?br>錛?錛夐鍏堝垱寤虹嚎紼嬫湇鍔″櫒錛屼嬌鐢ㄤ簰鏂ラ攣涓婇攣淇濇姢accept<br>錛?錛夐鍏堝垱寤虹嚎紼嬫湇鍔″櫒錛岀敱涓葷嚎紼嬭皟鐢╝ccept.<br><br>嫻嬭瘯鐢ㄤ緥 瀹㈡埛鍒涘緩5涓繘紼嬶紝姣忎釜鍙戣搗500涓繛鎺ワ紝姣忎釜榪炴帴鍐欏洓涓瓧鑺傛暟鎹?br>                          鎬葷殑鐢ㄦ埛鏃墮棿錛堢錛?               鎬葷殑緋葷粺鏃墮棿錛堢錛?br>錛?錛?                     0.012                                   0.16001<br>錛?錛?                     0.008                                   0.256016<br>錛?錛?                     0.016                                   0.268016<br>錛?錛?                     0.020001                             0.380023<br>錛?錛?                     0.012                                   0.308019<br>錛?錛?                     0.068003                             0.464029<br>錛?錛?                     0.024001                             0.224014<br>錛?錛?                     0.012                                   0.280017<br>錛?錛?                     0.0160001                           0.268016 <br><br> <img src ="http://m.shnenglu.com/tankzhouqiang/aggbug/143413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tankzhouqiang/" target="_blank">鍛ㄥ己</a> 2011-04-04 19:38 <a href="http://m.shnenglu.com/tankzhouqiang/archive/2011/04/04/143413.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Linux涓嬮楦戒紶涔﹀疄鐜?/title><link>http://m.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html</link><dc:creator>鍛ㄥ己</dc:creator><author>鍛ㄥ己</author><pubDate>Tue, 15 Mar 2011 13:57:00 GMT</pubDate><guid>http://m.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html</guid><wfw:comment>http://m.shnenglu.com/tankzhouqiang/comments/141915.html</wfw:comment><comments>http://m.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tankzhouqiang/comments/commentRss/141915.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tankzhouqiang/services/trackbacks/141915.html</trackback:ping><description><![CDATA[<!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:view> <w:zoom>0</w:zoom> <w:trackmoves/> <w:trackformatting/> <w:punctuationkerning/> <w:drawinggridverticalspacing>7.8 紓?/w:drawinggridverticalspacing> <w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery> <w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:saveifxmlinvalid> <w:ignoremixedcontent>false</w:ignoremixedcontent> <w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext> <w:donotpromoteqf/> <w:lidthemeother>EN-US</w:lidthemeother> <w:lidthemeasian>ZH-CN</w:lidthemeasian> <w:lidthemecomplexscript>X-NONE</w:lidthemecomplexscript> <w:compatibility> <w:spaceforul/> <w:balancesinglebytedoublebytewidth/> <w:donotleavebackslashalone/> <w:ultrailspace/> <w:donotexpandshiftreturn/> <w:adjustlineheightintable/> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> <w:usefelayout/> </w:compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel> <m:mathpr> <m:mathfont m:val="Cambria Math"/> <m:brkbin m:val="before"/> <m:brkbinsub m:val="--"/> <m:smallfrac m:val="off"/> <m:dispdef/> <m:lmargin m:val="0"/> <m:rmargin m:val="0"/> <m:defjc m:val="centerGroup"/> <m:wrapindent m:val="1440"/> <m:intlim m:val="subSup"/> <m:narylim m:val="undOvr"/> </m:mathpr></w:worddocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" DefSemiHidden="true" defqformat="false" defpriority="99" LatentStyleCount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Normal"/> <w:lsdexception locked="false" priority="9" semihidden="false" UnhideWhenUsed="false" qformat="true" name="heading 1"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"/> <w:lsdexception locked="false" priority="39" name="toc 1"/> <w:lsdexception locked="false" priority="39" name="toc 2"/> <w:lsdexception locked="false" priority="39" name="toc 3"/> <w:lsdexception locked="false" priority="39" name="toc 4"/> <w:lsdexception locked="false" priority="39" name="toc 5"/> <w:lsdexception locked="false" priority="39" name="toc 6"/> <w:lsdexception locked="false" priority="39" name="toc 7"/> <w:lsdexception locked="false" priority="39" name="toc 8"/> <w:lsdexception locked="false" priority="39" name="toc 9"/> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"/> <w:lsdexception locked="false" priority="10" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Title"/> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"/> <w:lsdexception locked="false" priority="11" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtitle"/> <w:lsdexception locked="false" priority="22" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Strong"/> <w:lsdexception locked="false" priority="20" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Emphasis"/> <w:lsdexception locked="false" priority="59" semihidden="false" UnhideWhenUsed="false" name="Table Grid"/> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"/> <w:lsdexception locked="false" priority="1" semihidden="false" UnhideWhenUsed="false" qformat="true" name="No Spacing"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 1"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 1"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 1"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 1"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 1"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 1"/> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"/> <w:lsdexception locked="false" priority="34" semihidden="false" UnhideWhenUsed="false" qformat="true" name="List Paragraph"/> <w:lsdexception locked="false" priority="29" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Quote"/> <w:lsdexception locked="false" priority="30" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Quote"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 1"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 1"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 1"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 1"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 1"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 1"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 1"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 1"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 2"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 2"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 2"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 2"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 2"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 2"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 2"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 2"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 2"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 2"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 2"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 2"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 2"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 2"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 3"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 3"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 3"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 3"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 3"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 3"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 3"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 3"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 3"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 3"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 3"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 3"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 3"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 3"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 4"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 4"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 4"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 4"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 4"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 4"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 4"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 4"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 4"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 4"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 4"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 4"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 4"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 4"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 5"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 5"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 5"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 5"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 5"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 5"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 5"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 5"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 5"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 5"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 5"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 5"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 5"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 5"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 6"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 6"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 6"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 6"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 6"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 6"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 6"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 6"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 6"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 6"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 6"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 6"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 6"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 6"/> <w:lsdexception locked="false" priority="19" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtle Emphasis"/> <w:lsdexception locked="false" priority="21" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Emphasis"/> <w:lsdexception locked="false" priority="31" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtle Reference"/> <w:lsdexception locked="false" priority="32" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Reference"/> <w:lsdexception locked="false" priority="33" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Book Title"/> <w:lsdexception locked="false" priority="37" name="Bibliography"/> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"/> </w:latentstyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:鏅氳〃鏍? mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:瀹嬩綋; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} </style> <![endif]--> <p class="MsoPlainText"><span lang="EN-US">Linux </span><span>涓嬮楦戒紶涔﹁璁″疄鐜?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">1.</span><span>緋葷粺鍔熻兘<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span>鏍規嵁椋為附浼犱功鍗忚鍦?span lang="EN-US"> linux </span>涓嬪疄鐜伴楦戒紶杈撶▼搴?span lang="EN-US">,</span>騫朵笖涓?span lang="EN-US"> windows </span>涓嬮楦藉吋瀹廣傚叿浣撳姛鑳芥ā鍧楀寘鎷敤鎴蜂笂綰?span lang="EN-US">,</span>涓嬬嚎<span lang="EN-US">,</span>鍒鋒柊鏌ョ湅鍦ㄧ嚎鐢ㄦ埛<span lang="EN-US">,</span>鏀跺彂娑堟伅<span lang="EN-US">,</span>浼犻佹枃浠?span lang="EN-US">/</span>鏂囦歡澶瑰姛鑳芥ā鍧椼?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">2.</span><span>鍏蜂綋瀹炵幇<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">2.1 </span><span>鍏抽敭鏁版嵁緇撴瀯<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>鍛戒護鐨勭粨鏋?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _command</span></p> <p class="MsoPlainText"><span lang="EN-US"> {</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int version;/*</span><span>鍛戒護鐨勭増鏈?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int seq;/*</span><span>鍖呯紪鍙?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char srcName[100];/*</span><span>鍙戦佽呭鍚?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char srcHost[100];/*</span><span>鍙戦佽呬富鏈哄悕<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int flag;/*</span><span>鍛戒護<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char addtion[100];/*</span><span>闄勫姞瀛楁<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"> }command;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>鍦ㄧ嚎鐢ㄦ埛淇℃伅<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _userInfo</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char name[MAXLINE];<span>     </span>/*</span><span>濮撳悕<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char host[MAXLINE];<span>         </span>/*</span><span>涓繪満鍚?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char group[MAXLINE];<span>        </span>/*</span><span>鎵鍦ㄧ殑緇勫悕<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>struct sockaddr_in addr;<span>        </span>/*</span><span>鍦板潃淇℃伅<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>struct _userInfo next;<span>      </span>/*</span><span>閾捐〃涓笅涓涓?span lang="EN-US">*/ </span></span></p> <p class="MsoPlainText"><span lang="EN-US">}userInfo;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>鍦ㄧ嚎鐢ㄦ埛鍒楄〃<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _uList</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>userInfo *userListHead;<span>     </span>/*</span><span>閾捐〃澶?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>userInfo userListTail;<span>      </span>/*</span><span>閾捐〃灝?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">}uList;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>娑堟伅闃熷垪<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _mesList</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>command *mesHead;</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>command *mesTail;</span></p> <p class="MsoPlainText"><span lang="EN-US">}mesList;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">2.2 </span><span>紼嬪簭涓昏緇撴瀯<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span>鏈▼搴忎富瑕侀噰鐢ㄥ綰跨▼緇撴瀯<span lang="EN-US">,</span>鍒嗕負<span lang="EN-US"> receive(</span>鎺ユ敹娑堟伅<span lang="EN-US">), process(</span>澶勭悊鏀跺埌鐨勬秷鎭?span lang="EN-US">), sendData(</span>鍙戦佹枃浠?span lang="EN-US">) </span>涓変釜瀛愮嚎紼嬨傜嚎紼嬮棿閫氫俊浜掓枼閿佷笌<span lang="EN-US"> Posix </span>淇″彿閲忚繘琛岄氫俊銆?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"><br></span><span lang="EN-US"></span></p> <p class="MsoPlainText"><span lang="EN-US">2.3 </span><span>鍑芥暟鎺ュ彛<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">(1) /*</span><span>浠庢枃浠舵弿榪扮<span lang="EN-US">fd</span>涓鍙?span lang="EN-US">count</span>涓瓧絎﹀瓨鍏?span lang="EN-US">buf</span>涓?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>ssize_t readn(int fd,void *buf,size_t count)</span><span>錛?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(2) /*</span><span>灝?span lang="EN-US">buf</span>鎵鎸囧悜鐨勫瓨鍌ㄥ尯涓殑<span lang="EN-US">len</span>涓瓧絎﹀惛鍏ユ枃浠舵弿榪扮<span lang="EN-US">fd</span>涓?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>ssize_t writen(int fd,char *buf,int len);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(3) /*</span><span>鐢ㄤ簬瀛楃涓茶漿鎹?span lang="EN-US">,</span>緗戠粶浼犺緭涓敤<span lang="EN-US">gb2312</span>緙栫爜錛?span lang="EN-US">linux</span>涓?span lang="EN-US">gtk</span>鐢?span lang="EN-US">utf-8</span>緙栫爜錛岄渶瑕佽繘琛岃漿鎹?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(4) /*</span><span>鍦ㄧ敤鎴烽摼琛ㄤ腑鍔犲叆鏂扮敤鎴蜂俊鎭紝鍔犲叆鎴愬姛榪斿洖<span lang="EN-US">1</span>錛屽惁鍒欒繑鍥?span lang="EN-US">0,</span>浣跨敤<span lang="EN-US">userInfoMutex</span>榪涜綰跨▼闂撮氫俊鎺у埗<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>  </span>int pushBack(uList *list,userInfo user);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(5) /*</span><span>鍦ㄧ敤鎴烽摼琛ㄤ腑鍒犻櫎鎸囧畾鍦板潃淇℃伅鐨勭敤鎴鳳紝鍒犻櫎鎴愬姛鍚庤繑鍥?span lang="EN-US">1</span>錛屽惁鍒欒繑鍥?span lang="EN-US">0</span>錛屼嬌鐢?span lang="EN-US">userInfoMutex</span>榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>  </span>int delUser(uList *list, struct sockaddr_in addr);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(6) /*</span><span>鍒ゆ柇璇ョ敤鎴鋒槸鍚﹀凡緇忓瓨鍦紝宸茬粡瀛樺湪鍒欒繑鍥?span lang="EN-US">1</span>錛屽惁鍒欒繑鍥?span lang="EN-US">0,</span>浣跨敤<span lang="EN-US">userInfoMutex</span>榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int isExist(uList *list,struct sockaddr_in addr);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(7)</span><span>娓呯┖鐢ㄦ埛閾捐〃錛岄噴鏀劇┖闂達紝鐢ㄤ簬鐢ㄦ埛閫鍑哄拰鐢ㄦ埛鍒鋒柊鏃墮噴鏀劇┖闂?span lang="EN-US">,</span>浣跨敤<span lang="EN-US">userInfoMutex</span>榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int destroyList(uList *list);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(8)/*</span><span>鍒涘緩鍛戒護瀛?span lang="EN-US">,com</span>涓鴻榪斿洖鐨勫懡浠ゅ瓧<span lang="EN-US">,flag </span>涓烘秷鎭爣蹇?span lang="EN-US">,addtion </span>涓洪檮鍔犳爣蹇?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void createCmd(command & com,int flag,char addtion[])</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(9)/*</span><span>鍙戦佹秷鎭紝<span lang="EN-US">com</span>涓鴻鍙戦佺殑娑堟伅錛?span lang="EN-US">servaddr</span>涓鴻鍙戦佺殑鍦板潃錛?span lang="EN-US">attach</span>涓烘枃浠墮檮浠朵俊鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">void sendCmd(command com, struct sockaddr_in servaddr,char attach[]);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(10) /*</span><span>鎶婃敹鍒扮殑娑堟伅鍔犲叆鍒版秷鎭槦鍒椾腑<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void addMes(mesList *mHead,command cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(11) /*</span><span>鎶婃秷鎭槦鍒椾腑澶撮儴鐨勮妭鐐規秷鎭彁鍙栧嚭鏉ョ敤浜庡鐞?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int delMes(mesList *mHead,command *cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(12)/*</span><span>鍒濆鍖栨搷浣滐紝椋為附鐧誨綍鏃跺垵濮嬪寲娑堟伅閾捐〃錛岀敤鎴烽摼琛紝淇″彿閲忥紝濂楁帴瀛椾俊鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>void init();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(13)/*</span><span>鐧誨綍鎿嶄綔<span lang="EN-US">,</span>鍙戦佺敤鎴蜂笂綰挎秷鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void login();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(14)/*</span><span>瑙f瀽鏀跺埌鐨勬秷鎭懡浠わ紝鎻愬彇鍚勪釜瀛楁<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>int analysisCmd(command *cmd,char *buf);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(15) /*</span><span>鎺ユ敹娑堟伅綰跨▼澶勭悊鍑芥暟<span lang="EN-US">,</span>灝嗘敹鍒扮殑娑堟伅鍔犲叆娑堟伅闃熷垪涓紝閫氳繃淇″彿閲?span lang="EN-US">waitNoFull</span>鍜?span lang="EN-US">waitNoEmpty</span>鍜屾秷鎭鐞嗙嚎紼嬭繘琛岄氫俊銆傛秷鎭槦鍒楃敤<span lang="EN-US">mesMutex</span>涓庡叾浠栫嚎紼嬭繘琛岄氫俊錛屼繚璇佹秷鎭槦鍒楃殑姝g‘鎬?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>void *receive(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(16)/*gtk</span><span>鐣岄潰涓樉紺哄湪綰跨敤鎴蜂俊鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showUser(uList *list);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(17)/*</span><span>鍦?span lang="EN-US">gtk</span>鐣岄潰涓樉紺烘秷鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showMessage(char *message);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(18)/*</span><span>鏄劇ず鏀跺埌鐨勪俊鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showRecvMessage(char *host,char *message);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(19)/*</span><span>鍒嗘瀽鏂囦歡鐨勪俊鎭紝鎻愬彇鏈夌敤鐨勫瓧孌?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void fileAnalysis(char *recv,int *fNum,char *fName,int *fSize,int *fTime,int *fType);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(20) /*</span><span>淇濆瓨鏀跺埌鐨勫崟涓枃浠?span lang="EN-US">,saveName</span>涓轟繚瀛樼殑鏂囦歡鍚?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveSignalFile(char *saveName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(21)/*</span><span>鍒嗘瀽鐩綍闄勪歡錛岃幏寰楃洰褰曟枃浠剁殑鏂囦歡鍚嶏紝鏂囦歡澶у皬錛屾枃浠剁被鍨?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void getDirInfo(char *recv,char *fName,int *fSize,int *fType);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(22) /*</span><span>淇濆瓨鐩綍<span lang="EN-US">,saveName</span>涓鴻淇濆瓨鐨勭洰褰?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveDir(char *saveName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(23)/*</span><span>淇濆瓨鏂囦歡<span lang="EN-US">,recvType=1</span>涓轟繚瀛樻枃浠訛紝<span lang="EN-US">recvType=2</span>涓轟繚瀛樼殑鐩綍<span lang="EN-US">,</span>浣跨敤<span lang="EN-US">fileMutex</span>鏉ヨ緗簰鏂ユ?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(24)/*</span><span>鏀跺埌鍗曚釜鏂囦歡<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveSignalFile(char *recvFileName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(25)/*</span><span>鏀跺埌鍗曚釜鐩綍<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveDir(char *recvDirName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(26)/*</span><span>鎺ユ敹鏂囦歡<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveFile(command cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(27)/*</span><span>淇″彿澶勭悊綰跨▼<span lang="EN-US">,</span>浠庢秷鎭槦鍒椾腑鍙栧嚭娑堟伅榪涜澶勭悊<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void *process(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(28)/*</span><span>鍙戦佹秷鎭?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int sendMes();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(29) /*</span><span>灝嗘枃浠跺悕榪涜杞崲<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">char *transName(char *fileName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(30)/*</span><span>鍙戦佹枃浠?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void sendFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(31)/*</span><span>鍙戦佹枃浠跺す<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void sendDir();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(32)/*</span><span>鐢ㄦ埛鐐瑰嚮鍒鋒柊<span lang="EN-US">,</span>鍒鋒柊鍦ㄧ嚎鐢ㄦ埛<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void refresh();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(33) /*</span><span>鐢ㄦ埛閫鍑?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void quit();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(34)/*</span><span>浼犺緭鏂囦歡澶規暟鎹紝閫掑綊鍑芥暟<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void transferDir(int fd,char *dir);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(35)/*</span><span>鐩戝惉<span lang="EN-US">TCP</span>濂楁帴鍙o紝鍙戦佹枃浠朵笌鏂囦歡澶圭嚎紼?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void *sendData(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(36)/*</span><span>鍒涘緩鑿滃崟<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void create_popup_menu(GtkWidget *menu,GtkWidget *view);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(37)/*</span><span>鍙沖嚮閫変腑<span lang="EN-US">treeview,</span>鏄劇ず浼犻佹枃浠朵笌鏂囦歡澶硅彍鍗?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static gboolean showTreeView(GtkWidget *eventBox,GdkEventButton *event,GtkWidget *menu);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(38)/*</span><span>閫夋嫨瑕佸彂閫佺殑鏂囦歡<span lang="EN-US"> */</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(39)/*</span><span>閫夋嫨瑕佸彂閫佺殑鏂囦歡澶?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectDir();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(40)/*</span><span>閫夋嫨瑕佷繚瀛樼殑鏂囦歡鍚嶆垨鏂囦歡澶瑰悕<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectSaveFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">3.</span><span>鎬葷粨<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span></span><span>瀹炵幇浜?span lang="EN-US">linux</span>涓嬮楦戒紶涔︾殑鍩烘湰鍔熻兘錛屽茍涓旇兘涓?span lang="EN-US">window</span>涓嬮楦借繘琛岄氫俊錛屼紶鏂囦歡銆傜啛鎮変簡<span lang="EN-US">linux</span>涓嬬綉緇滅紪紼嬶紝澶氱嚎紼嬬紪紼嬪強綰跨▼闂撮氫俊錛堜富瑕佺敤鍒頒俊鍙烽噺涓庝簰鏂ラ攣錛夈備絾鍔犲瘑瑙e瘑閭e潡娌℃湁瀹屾垚錛岀▼搴忕粨鏋勪笉鏄緢濂斤紝鐣岄潰鍋氬緱澶樊銆傛湁絀哄簲璇ョ湅鐪嬭璁℃ā寮?span lang="EN-US">.</span></span></p> <p class="MsoPlainText">鐣岄潰鎴浘錛堢晫闈㈡瘮杈冨瀮鍦?錛?/p> <p class="MsoPlainText"><img src="http://m.shnenglu.com/images/cppblog_com/tankzhouqiang/Screenshot.png" border="0"><br><span><span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span><span lang="EN-US">闄勶細</span></span></p> <p class="MsoPlainText"><span><span lang="EN-US">椋為附鍗忚錛?http://bbs.chinaunix.net/viewthread.php?tid=1015775<br></span></span></p> <p class="MsoPlainText"><span> <span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"><br></span><span lang="EN-US"></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoNormal"><span lang="EN-US"> </span></p><img src ="http://m.shnenglu.com/tankzhouqiang/aggbug/141915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tankzhouqiang/" target="_blank">鍛ㄥ己</a> 2011-03-15 21:57 <a href="http://m.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>epoll妯″瀷錛堣漿杞斤級http://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140973.html鍛ㄥ己鍛ㄥ己Wed, 02 Mar 2011 04:23:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140973.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/140973.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140973.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/140973.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/140973.htmlepoll綺鵑珦

鍦╨inux鐨勭綉緇滅紪紼嬩腑錛屽緢闀跨殑鏃墮棿閮藉湪浣跨敤select鏉ュ仛浜嬩歡瑙﹀彂銆傚湪linux鏂扮殑鍐呮牳涓紝鏈変簡涓縐嶆浛鎹㈠畠鐨勬満鍒訛紝灝辨槸epoll銆?br> 鐩告瘮浜巗elect錛宔poll鏈澶х殑濂藉鍦ㄤ簬瀹冧笉浼氶殢鐫鐩戝惉fd鏁扮洰鐨勫闀胯岄檷浣庢晥鐜囥傚洜涓哄湪鍐呮牳涓殑select瀹炵幇涓紝瀹冩槸閲囩敤杞鏉ュ鐞嗙殑錛岃疆璇㈢殑fd鏁扮洰瓚婂錛岃嚜鐒惰楁椂瓚婂銆傚茍涓旓紝鍦╨inux/posix_types.h澶存枃浠舵湁榪欐牱鐨勫0鏄庯細
#define __FD_SETSIZE    1024
琛ㄧずselect鏈澶氬悓鏃剁洃鍚?024涓猣d錛屽綋鐒訛紝鍙互閫氳繃淇敼澶存枃浠跺啀閲嶇紪璇戝唴鏍告潵鎵╁ぇ榪欎釜鏁扮洰錛屼絾榪欎技涔庡茍涓嶆不鏈?br>
epoll鐨勬帴鍙i潪甯哥畝鍗曪紝涓鍏卞氨涓変釜鍑芥暟錛?br> 1. int epoll_create(int size);
鍒? 寤轟竴涓猠poll鐨勫彞鏌勶紝size鐢ㄦ潵鍛婅瘔鍐呮牳榪欎釜鐩戝惉鐨勬暟鐩竴鍏辨湁澶氬ぇ銆傝繖涓弬鏁頒笉鍚屼簬select()涓殑絎竴涓弬鏁幫紝緇欏嚭鏈澶х洃鍚殑fd+1鐨勫箋? 闇瑕佹敞鎰忕殑鏄紝褰撳垱寤哄ソepoll鍙ユ焺鍚庯紝瀹冨氨鏄細鍗犵敤涓涓猣d鍊鹼紝鍦╨inux涓嬪鏋滄煡鐪?proc/榪涚▼id/fd/錛屾槸鑳藉鐪嬪埌榪欎釜fd鐨勶紝鎵浠ュ湪 浣跨敤瀹宔poll鍚庯紝蹇呴』璋冪敤close()鍏抽棴錛屽惁鍒欏彲鑳藉鑷磃d琚楀敖銆?br>

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll鐨勪簨浠舵敞鍐屽嚱鏁幫紝瀹冧笉鍚屼笌select()鏄湪鐩戝惉浜嬩歡鏃跺憡璇夊唴鏍歌鐩戝惉浠涔堢被鍨嬬殑浜嬩歡錛岃屾槸鍦ㄨ繖閲屽厛娉ㄥ唽瑕佺洃鍚殑浜嬩歡綾誨瀷銆傜涓涓弬鏁版槸epoll_create()鐨勮繑鍥炲鹼紝絎簩涓弬鏁拌〃紺哄姩浣滐紝鐢ㄤ笁涓畯鏉ヨ〃紺猴細
EPOLL_CTL_ADD錛氭敞鍐屾柊鐨刦d鍒癳pfd涓紱
EPOLL_CTL_MOD錛氫慨鏀瑰凡緇忔敞鍐岀殑fd鐨勭洃鍚簨浠訛紱
EPOLL_CTL_DEL錛氫粠epfd涓垹闄や竴涓猣d錛?br> 絎笁涓弬鏁版槸闇瑕佺洃鍚殑fd錛岀鍥涗釜鍙傛暟鏄憡璇夊唴鏍擱渶瑕佺洃鍚粈涔堜簨錛宻truct epoll_event緇撴瀯濡備笅錛?br> struct epoll_event {
  __uint32_t events;  /* Epoll events */
  epoll_data_t data;  /* User data variable */
};

events鍙互鏄互涓嬪嚑涓畯鐨勯泦鍚堬細
EPOLLIN 錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彲浠ヨ錛堝寘鎷绔疭OCKET姝e父鍏抽棴錛夛紱
EPOLLOUT錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彲浠ュ啓錛?br> EPOLLPRI錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎︽湁绱фョ殑鏁版嵁鍙錛堣繖閲屽簲璇ヨ〃紺烘湁甯﹀鏁版嵁鍒版潵錛夛紱
EPOLLERR錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彂鐢熼敊璇紱
EPOLLHUP錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹁鎸傛柇錛?br> EPOLLET錛?灝咵POLL璁句負杈圭紭瑙﹀彂(Edge Triggered)妯″紡錛岃繖鏄浉瀵逛簬姘村鉤瑙﹀彂(Level Triggered)鏉ヨ鐨勩?br> EPOLLONESHOT錛氬彧鐩戝惉涓嬈′簨浠訛紝褰撶洃鍚畬榪欐浜嬩歡涔嬪悗錛屽鏋滆繕闇瑕佺戶緇洃鍚繖涓猻ocket鐨勮瘽錛岄渶瑕佸啀嬈℃妸榪欎釜socket鍔犲叆鍒癊POLL闃熷垪閲?br>

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
絳? 寰呬簨浠剁殑浜х敓錛岀被浼間簬select()璋冪敤銆傚弬鏁癳vents鐢ㄦ潵浠庡唴鏍稿緱鍒頒簨浠剁殑闆嗗悎錛宮axevents鍛婁箣鍐呮牳榪欎釜events鏈夊澶э紝榪欎釜 maxevents鐨勫間笉鑳藉ぇ浜庡垱寤篹poll_create()鏃剁殑size錛屽弬鏁皌imeout鏄秴鏃舵椂闂達紙姣錛?浼氱珛鍗寵繑鍥烇紝-1灝嗕笉紜畾錛屼篃鏈? 璇存硶璇存槸姘鎬箙闃誨錛夈傝鍑芥暟榪斿洖闇瑕佸鐞嗙殑浜嬩歡鏁扮洰錛屽榪斿洖0琛ㄧず宸茶秴鏃躲?br>
--------------------------------------------------------------------------------------------

浠巑an鎵嬪唽涓紝寰楀埌ET鍜孡T鐨勫叿浣撴弿榪板涓?br>
EPOLL浜嬩歡鏈変袱縐嶆ā鍨嬶細
Edge Triggered (ET)
Level Triggered (LT)

鍋囧鏈夎繖鏍蜂竴涓緥瀛愶細
1. 鎴戜滑宸茬粡鎶婁竴涓敤鏉ヤ粠綆¢亾涓鍙栨暟鎹殑鏂囦歡鍙ユ焺(RFD)娣誨姞鍒癳poll鎻忚堪絎?br> 2. 榪欎釜鏃跺欎粠綆¢亾鐨勫彟涓绔鍐欏叆浜?KB鐨勬暟鎹?br> 3. 璋冪敤epoll_wait(2)錛屽茍涓斿畠浼氳繑鍥濺FD錛岃鏄庡畠宸茬粡鍑嗗濂借鍙栨搷浣?br> 4. 鐒跺悗鎴戜滑璇誨彇浜?KB鐨勬暟鎹?br> 5. 璋冪敤epoll_wait(2)......

Edge Triggered 宸ヤ綔妯″紡錛?br> 濡? 鏋滄垜浠湪絎?姝ュ皢RFD娣誨姞鍒癳poll鎻忚堪絎︾殑鏃跺欎嬌鐢ㄤ簡EPOLLET鏍囧織錛岄偅涔堝湪絎?姝ヨ皟鐢╡poll_wait(2)涔嬪悗灝嗘湁鍙兘浼氭寕璧鳳紝鍥犱負鍓? 浣欑殑鏁版嵁榪樺瓨鍦ㄤ簬鏂囦歡鐨勮緭鍏ョ紦鍐插尯鍐咃紝鑰屼笖鏁版嵁鍙戝嚭绔繕鍦ㄧ瓑寰呬竴涓拡瀵瑰凡緇忓彂鍑烘暟鎹殑鍙嶉淇℃伅銆傚彧鏈夊湪鐩戣鐨勬枃浠跺彞鏌勪笂鍙戠敓浜嗘煇涓簨浠剁殑鏃跺?ET 宸ヤ綔妯″紡鎵嶄細姹囨姤浜嬩歡銆傚洜姝ゅ湪絎?姝ョ殑鏃跺欙紝璋冪敤鑰呭彲鑳戒細鏀懼純絳夊緟浠嶅湪瀛樺湪浜庢枃浠惰緭鍏ョ紦鍐插尯鍐呯殑鍓╀綑鏁版嵁銆傚湪涓婇潰鐨勪緥瀛愪腑錛屼細鏈変竴涓簨浠朵駭鐢熷湪RFD鍙ユ焺 涓婏紝鍥犱負鍦ㄧ2姝ユ墽琛屼簡涓涓啓鎿嶄綔錛岀劧鍚庯紝浜嬩歡灝嗕細鍦ㄧ3姝ヨ閿姣併傚洜涓虹4姝ョ殑璇誨彇鎿嶄綔娌℃湁璇葷┖鏂囦歡杈撳叆緙撳啿鍖哄唴鐨勬暟鎹紝鍥犳鎴戜滑鍦ㄧ5姝ヨ皟鐢? epoll_wait(2)瀹屾垚鍚庯紝鏄惁鎸傝搗鏄笉紜畾鐨勩俥poll宸ヤ綔鍦‥T妯″紡鐨勬椂鍊欙紝蹇呴』浣跨敤闈為樆濉炲鎺ュ彛錛屼互閬垮厤鐢變簬涓涓枃浠跺彞鏌勭殑闃誨璇?闃誨 鍐欐搷浣滄妸澶勭悊澶氫釜鏂囦歡鎻忚堪絎︾殑浠誨姟楗挎銆傛渶濂戒互涓嬮潰鐨勬柟寮忚皟鐢‥T妯″紡鐨別poll鎺ュ彛錛屽湪鍚庨潰浼氫粙緇嶉伩鍏嶅彲鑳界殑緙洪櫡銆?br>    i    鍩轟簬闈為樆濉炴枃浠跺彞鏌?br>    ii   鍙湁褰搑ead(2)鎴栬厀rite(2)榪斿洖EAGAIN鏃舵墠闇瑕佹寕璧鳳紝絳夊緟銆?span style="font-weight: bold; color: #0001ff;">浣嗚繖騫朵笉鏄姣忔read()鏃墮兘闇瑕佸驚鐜錛岀洿鍒拌鍒頒駭鐢熶竴涓狤AGAIN鎵嶈涓烘嬈′簨浠跺鐞嗗畬鎴愶紝褰搑ead()榪斿洖鐨勮鍒扮殑鏁版嵁闀垮害灝忎簬璇鋒眰鐨勬暟鎹暱搴︽椂錛屽氨鍙互紜畾姝ゆ椂緙撳啿涓凡娌℃湁鏁版嵁浜嗭紝涔熷氨鍙互璁や負姝や簨璇諱簨浠跺凡澶勭悊瀹屾垚銆?/span>

Level Triggered 宸ヤ綔妯″紡
鐩? 鍙嶇殑錛屼互LT鏂瑰紡璋冪敤epoll鎺ュ彛鐨勬椂鍊欙紝瀹冨氨鐩稿綋浜庝竴涓熷害姣旇緝蹇殑poll(2)錛屽茍涓旀棤璁哄悗闈㈢殑鏁版嵁鏄惁琚嬌鐢紝鍥犳浠栦滑鍏鋒湁鍚屾牱鐨勮亴鑳姐傚洜涓哄嵆 浣夸嬌鐢‥T妯″紡鐨別poll錛屽湪鏀跺埌澶氫釜chunk鐨勬暟鎹殑鏃跺欎粛鐒朵細浜х敓澶氫釜浜嬩歡銆傝皟鐢ㄨ呭彲浠ヨ瀹欵POLLONESHOT鏍囧織錛屽湪 epoll_wait(2)鏀跺埌浜嬩歡鍚巈poll浼氫笌浜嬩歡鍏寵仈鐨勬枃浠跺彞鏌勪粠epoll鎻忚堪絎︿腑紱佹鎺夈傚洜姝ゅ綋EPOLLONESHOT璁懼畾鍚庯紝浣跨敤甯︽湁 EPOLL_CTL_MOD鏍囧織鐨別poll_ctl(2)澶勭悊鏂囦歡鍙ユ焺灝辨垚涓鴻皟鐢ㄨ呭繀欏諱綔鐨勪簨鎯呫?br>

鐒跺悗璇︾粏瑙i噴ET, LT:

LT(level triggered)鏄己鐪佺殑宸ヤ綔鏂瑰紡錛屽茍涓斿悓鏃舵敮鎸乥lock鍜宯o-block socket.鍦ㄨ繖縐嶅仛娉曚腑錛屽唴鏍稿憡璇変綘涓涓枃浠舵弿榪扮鏄惁灝辯華浜嗭紝鐒跺悗浣犲彲浠ュ榪欎釜灝辯華鐨刦d榪涜IO鎿嶄綔銆傚鏋滀綘涓嶄綔浠諱綍鎿嶄綔錛屽唴鏍歌繕鏄細緇х畫閫氱煡浣? 鐨勶紝鎵浠ワ紝榪欑妯″紡緙栫▼鍑洪敊璇彲鑳芥ц灝忎竴鐐廣備紶緇熺殑select/poll閮芥槸榪欑妯″瀷鐨勪唬琛紟

ET(edge-triggered) 鏄珮閫熷伐浣滄柟寮忥紝鍙敮鎸乶o-block socket銆傚湪榪欑妯″紡涓嬶紝褰撴弿榪扮浠庢湭灝辯華鍙樹負灝辯華鏃訛紝鍐呮牳閫氳繃epoll鍛婅瘔浣犮傜劧鍚庡畠浼氬亣璁句綘鐭ラ亾鏂囦歡鎻忚堪絎﹀凡緇忓氨緇紝騫朵笖涓嶄細鍐嶄負閭d釜鏂囦歡鎻忚堪 絎﹀彂閫佹洿澶氱殑灝辯華閫氱煡錛岀洿鍒頒綘鍋氫簡鏌愪簺鎿嶄綔瀵艱嚧閭d釜鏂囦歡鎻忚堪絎︿笉鍐嶄負灝辯華鐘舵佷簡(姣斿錛屼綘鍦ㄥ彂閫侊紝鎺ユ敹鎴栬呮帴鏀惰姹傦紝鎴栬呭彂閫佹帴鏀剁殑鏁版嵁灝戜簬涓瀹氶噺鏃跺鑷? 浜嗕竴涓狤WOULDBLOCK 閿欒錛夈備絾鏄娉ㄦ剰錛屽鏋滀竴鐩翠笉瀵硅繖涓猣d浣淚O鎿嶄綔(浠庤屽鑷村畠鍐嶆鍙樻垚鏈氨緇?錛屽唴鏍鎬笉浼氬彂閫佹洿澶氱殑閫氱煡(only once),涓嶈繃鍦═CP鍗忚涓紝ET妯″紡鐨勫姞閫熸晥鐢ㄤ粛闇瑕佹洿澶氱殑benchmark紜錛堣繖鍙ヨ瘽涓嶇悊瑙o級銆?/span>

鍦? 璁稿嫻嬭瘯涓垜浠細鐪嬪埌濡傛灉娌℃湁澶ч噺鐨刬dle -connection鎴栬卍ead-connection錛宔poll鐨勬晥鐜囧茍涓嶄細姣攕elect/poll楂樺緢澶氾紝浣嗘槸褰撴垜浠亣鍒板ぇ閲忕殑idle- connection(渚嬪WAN鐜涓瓨鍦ㄥぇ閲忕殑鎱㈤熻繛鎺?錛屽氨浼氬彂鐜癳poll鐨勬晥鐜囧ぇ澶ч珮浜巗elect/poll銆傦紙鏈祴璇曪級



鍙﹀錛屽綋浣跨敤epoll鐨凟T妯″瀷鏉ュ伐浣滄椂錛屽綋浜х敓浜嗕竴涓狤POLLIN浜嬩歡鍚庯紝
璇繪暟鎹殑鏃跺欓渶瑕佽冭檻鐨勬槸褰搑ecv()榪斿洖鐨勫ぇ灝忓鏋滅瓑浜庤姹傜殑澶у皬錛岄偅涔堝緢鏈夊彲鑳芥槸緙撳啿鍖鴻繕鏈夋暟鎹湭璇誨畬錛屼篃鎰忓懗鐫璇ユ浜嬩歡榪樻病鏈夊鐞嗗畬錛屾墍浠ヨ繕闇瑕佸啀嬈¤鍙?/span> 錛?br> while(rs)
{
  buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);
  if(buflen < 0)
  {
    // 鐢變簬鏄潪闃誨鐨勬ā寮?鎵浠ュ綋errno涓篍AGAIN鏃?琛ㄧず褰撳墠緙撳啿鍖哄凡鏃犳暟鎹彲璇?br>     // 鍦ㄨ繖閲屽氨褰撲綔鏄嬈′簨浠跺凡澶勭悊澶?
    if(errno == EAGAIN)
     break;
    else
     return;
   }
   else if(buflen == 0)
   {
     // 榪欓噷琛ㄧず瀵圭鐨剆ocket宸叉甯稿叧闂?
   }
   if(buflen == sizeof(buf)
     rs = 1;   // 闇瑕佸啀嬈¤鍙?/span>
   else
     rs = 0;
}


榪? 鏈夛紝鍋囧鍙戦佺嫻侀噺澶т簬鎺ユ敹绔殑嫻侀噺(鎰忔濇槸epoll鎵鍦ㄧ殑紼嬪簭璇繪瘮杞彂鐨剆ocket瑕佸揩),鐢變簬鏄潪闃誨鐨剆ocket,閭d箞send()鍑芥暟铏界劧 榪斿洖,浣嗗疄闄呯紦鍐插尯鐨勬暟鎹茍鏈湡姝e彂緇欐帴鏀剁,榪欐牱涓嶆柇鐨勮鍜屽彂錛屽綋緙撳啿鍖烘弧鍚庝細浜х敓EAGAIN閿欒(鍙傝僲an send),鍚屾椂,涓嶇悊浼氳繖嬈¤姹傚彂閫佺殑鏁版嵁.鎵浠?闇瑕佸皝瑁卻ocket_send()鐨勫嚱鏁扮敤鏉ュ鐞嗚繖縐嶆儏鍐?璇ュ嚱鏁頒細灝介噺灝嗘暟鎹啓瀹屽啀榪斿洖錛岃繑鍥? -1琛ㄧず鍑洪敊銆傚湪socket_send()鍐呴儴,褰撳啓緙撳啿宸叉弧(send()榪斿洖-1,涓攅rrno涓篍AGAIN),閭d箞浼氱瓑寰呭悗鍐嶉噸璇?榪欑鏂瑰紡騫? 涓嶅緢瀹岀編,鍦ㄧ悊璁轟笂鍙兘浼氶暱鏃墮棿鐨勯樆濉炲湪socket_send()鍐呴儴,浣嗘殏娌℃湁鏇村ソ鐨勫姙娉?

ssize_t socket_send(int sockfd, const char* buffer, size_t buflen)
{
  ssize_t tmp;
  size_t total = buflen;
  const char *p = buffer;

  while(1)
  {
    tmp = send(sockfd, p, total, 0);
    if(tmp < 0)
    {
      // 褰搒end鏀跺埌淇″彿鏃?鍙互緇х畫鍐?浣嗚繖閲岃繑鍥?1.
      if(errno == EINTR)
        return -1;

      // 褰搒ocket鏄潪闃誨鏃?濡傝繑鍥炴閿欒,琛ㄧず鍐欑紦鍐查槦鍒楀凡婊?
      // 鍦ㄨ繖閲屽仛寤舵椂鍚庡啀閲嶈瘯.
      if(errno == EAGAIN)
      {
        usleep(1000);
        continue;
      }

      return -1;
    }

    if((size_t)tmp == total)
      return buflen;

    total -= tmp;
    p += tmp;
  }

  return tmp;
}



鍛ㄥ己 2011-03-02 12:23 鍙戣〃璇勮
]]>
epoll妯″瀷瀹炰緥錛堣漿杞斤級http://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140972.html鍛ㄥ己鍛ㄥ己Wed, 02 Mar 2011 04:22:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140972.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/140972.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/03/02/140972.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/140972.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/140972.html

epoll瀛︿範絎旇

epoll鏈変袱縐嶆ā寮?Edge Triggered(綆縐癊T) 鍜?Level Triggered(綆縐癓T).鍦ㄩ噰鐢ㄨ繖涓ょ妯″紡鏃惰娉ㄦ剰鐨勬槸,濡傛灉閲囩敤ET妯″紡,閭d箞浠呭綋鐘舵佸彂鐢熷彉鍖栨椂鎵嶄細閫氱煡,鑰岄噰鐢↙T妯″紡綾諱技浜庡師鏉ョ殑 select/poll鎿嶄綔,鍙榪樻湁娌℃湁澶勭悊鐨勪簨浠跺氨浼氫竴鐩撮氱煡.

浠ヤ唬鐮佹潵璇存槑闂:
棣栧厛緇欏嚭server鐨勪唬鐮?闇瑕佽鏄庣殑鏄瘡嬈ccept鐨勮繛鎺?鍔犲叆鍙闆嗙殑鏃跺欓噰鐢ㄧ殑閮芥槸ET妯″紡,鑰屼笖鎺ユ敹緙撳啿鍖烘槸5瀛楄妭鐨?涔熷氨鏄瘡嬈″彧鎺ユ敹5瀛楄妭鐨勬暟鎹?

#include  < iostream >
#include 
< sys / socket.h >
#include 
< sys / epoll.h >
#include 
< netinet / in.h >
#include 
< arpa / inet.h >
#include 
< fcntl.h >
#include 
< unistd.h >
#include 
< stdio.h >
#include 
< errno.h >

using namespace std;

#define MAXLINE 
5
#define OPEN_MAX 
100
#define LISTENQ 
20
#define SERV_PORT 
5000
#define INFTIM 
1000

void setnonblocking(
int  sock)
{
    
int  opts;
    opts
= fcntl(sock,F_GETFL);
    
if (opts < 0 )
    {
        perror(
" fcntl(sock,GETFL) " );
        
exit ( 1 );
    }
    opts 
=  opts|O_NONBLOCK;
    
if (fcntl(sock,F_SETFL,opts) < 0 )
    {
        perror(
" fcntl(sock,SETFL,opts) " );
        
exit ( 1 );
    }   
}

int  main()
{
    
int  i, maxi, listenfd, connfd, sockfd,epfd,nfds;
    ssize_t n;
    char line[MAXLINE];
    socklen_t clilen;
    
// 澹版槑epoll_event緇撴瀯浣撶殑鍙橀噺,ev鐢ㄤ簬娉ㄥ唽浜嬩歡,鏁扮粍鐢ㄤ簬鍥炰紶瑕佸鐞嗙殑浜嬩歡
    struct epoll_event ev,events[
20 ];
    
// 鐢熸垚鐢ㄤ簬澶勭悊accept鐨別poll涓撶敤鐨勬枃浠舵弿榪扮
    epfd
= epoll_create( 256 );
    struct sockaddr_in clientaddr;
    struct sockaddr_in serveraddr;
    listenfd 
=  socket(AF_INET, SOCK_STREAM,  0 );
    
// 鎶妔ocket璁劇疆涓洪潪闃誨鏂瑰紡
    
// setnonblocking(listenfd);
    
// 璁劇疆涓庤澶勭悊鐨勪簨浠剁浉鍏崇殑鏂囦歡鎻忚堪絎?br>     ev.data.fd = listenfd;
    
// 璁劇疆瑕佸鐞嗙殑浜嬩歡綾誨瀷
    ev.events
= EPOLLIN|EPOLLET;
    
// ev.events = EPOLLIN;
    
// 娉ㄥ唽epoll浜嬩歡
    epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,
& ev);
    bzero(
& serveraddr, sizeof(serveraddr));
    serveraddr.sin_family 
=  AF_INET;
    char 
* local_addr = " 127.0.0.1 " ;
    inet_aton(local_addr,
& (serveraddr.sin_addr)); // htons(SERV_PORT);
    serveraddr.sin_port
= htons(SERV_PORT);
    bind(listenfd,(sockaddr 
* ) & serveraddr, sizeof(serveraddr));
    listen(listenfd, LISTENQ);
    maxi 
=   0 ;
    
for  ( ; ; ) {
        
// 絳夊緟epoll浜嬩歡鐨勫彂鐢?br>         nfds = epoll_wait(epfd,events, 20 , 500 );
        
// 澶勭悊鎵鍙戠敓鐨勬墍鏈変簨浠?nbsp;    
        
for (i = 0 ;i < nfds; ++ i)
        {
            
if (events[i].data.fd == listenfd)
            {
                clilen=sizeof(struct sockaddr);
                connfd  =  accept(listenfd,(struct sockaddr  * ) & clientaddr,  & clilen);
                
if (connfd < 0 ){
                    perror(
" connfd<0 " );
                    
exit ( 1 );
                }
                
// setnonblocking(connfd);
                char 
* str  =  inet_ntoa(clientaddr.sin_addr);
                cout 
<<   " accapt a connection from  "   <<  str  <<  endl;
                
// 璁劇疆鐢ㄤ簬璇繪搷浣滅殑鏂囦歡鎻忚堪絎?br>                 ev.data.fd = connfd;
                
// 璁劇疆鐢ㄤ簬娉ㄦ祴鐨勮鎿嶄綔浜嬩歡
                ev.events
= EPOLLIN|EPOLLET;
                
// ev.events = EPOLLIN;
                
// 娉ㄥ唽ev
                epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,
& ev);
            }
            
else   if (events[i].events & EPOLLIN)
            {
                cout 
<<   " EPOLLIN "   <<  endl;
                
if  ( (sockfd  =  events[i].data.fd)  <   0
                    continue;
                
if  ( (n  =  read(sockfd, line, MAXLINE))  <   0 ) {
                    
if  (errno  ==  ECONNRESET) {
                        close(sockfd);
                        events[i].data.fd 
=   - 1 ;
                    } 
else
                        std::cout
<< " readline error " << std::endl;
                } 
else   if  (n  ==   0 ) {
                    close(sockfd);
                    events[i].data.fd 
=   - 1 ;
                }
                line[n] 
=   ' \0';
                cout  <<   " read  "   <<  line  <<  endl;
                
// 璁劇疆鐢ㄤ簬鍐欐搷浣滅殑鏂囦歡鎻忚堪絎?br>                 ev.data.fd = sockfd;
                
// 璁劇疆鐢ㄤ簬娉ㄦ祴鐨勫啓鎿嶄綔浜嬩歡
                ev.events
= EPOLLOUT|EPOLLET;
                
// 淇敼sockfd涓婅澶勭悊鐨勪簨浠朵負EPOLLOUT
                
// epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd, & ev);
            }
            
else   if (events[i].events & EPOLLOUT)
            {   
                sockfd 
=  events[i].data.fd;
                write(sockfd, line, n);
                
// 璁劇疆鐢ㄤ簬璇繪搷浣滅殑鏂囦歡鎻忚堪絎?br>                 ev.data.fd = sockfd;
                
// 璁劇疆鐢ㄤ簬娉ㄦ祴鐨勮鎿嶄綔浜嬩歡
                ev.events
= EPOLLIN|EPOLLET;
                
// 淇敼sockfd涓婅澶勭悊鐨勪簨浠朵負EPOLIN
                epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,
& ev);
            }
        }
    }
    return 
0 ;
}


涓嬮潰緇欏嚭嫻嬭瘯鎵鐢ㄧ殑Perl鍐欑殑client绔?鍦╟lient涓彂閫?0瀛楄妭鐨勬暟鎹?鍚屾椂璁ヽlient鍦ㄥ彂閫佸畬鏁版嵁涔嬪悗榪涘叆姝誨驚鐜? 涔熷氨鏄湪鍙戦佸畬涔嬪悗榪炴帴鐨勭姸鎬佷笉鍙戠敓鏀瑰彉--鏃笉鍐嶅彂閫佹暟鎹? 涔熶笉鍏抽棴榪炴帴,榪欐牱鎵嶈兘瑙傚療鍑簊erver鐨勭姸鎬?

#! / usr / bin / perl

use IO::Socket;

my $host 
=   " 127.0.0.1 " ;
my $port 
=   5000 ;

my $socket 
=  IO::Socket::INET -> new ( " $host:$port " or  die  " create socket error $@ " ;
my $msg_out 
=   " 1234567890 " ;
print $socket $msg_out;
print 
" now send over, go to sleep \n " ;

while  ( 1 )
{
    sleep(
1 );
}

榪愯server鍜宑lient鍙戠幇,server浠呬粎璇誨彇浜?瀛楄妭鐨勬暟鎹?鑰宑lient鍏跺疄鍙戦佷簡10瀛楄妭鐨勬暟鎹?涔熷氨鏄,server浠呭綋絎竴嬈? 鐩戝惉鍒頒簡EPOLLIN浜嬩歡,鐢變簬娌℃湁璇誨彇瀹屾暟鎹?鑰屼笖閲囩敤鐨勬槸ET妯″紡,鐘舵佸湪姝や箣鍚庝笉鍙戠敓鍙樺寲,鍥犳server鍐嶄篃鎺ユ敹涓嶅埌EPOLLIN浜嬩歡浜?
(鍙嬫儏鎻愮ず:涓婇潰鐨勮繖涓祴璇曞鎴風,褰撲綘鍏抽棴瀹冪殑鏃跺欎細鍐嶆鍑哄彂IO鍙浜嬩歡緇檚erver,姝ゆ椂server灝變細鍘昏鍙栧墿涓嬬殑5瀛楄妭鏁版嵁浜?浣嗘槸榪欎竴浜嬩歡涓庡墠闈㈡弿榪扮殑ET鎬ц川騫朵笉鐭涚浘.)

濡傛灉鎴戜滑鎶奵lient鏀逛負榪欐牱:

#! / usr / bin / perl

use IO::Socket;

my $host 
=   " 127.0.0.1 " ;
my $port 
=   5000 ;

my $socket 
=  IO::Socket::INET -> new ( " $host:$port " or  die  " create socket error $@ " ;
my $msg_out 
=   " 1234567890 " ;
print $socket $msg_out;
print 
" now send over, go to sleep \n " ;
sleep(
5 );
print 
" 5 second gone send another line\n " ;
print $socket $msg_out;

while  ( 1 )
{
    sleep(
1 );
}


鍙互鍙戠幇,鍦╯erver鎺ユ敹瀹?瀛楄妭鐨勬暟鎹箣鍚庝竴鐩寸洃鍚笉鍒癱lient鐨勪簨浠?鑰屽綋client浼戠湢5縐掍箣鍚庨噸鏂板彂閫佹暟鎹?server鍐嶆鐩戝惉鍒頒簡鍙樺寲,鍙笉榪囧洜涓哄彧鏄鍙栦簡5涓瓧鑺?浠嶇劧鏈?0涓瓧鑺傜殑鏁版嵁(client絎簩嬈″彂閫佺殑鏁版嵁)娌℃湁鎺ユ敹瀹?

濡傛灉涓婇潰鐨勫疄楠屼腑,瀵筧ccept鐨剆ocket閮介噰鐢ㄧ殑鏄疞T妯″紡,閭d箞鍙榪樻湁鏁版嵁鐣欏湪buffer涓?server灝變細緇х畫寰楀埌閫氱煡,璇昏呭彲浠ヨ嚜琛屾敼鍔ㄤ唬鐮佽繘琛屽疄楠?

鍩? 浜庤繖涓や釜瀹為獙,鍙互寰楀嚭榪欐牱鐨勭粨璁?ET妯″紡浠呭綋鐘舵佸彂鐢熷彉鍖栫殑鏃跺欐墠鑾峰緱閫氱煡,榪欓噷鎵璋撶殑鐘舵佺殑鍙樺寲騫朵笉鍖呮嫭緙撳啿鍖轟腑榪樻湁鏈鐞嗙殑鏁版嵁,涔熷氨鏄,濡傛灉 瑕侀噰鐢‥T妯″紡,闇瑕佷竴鐩磖ead/write鐩村埌鍑洪敊涓烘,寰堝浜哄弽鏄犱負浠涔堥噰鐢‥T妯″紡鍙帴鏀朵簡涓閮ㄥ垎鏁版嵁灝卞啀涔熷緱涓嶅埌閫氱煡浜?澶у鍥犱負榪欐牱;鑰孡T 妯″紡鏄彧瑕佹湁鏁版嵁娌℃湁澶勭悊灝變細涓鐩撮氱煡涓嬪幓鐨?

琛ュ厖璇存槑涓涓嬭繖閲屼竴鐩村己璋冪殑"鐘舵佸彉鍖?鏄粈涔?

1)瀵逛簬鐩戝惉鍙浜嬩歡鏃?濡傛灉鏄痵ocket鏄洃鍚瑂ocket,閭d箞褰撴湁鏂扮殑涓誨姩榪炴帴鍒版潵涓虹姸鎬佸彂鐢熷彉鍖?瀵逛竴鑸殑socket鑰岃█,鍗忚鏍堜腑鐩稿簲鐨勭紦 鍐插尯鏈夋柊鐨勬暟鎹負鐘舵佸彂鐢熷彉鍖?浣嗘槸,濡傛灉鍦ㄤ竴涓椂闂村悓鏃舵帴鏀朵簡N涓繛鎺?N>1),浣嗘槸鐩戝惉socket鍙猘ccept浜嗕竴涓繛鎺?閭d箞鍏跺畠鏈? accept鐨勮繛鎺ュ皢涓嶄細鍦‥T妯″紡涓嬬粰鐩戝惉socket鍙戝嚭閫氱煡,姝ゆ椂鐘舵佷笉鍙戠敓鍙樺寲;瀵逛簬涓鑸殑socket,灝卞渚嬪瓙涓岃█,濡傛灉瀵瑰簲鐨勭紦鍐插尯鏈韓 宸茬粡鏈変簡N瀛楄妭鐨勬暟鎹?鑰屽彧鍙栧嚭浜嗗皬浜嶯瀛楄妭鐨勬暟鎹?閭d箞孌嬪瓨鐨勬暟鎹笉浼氶犳垚鐘舵佸彂鐢熷彉鍖?

2)瀵逛簬鐩戝惉鍙啓浜嬩歡鏃?鍚岀悊鍙帹,涓嶅啀璇﹁堪.

鑰屼笉璁烘槸鐩戝惉鍙榪樻槸鍙啓,瀵規柟鍏抽棴socket榪炴帴閮藉皢閫犳垚鐘舵佸彂鐢熷彉鍖?姣斿鍦ㄤ緥瀛愪腑,濡傛灉寮鴻涓柇client鑴氭湰,涔熷氨鏄富鍔ㄤ腑鏂簡socket榪炴帴,閭d箞閮藉皢閫犳垚server绔彂鐢熺姸鎬佺殑鍙樺寲,浠庤宻erver寰楀埌閫氱煡,灝嗗凡緇忓湪鏈柟緙撳啿鍖轟腑鐨勬暟鎹鍑?

鎶婂墠闈㈢殑鎻忚堪鍙互鎬葷粨濡備笅:浠呭綋瀵規柟鐨勫姩浣?鍙戝嚭鏁版嵁,鍏抽棴榪炴帴絳?閫犳垚鐨勪簨浠舵墠鑳藉鑷寸姸鎬佸彂鐢熷彉鍖?鑰屾湰鏂瑰崗璁爤涓凡緇忓鐞嗙殑浜嬩歡(鍖呮嫭鎺ユ敹浜嗗鏂圭殑鏁? 鎹?鎺ユ敹浜嗗鏂圭殑涓誨姩榪炴帴璇鋒眰)騫朵笉鏄犳垚鐘舵佸彂鐢熷彉鍖栫殑蹇呰鏉′歡,鐘舵佸彉鍖栦竴瀹氭槸瀵規柟閫犳垚鐨?鎵浠ュ湪ET妯″紡涓嬬殑,蹇呴』涓鐩村鐞嗗埌鍑洪敊鎴栬呭畬鍏ㄥ鐞嗗畬 姣?鎵嶈兘榪涜涓嬩竴涓姩浣?鍚﹀垯鍙兘浼氬彂鐢熼敊璇?


鍙﹀,浠庤繖涓緥瀛愪腑,涔熷彲浠ラ槓榪頒竴浜涘熀鏈殑緗戠粶緙栫▼姒傚康.棣栧厛,榪炴帴鐨勪袱绔腑,涓绔彂閫佹垚鍔熷茍涓嶄唬琛ㄧ潃瀵規柟涓婂眰搴旂敤紼嬪簭鎺ユ敹鎴愬姛, 灝辨嬁涓婇潰鐨刢lient嫻嬭瘯紼嬪簭鏉ヨ,10瀛楄妭鐨勬暟鎹凡緇忓彂閫佹垚鍔?浣嗘槸涓婂眰鐨剆erver騫舵病鏈夎皟鐢╮ead璇誨彇鏁版嵁,鍥犳鍙戦佹垚鍔熶粎浠呰鏄庝簡鏁版嵁琚 鏂圭殑鍗忚鏍堟帴鏀跺瓨鏀懼湪浜嗙浉搴旂殑buffer涓?鑰屼笂灞傜殑搴旂敤紼嬪簭鏄惁鎺ユ敹浜嗚繖閮ㄥ垎鏁版嵁涓嶅緱鑰岀煡;鍚屾牱鐨?璇誨彇鏁版嵁鏃朵篃鍙唬琛ㄧ潃鏈柟鍗忚鏍堢殑瀵瑰簲 buffer涓湁鏁版嵁鍙,鑰屾鏃舵椂鍊欏湪瀵圭鏄惁鍦ㄥ彂閫佹暟鎹篃涓嶅緱鑰岀煡.



鍛ㄥ己 2011-03-02 12:22 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久一区| 欧美区二区三区| 亚洲激情成人在线| 欧美亚洲色图校园春色| 欧美三级乱码| 久久夜色精品国产亚洲aⅴ| 欧美亚洲一区二区三区| 欧美一区免费| 久久深夜福利免费观看| 久久精品亚洲精品| 久久精品亚洲一区二区| 99v久久综合狠狠综合久久| 亚洲人成毛片在线播放女女| 亚洲毛片一区| 午夜老司机精品| 久久高清福利视频| 欧美成人久久| 99视频在线精品国自产拍免费观看| 久久aⅴ国产紧身牛仔裤| 久久裸体艺术| 日韩视频在线一区二区| 欧美风情在线观看| 亚洲日韩中文字幕在线播放| 亚洲一区二区三区四区中文| 亚洲日韩第九十九页| 亚洲免费在线精品一区| 免费一区二区三区| 久久久久国产精品一区三寸| 久久亚洲精品中文字幕冲田杏梨| 在线中文字幕不卡| 亚洲国产中文字幕在线观看| 一本色道久久综合亚洲精品不| 国产综合色在线| 亚洲日本免费电影| 久久精品一区二区三区中文字幕| 亚洲午夜久久久久久久久电影网| 亚洲国产综合91精品麻豆| 在线亚洲欧美视频| 欧美成人免费观看| 欧美一区二区三区免费观看 | 久久精品国产成人| 午夜欧美大尺度福利影院在线看| 亚洲香蕉网站| 免费成人高清在线视频| 亚洲影视在线播放| 欧美午夜寂寞影院| 99国内精品| 亚洲国产成人久久综合一区| 久久国产天堂福利天堂| 久久在线免费观看| 鲁鲁狠狠狠7777一区二区| 国产精品二区二区三区| 国产精品久久久久av| 日韩视频一区二区三区| 免费观看亚洲视频大全| 欧美一级一区| 免费观看成人www动漫视频| 国产精品入口麻豆原神| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美视频导航| 亚洲精品在线免费| 亚洲高清自拍| 欧美寡妇偷汉性猛交| 亚洲高清中文字幕| 欧美国产精品va在线观看| 久久影院午夜片一区| 亚洲国产天堂网精品网站| 欧美成人精品影院| 欧美成人精品高清在线播放| 亚洲国产一区二区在线| 亚洲激情一区二区三区| 欧美日韩高清在线| 亚洲欧美精品在线| 美女在线一区二区| 久久久噜噜噜久噜久久 | 国产精品一区在线观看你懂的| 国产免费一区二区三区香蕉精| 国产女同一区二区| 久久aⅴ国产紧身牛仔裤| 欧美亚洲专区| 影音国产精品| 亚洲国产综合在线看不卡| 亚洲欧美日韩在线播放| 狼人天天伊人久久| 亚洲精品一区二区三区蜜桃久| 欧美在线观看一区二区| 嫩草伊人久久精品少妇av杨幂| 亚洲精品系列| 国产精品久久久久久久久久ktv| 亚洲第一网站| 午夜精品999| 欧美在线免费视频| 亚洲毛片播放| 亚洲欧美国产日韩天堂区| 伊人精品在线| 亚洲美女少妇无套啪啪呻吟| 国产精品国内视频| 久久亚裔精品欧美| 欧美日本国产视频| 久久gogo国模裸体人体| 欧美大片91| 午夜在线观看免费一区| 免费成人高清在线视频| 欧美一级精品大片| 欧美第一黄色网| 久久超碰97中文字幕| 欧美激情一区二区久久久| 亚洲第一在线综合网站| 久久国产婷婷国产香蕉| 一区二区毛片| 亚洲成色www久久网站| 日韩天天综合| 欧美日本一道本在线视频| 欧美一区二区三区免费视| 欧美电影在线免费观看网站| 久久久国产成人精品| 欧美日韩亚洲一区在线观看| 美日韩精品免费| 久久久噜噜噜久噜久久| 亚洲一区在线观看视频| 亚洲国产欧美不卡在线观看| 欧美国产视频在线| 国产精品综合视频| 日韩视频一区二区三区| 国产精品久久久久久久久动漫| 亚洲一区二区高清| 亚洲靠逼com| 在线观看中文字幕亚洲| 欧美在线一级va免费观看| 亚洲一区二区三区涩| 欧美高清在线观看| 欧美成熟视频| 在线观看视频一区二区欧美日韩| 欧美激情一区二区三区在线视频观看| 麻豆精品精华液| 久久国产66| 国产日韩在线视频| 亚洲欧美精品在线| 欧美一级片在线播放| 国产精品视频一区二区高潮| 亚洲精品美女久久7777777| 国产精品国产三级国产普通话蜜臀| 亚洲尤物在线视频观看| 欧美另类在线观看| 99在线精品观看| 国产亚洲视频在线观看| 亚洲宅男天堂在线观看无病毒| 国内揄拍国内精品少妇国语| 亚洲欧美怡红院| 久久久中精品2020中文| 欧美另类专区| 亚洲精品一二三| 亚洲欧美三级在线| 国产日韩视频| 久久野战av| 欧美成人午夜激情| 一区电影在线观看| 国产精品日韩欧美一区| 午夜在线播放视频欧美| 久久久综合免费视频| 亚洲精品乱码久久久久久久久| 亚洲一区二区在线视频| 欧美一区二区三区四区在线 | 99精品免费视频| 亚洲欧美电影院| 国内精品久久久久久久影视蜜臀 | 99在线精品视频在线观看| 亚洲永久网站| 一区二区三区在线视频播放 | 欧美中文在线字幕| 蜜臀久久99精品久久久久久9 | 亚洲高清av| 欧美日韩国产欧| 性做久久久久久久免费看| 国内成人自拍视频| 欧美理论电影网| 亚洲人成绝费网站色www| 亚洲手机在线| 一色屋精品视频在线观看网站| 午夜欧美视频| 欧美激情中文字幕一区二区| 亚洲一区二区三区四区五区黄| 欧美成人伊人久久综合网| 一区二区三区久久网| 欧美不卡视频一区发布| 一色屋精品视频在线观看网站| 亚洲欧美激情一区| 亚洲黄色av| 久久中文字幕导航| 翔田千里一区二区| 国产精品视频yy9099| 免费不卡在线观看| 亚洲三级国产| 久久精品成人| 亚洲综合色视频| 9色精品在线| 国产精品jizz在线观看美国| 一区二区三区波多野结衣在线观看| 99re6热只有精品免费观看 | 一本色道久久综合狠狠躁的推荐|