LinuxÒÁµéÔ°ÂÛ̳'s Archiver

zhoulifa ·¢±íÓÚ 2006-7-5 22:44

¡¾·ÖÏí¡¿Linuxϸ÷ÀàTCPÍøÂç·þÎñÆ÷µÄʵÏÖÔ´´úÂë

Linuxϸ÷ÀàTCPÍøÂç·þÎñÆ÷µÄʵÏÖÔ´´úÂë,F9LpR0t[(WY
#Ll-mN D7M
´ó¼Ò¶¼ÖªµÀ¸÷ÀàÍøÂç·þÎñÆ÷³ÌÐòµÄ±àд²½Ö裬²¢ÇÒ¶¼ÖªµÀÍøÂç·þÎñÆ÷¾ÍÁ½´óÀࣺѭ»··þÎñºÍ²¢·¢·þÎñ¡£ÕâÀ︽ÉÏÔ´´úÂëÀ´¸öС½á°É¡£ZMbw1HY `({9P

it5~*Ux^ Ê×ÏÈ£¬Ñ­»·ÍøÂç·þÎñÆ÷±à³ÌʵÏֵIJ½ÖèÊÇÕâÑùµÄ£º
1^DfS vR*iQ [url][IMG]http://zhoulifa.bokee.com/inc/directsocket.png[/IMG] [/url] zIFS.N@#T|:g#o
ÕâÖÖ·þÎñÆ÷Ä£ÐÍÊǵäÐÍÑ­»··þÎñ£¬Èç¹û²»¼ÓÉÏ¶à½ø³Ì/Ï̼߳¼Êõ£¬´ËÖÖ·þÎñÍÌÍÂÁ¿ÓÐÏÞ£¬´ó¼Ò¶¼¿ÉÒÔ¿´µ½£¬Èç¹ûǰһ¸öÁ¬½Ó·þÎñÊý¾ÝûÓÐÊÕ·¢Íê±ÏºóÃæµÄÁ¬½Óû°ì·¨´¦Àí¡£ËùÒÔÒ»°ãÓÐ¶à½ø³Ì¼¼Êõ£¬¶ÔÒ»¸öÐÂÁ¬½ÓÆôÓÃÒ»¸öнø³ÌÈ¥´¦Àí£¬¶ø¼àÌýsocket¼ÌÐø¼àÌý¡£
4?5w%J w"Z'n k4OeV+w$|W ]
/************¹ØÓÚ±¾Îĵµ********************************************
A(~WJm k\ *filename: Linuxϸ÷ÀàTCPÍøÂç·þÎñÆ÷µÄʵÏÖÔ´´úÂë*B$z(z[$Q'~1Y
*purpose: ¼Ç¼Linuxϸ÷Ààtcp·þÎñ³ÌÐòÔ´´úÂë
DzV{eHd *wrote by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢([url]http://zhoulifa.bokee.com[/url])6k)u5ZM#YQ3B!B
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ
5zXM4Q$`j *date time:2006-07-04 22:00:00q+AI,Ss2e!~r
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;irXJ7vpA7s0h
* µ«Çë×ñÑ­GPL
&u/Y/A'w9@q.c6s *Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦+@ n I;to4\.H+B
*********************************************************************/
$A}*`K| |
h&k*Ss x%q1KniW as Ò»¸öÑ­»·TCP·þÎñÔ´´úÂ루ÒòΪÓÃfork½øÐÐ¶à½ø³Ì·þÎñÁË£¬ËùÒÔÕâÖÖ·þÎñÏÖʵÖÐÒ²ÓÐÓã©ÈçÏ£ºdT$l+ea
[CODE] XHP(G&t3t&{:n
/*----------------------Ô´´úÂ뿪ʼ--------------------------------------------*/MQGu7n} @
#include <stdio.h> T N4?C(UE8V1NZ
#include <stdlib.h>*c`2o@7s9z
#include <errno.h>o;a$h$J} `8^!VT
#include <string.h>D,O @AD!n
#include <sys/types.h> \]hW:t i2}
#include <netinet/in.h>
L%k z4T#R"W _ #include <sys/socket.h>
6F#V7u Z'w #include <sys/wait.h>
9{7Xm!\I1\p /*********************************************************************u"x3g$O8N+f6{w:oA
*filename: cycletcpserver.c b:I1M@k-b'^c
*purpose: Ñ­»·tcp·þÎñ¶Ë³ÌÐò
4[)R:g{T *tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)fq4@_,Z6E
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ0\W&v6Rg2Dr7_yu
*date time:2006-07-04 22:00:00
lqi\U!Z#?(J *Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ; X o1cF]~%@
* µ«Çë×ñÑ­GPL
4}5RcR)Sw *Thanks to: Google.com
8?d,Eg!{ *********************************************************************/
-w y/bLg)y&t int main(int argc, char ** argv)'^B(YU] N2g
{6l{!^K1Fi`L:G
    int sockfd,new_fd; /* ¼àÌýsocket: sock_fd,Êý¾Ý´«Êäsocket: new_fd */i+u,_uE4eJ J(A}
    struct sockaddr_in my_addr; /* ±¾»úµØÖ·ÐÅÏ¢ */
fZrHUtc     struct sockaddr_in their_addr; /* ¿Í»§µØÖ·ÐÅÏ¢ */
"h1TCk2KmK,])o     unsigned int sin_size, myport, lisnum;
j4D-cR$p#VEPt
)IKw+Dq&Q;G     if(argv[1])  myport = atoi(argv[1]);
iE9NCx$X     else myport = 7838;
W!iAPs6V#z5tx
&Hjruyz3T!N-V     if(argv[2])  lisnum = atoi(argv[2]);
Da$?5S#j5tP\     else lisnum = 2;
A w U{pAD w\\ec!ZQ(]
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
n"n1}@yE!O         perror("socket");
|/\_3b0n w5gw3_)U         exit(1);$JPp T"s-A
    }(h$])`E&D C"x#` i%n
    my_addr.sin_family=PF_INET;KiK'b d,[b"^:?
    my_addr.sin_port=htons(myport);
+k2GS%b+b,i vYq     my_addr.sin_addr.s_addr = INADDR_ANY;,M8e0R6Hm!w G
    bzero(&(my_addr.sin_zero), 0);
6}^ vQ:O/edfj     if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
&X4?%t~1Cxh         perror("bind");
7~L6Fdp7Z9p         exit(1);
)iy O4z fe"pU?     }1S @I er/WP

d,t-J\1Jq#u     if (listen(sockfd, lisnum) == -1) {
u?XE)D#{         perror("listen");
|8FZ[ j0bNZ{         exit(1);.aIg/T*Nu}@
    }5t+SO,BM [M g/y#v
    while(1) {
Dg[5\xn         sin_size = sizeof(struct sockaddr_in);J{ wo"Q5K$F9TA1p-\a
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {8[7p$~8l5`0SM
            perror("accept");3|L*k~f4@P
            continue;q F1puW)s
        }
&r%w'HOBf         printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
6lKtS'j4m9z3W         if (!fork()) { /* ×Ó½ø³Ì´úÂë¶Î */i W&p8DS ^YT;J3H
            if (send(new_fd, "Hello, world!\n", 14, 0) == -1) {
#W!PZ]z2O.xpv:L                 perror("send");~r5||?q+[~
                close(new_fd); a(ay/{v
                exit(0);
RH_ wU1d nN%F"k G             }0pI4} |c t'i'q G#N
        }
cp(`y&_8QC_         close(new_fd); /*¸¸½ø³Ì²»ÔÙÐèÒª¸Ãsocket*/
i1?0p.tG%n         waitpid(-1,NULL,WNOHANG);/*µÈ´ý×Ó½ø³Ì½áÊø£¬Çå³ý×Ó½ø³ÌËùÕ¼ÓÃ×ÊÔ´*/3J,A K+[W,P6]p(G
    }V4Sq#xi'K
}
5t C4P&F-G!| /*----------------------Ô´´úÂë½áÊø--------------------------------------------*/
V#n@ A,L\n2i [/CODE]
i3p3{c7kL(yp Ò»¸ö²âÊÔ¿Í»§¶Ë´úÂëÈçÏ£ºlh3U&o3{g
[CODE]
-]6g-XZ'X(qNZ"q4I D /*----------------------Ô´´úÂ뿪ʼ--------------------------------------------*/o*p Cze U
#include <stdio.h>
:h%wi;?*Y"R.~_ #include <stdlib.h>
-sZ)y4c%v} #include <errno.h>
k5}Q Q@S #include <string.h>7Z5zbh x*i/^
#include <netdb.h>$R E*E8_'Ev
#include <sys/types.h>
!~Y\ JZ~(Jw #include <netinet/in.h>
v-A&_!J5cLEe_/`H #include <sys/socket.h>
K4zy3j:Ny!? #define MAXDATASIZE 100 /*ÿ´Î×î´óÊý¾Ý´«ÊäÁ¿ */.o9aFU-|J-Xp`
/*********************************************************************
2?+AH4xYq vvsHj *filename: cycletcpclient.c7bq^2q ~/{ }
*purpose: Ñ­»·tcp¿Í»§¶Ë³ÌÐò SDwG*U PF
*tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)Iu RE _5r8VI
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ
a!oZB*Y|"[,a6s5~;W\ *date time:2006-07-04 22:20:008ojo%t.?o
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;Z:~R1S D6x
* µ«Çë×ñÑ­GPL
}f H%FNN'g7i(gg *Thanks to: Google.com'Q F?2Lem:g
*Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦'XN |vF
*********************************************************************/
}@M%J og4xaj[
kO(T sv3eE:p9C int main(int argc, char *argv[])
y"I!j-S&t {.Pk"} f bT#v8^ H,M
    int sockfd, numbytes;
]yzI9MJlv$[t     char buf[MAXDATASIZE];
H_ K@5b2X     struct hostent *he;s M,_2k][Q
    struct sockaddr_in their_addr;
3P VC4T8p#wM     unsigned int myport;
3cd@*NU)f$K g7x"CXJ&BD,rF NP
    if(argv[2]) myport = atoi(argv[2]);!nL2{E2aO0P6w
    else myport = 7838;9jqvstVfM

a*MpRZ     if (argc != 3) {
g nA4g0R.I5U         fprintf(stderr,"usage: %s hostname port\n", argv[0]);
vt p5G(l O#J         exit(1);8Cr~6x/U%nS
    }4Pb!IG {
    if((he=gethostbyname(argv[1]))==NULL) {#D!S1I.N}uS@F1M
        herror("gethostbyname");"FIh*eN
        exit(1);
Mp |PBb?c5_9\     }$u6thH Y3bt
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
|!v2D&DY.E4G8v         perror("socket");
A3qms U^~b7C'L ^         exit(1);Bu'KO._+S"h,o{VE]
    }!N2PESul a
    their_addr.sin_family=PF_INET;jB!K9`!l&r
    their_addr.sin_port=htons(myport);3nH2_1Y8w
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
2aVdP x?M P     bzero(&(their_addr.sin_zero),0);}fy5C'Y"REf
    if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
)_r4Z6A2XEOgr         perror("connect");
G)fU;XDt ?7b g'h6F         exit(1);XJw9I7]Y#\+H
    } GsK"@3p x!Lh5rc
    if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
#}*gPT&Y&y y         perror("recv");9h/g%j;XqB
        exit(1); `${7}W#Jyo p_z
    }t}f7S%j _*f [
    buf[numbytes] = 0;
^&e*p"t,D W TP     printf("Received: %s\n",buf);Z @:_3v:S8F;e1U0kS
    close(sockfd);
`F R+`` q     return 0;
@:[Jg!MN.Y }
M\T#M_6^p2p%@ /*----------------------Ô´´úÂë½áÊø--------------------------------------------*/!u/g~x,P7oT+DJ
[/CODE]
4k:G+xw!N)]r i ÓÃgcc cycletcpserver.c -o tcpserverºÍgcc cycletcpclient.c -o tcpclient·Ö±ð±àÒëÉÏÊö´úÂëºóÔËÐÐÇé¿öÈçÏ£º
wI*suu.O.x:g([W;D ·þÎñ¶ËÔËÐÐÏÔʾ£º
Av!NU-r2Y%I!w1P7T [QUOTE]
dXV[3Zy&M administrator@ubuzlf:/data/example/c$ ./tcpserver(Z*B.r*eR Ca(j
server: got connection from 127.0.0.1
:va6Lq,j.Uy server: got connection from 127.0.0.1 Q2u[$v4D6Z)oK[
server: got connection from 127.0.0.1k$fMnm$H's*}
[/QUOTE]k#a C9h5N
¿Í»§¶ËÔËÐÐÏÔʾ£º
(X9~1u%S%~(f [QUOTE]
_ejF.NXK7h%d administrator@ubuzlf:/data/example/c$ ./tcpclient 127.0.0.1 7838
\:B#gx1aS5^KSH!Rqx Received: Hello, world!
oSpH!\6S
8_ uEV:{&xW administrator@ubuzlf:/data/example/c$ ./tcpclient 127.0.0.1 7838
C \:A.j^!o Received: Hello, world!/PU+?+j~!P"_+T l

"X Ny`\7u*r administrator@ubuzlf:/data/example/c$ ./tcpclient 127.0.0.1 7838
7n8Cr1f8p/] q Received: Hello, world!!jj/q)n{{e |^` Nn

3U O"\ k oi] [/QUOTE](m.i3\#Op p
²»µÃ²»ËµµÄÒ»¸ö¸ÅÄîÐÔÎÊÌ⣺×èÈûÓë·Ç×èÈûo4c&Tr y(j6b
ÔÚ×èÈû·þÎñÖУ¬µ±·þÎñÆ÷ÔËÐе½acceptÓï¾ä¶øÃ»Óпͻ§Á¬½Ó·þÎñÇëÇóµ½À´£¬ÄÇô»á·¢ÉúʲôÇé¿ö? Õâʱ·þÎñÆ÷¾Í»áÍ£Ö¹ÔÚacceptÓï¾äÉϵȴýÁ¬½Ó·þÎñÇëÇóµÄµ½À´£»Í¬Ñù£¬µ±³ÌÐòÔËÐе½½ÓÊÕÊý¾ÝÓï¾ärecvʱ£¬Èç¹ûûÓÐÊý¾Ý¿ÉÒÔ¶ÁÈ¡£¬Ôò³ÌÐòͬÑù»áÍ£Ö¹ÔÚ½ÓÊÕÓï¾äÉÏ¡£ÕâÖÖÇé¿ö³ÆÎª×èÈû(blocking)¡£
V9q n*zw µ«Èç¹ûÄãÏ£Íû·þÎñÆ÷½ö½ö×¢Òâ¼ì²éÊÇ·ñÓпͻ§ÔڵȴýÁ¬½Ó£¬ÓоͽÓÊÜÁ¬½Ó;·ñÔò¾Í¼ÌÐø×öÆäËûÊÂÇ飬Ôò¿ÉÒÔͨ¹ý½« socketÉèÖÃΪ·Ç×èÈû·½Ê½À´ÊµÏÖ:·Ç×èÈûsocketÔÚûÓпͻ§Ôڵȴýʱ¾Íʹacceptµ÷ÓÃÁ¢¼´·µ»Ø ¡£
b~} CA)_;@q ͨ¹ýÉèÖÃsocketΪ·Ç×èÈû·½Ê½£¬¿ÉÒÔʵÏÖ¡°ÂÖѯ¡±Èô¸Ésocket¡£µ±Æóͼ´ÓÒ»¸öûÓÐÊý¾ÝµÈ´ý´¦ÀíµÄ·Ç×èÈûsocket¶ÁÈëÊý¾Ýʱ£¬º¯Êý½«Á¢¼´·µ»Ø£¬²¢ÇÒ·µ»ØÖµÖÃΪ-1£¬²¢ÇÒerrnoÖÃΪEWOULDBLOCK¡£µ«ÊÇÕâÖÖ¡°ÂÖѯ¡±»áʹCPU´¦ÓÚæµÈ´ý·½Ê½£¬´Ó¶ø½µµÍÐÔÄÜ¡£¿¼Âǵ½ÕâÖÖÇé¿ö£¬¼ÙÉèÄãÏ£Íû·þÎñÆ÷¼àÌýÁ¬½Ó·þÎñÇëÇóµÄͬʱ´ÓÒѾ­½¨Á¢µÄÁ¬½Ó¶ÁÈ¡Êý¾Ý£¬ÄãÒ²Ðí»áÏëµ½ÓÃÒ»¸öacceptÓï¾äºÍ¶à¸örecv()Óï¾ä£¬µ«ÊÇÓÉÓÚaccept¼°recv¶¼ÊÇ»á×èÈûµÄ£¬ËùÒÔÕâ¸öÏë·¨ÏÔÈ»²»»á³É¹¦¡£ tP;}"z a\8z
µ÷Ó÷Ç×èÈûµÄsocket»á´ó´óµØÀË·Ñϵͳ×ÊÔ´¡£¶øµ÷ÓÃselect()»áÓÐЧµØ½â¾öÕâ¸öÎÊÌ⣬ËüÔÊÐíÄã°Ñ½ø³Ì±¾Éí¹ÒÆðÀ´£¬¶øÍ¬Ê±Ê¹ÏµÍ³Äں˼àÌýËùÒªÇóµÄÒ»×éÎļþÃèÊö·ûµÄÈκλ£¬Ö»ÒªÈ·ÈÏÔÚÈκα»¼à¿ØµÄÎļþÃèÊö·ûÉϳöÏֻ£¬select()µ÷Óý«·µ»ØÖ¸Ê¾¸ÃÎļþÃèÊö·ûÒÑ×¼±¸ºÃµÄÐÅÏ¢£¬´Ó¶øÊµÏÖÁËΪ½ø³ÌÑ¡³öËæ»úµÄ±ä»¯£¬¶ø²»±ØÓɽø³Ì±¾Éí¶ÔÊäÈë½øÐвâÊÔ¶øÀË·ÑCPU¿ªÏú¡£
:C2d| ^/n L e`'JFkSL
Æä´Î£¬²¢·¢·þÎñÆ÷£¬ÔÚÉÏÊöcycletcpserver.cÖУ¬ÓÉÓÚʹÓÃÁËfork¼¼ÊõÒ²¿ÉÒÔ³ÆÖ®Îª²¢·¢·þÎñÆ÷£¬µ«ÕâÖÖ·þÎñÆ÷²¢²»ÊÇÕæÕýÒâÒåÉϵÄIO¶à·¸´ÓõIJ¢·¢·þÎñÆ÷£¬²¢ÇÒÓÉÓÚûÓд¦Àí×èÈûÎÊÌ⣬ʵ¼ÊÓ¦ÓÃÓи÷ÖÖ¸÷ÑùµÄÎÊÌâ¡£ S*YaX1{&OW
7mj?O!} } z!M2a$~j
Ò»¸öµäÐÍIO¶à·¸´Óõĵ¥½ø³Ì²¢·¢·þÎñÆ÷Á÷³ÌÈçÏ£ºcH!Caqmbo8g
/*IO¶à·¸´Óò¢·¢·þÎñÁ÷³Ìͼ*/j5]K(VK
[url][IMG]http://zhoulifa.bokee.com/inc/simpleselect.png[/IMG][/url]~2T uZ"y
ÏÂÃæÊÇÒ»¸öÑÝʾIO¶à·¸´ÓõÄÔ´³ÌÐò£¬ÊÇÒ»¸ö¶Ë¿Úת·¢³ÌÐò£¬µ«ËüµÄÓô¦Ï൱´ó£¬Êµ¼ÊÓ¦ÓÃÖеĸ÷Àà´úÀíÈí¼þ»ò¶Ë¿ÚÓ³ÉäÈí¼þ¶¼ÊÇ»ùÓÚÕâÑùµÄ´úÂëµÄ£¬±ÈÈçWindowsϵÄWinGate¡¢WinProxyµÈ¶¼ÊÇÔÚ´Ë»ù´¡ÉÏʵÏֵġ£Ô´´úÂëÈçÏ£º
6M4q7At&N$l,s1@BCl [CODE]1t2q3Ve9I"Fl
/*----------------------Ô´´úÂ뿪ʼ--------------------------------------------*/
2P9q1K"e0n7d}6u#x.b #include <stdlib.h>T uy3Sv,V
#include <stdio.h>
5{\4DJ+^l oj #include <unistd.h>+y3w&BC]#O)e$x
#include <sys/time.h>#N {X8cj3n;i
#include <sys/types.h>hsSO IG
#include <string.h>jOzt;F u4ZT j
#include <signal.h>%h)Xj do
#include <sys/socket.h>JBvR$Q
#include <netinet/in.h>
bP$f|'}b #include <arpa/inet.h> L v-X9S"C'jS
#include <errno.h>
dXN;tt\,]"z
U2C df*F?4y static int forward_port;
}"j4['letS (yG6hD8S8r3S
#undef max
#S x"X8^0c u QF u #define max(x,y) ((x) > (y) ? (x) : (y)) Qn F7K1i?*y+d3mO1W
&k!zw1B)u kX4[
/*************************¹ØÓÚ±¾Îĵµ************************************7\zJK"M'E0T&S6@okO
*filename: tcpforwardport.c
rAs7SK *purpose: ÑÝʾÁËselectµÄÓ÷¨£¬ÕâÊÇÒ»¸ö¼«ºÃµÄ´úÀíÈí¼þºËÐÄ£¬×¨ÃÅ×÷¶Ë¿ÚÓ³ÉäÓÃL+Q*V`XMm#je
*tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)
#pM#\1n%F Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ{'aH&|k$K:E&C ?
*date time:2006-07-05 19:00:00
Sj.q3O1rX i4w *Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;:v\:[YVu4r
* µ«Çë×ñÑ­GPL
F/fn!\2[(lnxo *Thanks to: Paul Sheer ¸ÐлPaul SheerÔÚselect_tutµÄmanÊÖ²áÀïÌṩÁËÕâ·ÝÔ´´úÂë
2`|:zo%H$P *Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦
#RO l"l4D4^ *********************************************************************/
O?"F4[/q6y7OH Db1Jh.?
static int listen_socket (int listen_port) {
@)Im3eSCn G3W(i]     struct sockaddr_in a;
`b;u[Yc2AG!FV{     int s;
&h0n |piR5bV     int yes;:xZ uc!n&B;z,~TV
    if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
X,P"cY5_ eo)[%n/g         perror ("socket");
JS/U'OC-\5{9g         return -1;
:F-o;B3f;a9Pb h     }{8E B$]@_ J+h
    yes = 1;7}+EQP ay
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof (yes)) <:Biv'v;g%v n6L:I
0) {X"v_r a O+@D
        perror ("setsockopt");
{5O j6qKjQ         close (s); xbA\0B]?9Ax
        return -1;
~ CQ_.C \x     } Qb`!z[6nB
    memset (&a, 0, sizeof (a));3S zC].xw T"v v
    a.sin_port = htons (listen_port);
Y$wmR1]3uEu$b     a.sin_family = AF_INET;Rs7T6]V6X\(i
    if (bind(s, (struct sockaddr *) &a, sizeof (a)) < 0) {4o2w)?3y/m2y PY
        perror ("bind");;bN{\*D8dF[.D
        close (s);N'yF el8~pCG9kC
        return -1;4VN0Vx2F"Q6G6C Z
    }C @FH W
    printf ("accepting connections on port %d\n", (int) listen_port); V:xmb;rX(yH
    listen (s, 10);
SKeD,QJ     return s;
'tA.I3G7{,avS9_W+i0fB }
/M;F(a*u i ?7I@jK/L LY
static int connect_socket (int connect_port, char *address) {+N3O gN8F
    struct sockaddr_in a;
hp_!uy H;f,dC KA     int s;
|xIZ-{ b     if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
Sx:b6YM         perror ("socket");w*QZL Ex3m \
        close (s);4C3z Hka.w3R:`F
        return -1;
2k)tE)ZP"p_7O     }
&b7z3U4x1XU5x.?n
/`b&S J${^     memset (&a, 0, sizeof (a));
;M(x6j1e{ ]     a.sin_port = htons (connect_port);
D1T)pHA5NNs#?k     a.sin_family = AF_INET;e6Wy/M9tQ

$nC.W/CYp*\     if (!inet_aton(address, (struct in_addr *) &a.sin_addr.s_addr)) {
8VN%L:Su         perror ("bad IP address format");X)RN+V r@}
        close (s);0|tk4l }shd9F(A
        return -1;
M"j)CC WJ     }/Sc:U*eG-q8c%r h

;Bl1GK-o"S-V(i-eM     if (connect(s, (struct sockaddr *) &a, sizeof (a)) < 0) { WS'w0x.|&N]i
        perror ("connect()");mYP)v/^'U)\wXh2M
        shutdown (s, SHUT_RDWR);X'^ ~s+_
        close (s);
+C4u(cK+@GK TR0B         return -1;*K_3W0`B`O
    }
?l.|H+F3?{     return s;$q#^7fl VI!r
}
;FP6}k)K;^A:}
wYj@L VZ+Af #define SHUT_FD1 { \{;g"l8k&e
    if (fd1 >= 0) {   \P x$mU$?(t,S
        shutdown (fd1, SHUT_RDWR);  \
o Gt,JA*zp_         close (fd1);  \
h6`X:k3H^         fd1 = -1;     \
}U'`4je?     }   \u6?!OnFv8q
}
XFGuf'j _ ,fifmZz3d
#define SHUT_FD2 { \$Wv z4KDj;|A;VN
    if (fd2 >= 0) {   \
3kt-s KfZs7h         shutdown (fd2, SHUT_RDWR);  \
m HY?"f9uS         close (fd2);  \
i]0O:SUv2f#_%W         fd2 = -1;     \X4C"g|U,e,qw@.W6J
    }   \
(| K!xjP }
4L-@7vh^/DC#D Xq1D#@Y4l
#define BUF_SIZE 1024vXv5@L7P
:RI$A7beF*B(p
int main (int argc, char **argv) {
;}9@ z8fE7zK     int h; _0Ye{[,R"O+i
    int fd1 = -1, fd2 = -1;#{ X"Vj8w"c
    char buf1[BUF_SIZE], buf2[BUF_SIZE];j? f,R&B0I7Q/c8MM
    int buf1_avail, buf1_written;+Se[4L5g7t|
    int buf2_avail, buf2_written;
BR([r WNV{Ny3v r4X(@7D$g'bX4b
    if (argc != 4) {
\1j @aU}'x#r         fprintf (stderr, "Usage\n\tfwd   \n");?;L(\)Z/H J f
        exit (1);
2N)}-gey/Cb     }.?:gWx WV!Q
B-SRt;P h_ e(H
    signal (SIGPIPE, SIG_IGN);
6u6S9\ ^ [0on+MC 8~}7@ b;T}
    forward_port = atoi (argv[2]);
N1K%hM {0RA
}~,X@`HBZ     /*½¨Á¢¼àÌýsocket*/
(F&vOJMpd7L[     h = listen_socket (atoi (argv[1]));xJ+~5SzT3l3|L
    if (h < 0) exit (1);Otsui m
.TRC$zW r\?
    for (;;) {
r+~z5FP         int r, nfds = 0;jPgk [Y,J Ui
        fd_set rd, wr, er;
mm,H'H)_6H:r         FD_ZERO (&rd);+i!R"^-E#O5y.OX
        FD_ZERO (&wr);
Fs Az+o6`!O S         FD_ZERO (&er);
yJBy0G`         FD_SET (h, &rd);
(Vi!K"o8At
0u9d*m'U-Qe         /*°Ñ¼àÌýsocketºÍ¿É¶ÁsocketÈý¸öÒ»Æð·ÅÈëselectµÄ¿É¶Á¾ä±úÁбíÀï*/ MP,V)\U"a3T:T
        nfds = max (nfds, h);@G#|F(z:|*w
        if (fd1 > 0 && buf1_avail < BUF_SIZE) {!]9T:u9pE1{
            FD_SET (fd1, &rd);'X s"A'~$c'H!C
            nfds = max (nfds, fd1);L-f#U)E ~
        }aOz#{8l2?x-S
        if (fd2 > 0 && buf2_avail < BUF_SIZE) {o9b1ctO+B)K*|j0d+A.B(e
            FD_SET (fd2, &rd);
O5Z'Z1U3]2YE._e7R C             nfds = max (nfds, fd2);0t/n0P]Eg,J
        }
!mk.d#L] F-B
:Ay2ydZ2b\         /*°Ñ¿ÉдsocketÁ½¸öÒ»Æð·ÅÈëselectµÄ¿Éд¾ä±úÁбíÀï*/
'y#M6g8i$B\.k         if (fd1 > 0 && buf2_avail - buf2_written > 0) {0Er$Q%J,d6Jm0`,y
            FD_SET (fd1, &wr);
.x R#^lL-^             nfds = max (nfds, fd1);
Ua;q0h"z-pj$H         }
Td/?^/g         if (fd2 > 0 && buf1_avail - buf1_written > 0) { HY'w"~+y V(Fr
            FD_SET (fd2, &wr);
:\*t0mt0l:a             nfds = max (nfds, fd2);
%Y)s.] J D6ne         }1[I0J1k r6q'Q
7q;|6M&_c
        /*°ÑÓÐÒì³£Êý¾ÝµÄsocketÁ½¸öÒ»Æð·ÅÈëselectµÄÒì³£¾ä±úÁбíÀï*/
+uQv4r],q T/{pRw         if (fd1 > 0) {n#K ~X.}6W^:cw
            FD_SET (fd1, &er);&[$X1bt] T4]
            nfds = max (nfds, fd1);
5Je} s7Fy:axXM         } [G$T g~b
        if (fd2 > 0) {?`/W"LL/C%Wi
            FD_SET (fd2, &er);
)c8z-NQ)p$g             nfds = max (nfds, fd2);$Y(k6u2s5Sv
        }
WyQ#u C Oen
-o,S3?1krTbN G         /*¿ªÊ¼select*/3l-Edz]x)g9d5hR
        r = select (nfds + 1, &rd, &wr, &er, NULL);
9I)Qw3`hY5OeJ
F\#^R'aD9Nl(C"h         if (r == -1 && errno == EINTR) continue;P"V3~,T|6l0G1|r
        if (r < 0) {D F{:^[5Aj%t K
            perror ("select()");
%o4Lg1F%N@             exit (1);
)a,I2T9V.Av uY         } A!b)]Q$Sj

:rJ(R)h4\'L:eKbj         /*´¦ÀíÐÂÁ¬½Ó*/
:A{"JsU4k bzH         if (FD_ISSET (h, &rd)) {
U?5t&f:~3m(u             unsigned int l;
X6gl`&F ek3^2v             struct sockaddr_in client_address; BRo#R]
            memset (&client_address, 0, l = sizeof (client_address));
"A tFi@1Ge3u vt             r = accept (h, (struct sockaddr *)&client_address, &l);*EJ)Li?#Ke
            if (r < 0) {0f+Tg4T!S"h4~6G+_ ^
                perror ("accept()");
/k(O(K,n^.W4Y.c*Y \             } else {WV_b_AH
                /*¹Ø±ÕÔ­ÓÐÁ¬½Ó£¬°ÑÐÂÁ¬½Ó×÷Ϊfd1£¬Í¬Ê±Á¬½ÓеÄÄ¿±êfd2*/
N MPGDFr.Q                 SHUT_FD1;
Q-y;wwB;DCe[                 SHUT_FD2;'t5G5^Xn!A
                buf1_avail = buf1_written = 0;PW0_7k`?I)m2BP
                buf2_avail = buf2_written = 0;
gi x+R$G                 fd1 = r;;Ip+b lf ?*SC0t
                fd2 = connect_socket (forward_port, argv[3]);-Gq)BYtm;m]
                if (fd2 < 0) {D7b-hu]jw
                    SHUT_FD1;Rv5}i)X:G~+sC[
                } else TNR7w2Y
                    printf ("connect from %s\n", inet_ntoa(client_address.sin_addr));
(I*RS DI5`pg             }"[rs}_|;D \
        }{7U/e3s!K/]t
!o{!g| PZ
        /* NB: read oob data before normal reads */yjo e:ucK nl
        if (fd1 > 0)5O$EkGa'^c
        if (FD_ISSET (fd1, &er)) {?!O5cQ'\2?%T
            char c;
yo| D r"cv"S             errno = 0;_.} v4p?)_7I%j@.i
            r = recv (fd1, &c, 1, MSG_OOB);8^` ^;X.f$G*v:l
            if (r < 1) {
*NzXQy:i                 SHUT_FD1;
:fP&n}r4y             } else
/b%n8x0S5NAab                 send (fd2, &c, 1, MSG_OOB);
odk}wS9_         }
3ut7GnBVL0e 7{2WU B u9d B
        if (fd2 > 0)
lt0d$\$g@{#u Z         if (FD_ISSET (fd2, &er)) {N*Q+AKv6z
            char c; s;A?2l-U l;u\
            errno = 0;
]n4ScF.saq             r = recv (fd2, &c, 1, MSG_OOB);Y_)bW OHrd9J
            if (r < 1) {
!@"m%If_8UL{6V-J                 SHUT_FD1;!W C3J2xN@h1D
            } else;I-`4hK9{!?
                send (fd1, &c, 1, MSG_OOB);
kT]!q6v]E         }b O:?{8Eo
D~X(T"h ]!ep?w
        /* NB: read data from fd1 */
n0n q~.g?,|b9jq         if (fd1 > 0)
*X#Y"OP'jc         if (FD_ISSET (fd1, &rd)) {
x'Y,R?)zY             r = read (fd1, buf1 + buf1_avail, BUF_SIZE - buf1_avail);
)ohgfdj(X             if (r < 1) {
1M\h;mq {                 SHUT_FD1;!pRD!q6H$T
            } else
]cMH(f]w                 buf1_avail += r;"p9IzwBR)H-k
        }
1I i5@bu0Ke]L!RWR
kK#zj+Z"H         /* NB: read data from fd2 */ b?;{]\7G
        if (fd2 > 0)
~(z9w.v-bL0YA         if (FD_ISSET (fd2, &rd)) {
nWb4m9U$W^X#]F             r = read (fd2, buf2 + buf2_avail, BUF_SIZE - buf2_avail);
N j+[{'i)\%B             if (r < 1) {!F.SN{.Vk
                SHUT_FD2;`UL2|/D&d _"y
            } else
)f h`n5D/}.c                 buf2_avail += r;
X W:E7qq.GM[         }%^bA5no h_

V:DP!k0G\I*U         /* NB: write data to fd1 *//uA#H7@9tR6V
        if (fd1 > 0)
2Q Wv$S3uZ         if (FD_ISSET (fd1, &wr)) {gohq i,H
            r = write (fd1, buf2 + buf2_written, buf2_avail - buf2_written);
{,W6k3`Wv8fR8SB?             if (r < 1) {
nH&mezY$v%JQ+?9f                 SHUT_FD1;"r(Lg5Ny2q+v o~
            } else$f[M2]n[k,p(x
                buf2_written += r;7S9M4i~ByJIi
        }(Y+u0b uR

5Y]RC![6j1Av         /* NB: write data to fd1 */}*rz/w-Da3P
        if (fd2 > 0)
Z%}4H@Ge;g         if (FD_ISSET (fd2, &wr)) {Sp!}*IpW
            r = write (fd2, buf1 + buf1_written, buf1_avail - buf1_written);
[waZ6U.UL             if (r < 1) {{p6?"j-r
                SHUT_FD2;
;OK [&\c \0C             } else6t Thh4Mg ?6v`
                buf1_written += r; ^9h"gqQ%p2Vz{
        }
oR/T#G(@ !K't O[ nj
        /* check if write data has caught read data */s+AZ#Pb%t*Sv
        if (buf1_written == buf1_avail) buf1_written = buf1_avail = 0;m@ Sj]"NTt
        if (buf2_written == buf2_avail) buf2_written = buf2_avail = 0;
MZ~(J YWe
7i:h qCB}^h         /* one side has closed the connection, keep writing to the other side until empty */
;k Y#o#XB#X'^         if (fd1 < 0 && buf1_avail - buf1_written == 0) {|BV'vL/@o
            SHUT_FD2; I%W L @"A9Yy~2b6[&W
        }
:G&Q5E#h!SQ:L2B         if (fd2 < 0 && buf2_avail - buf2_written == 0) {
R,K9sK._ B3u             SHUT_FD1;st*V0b;n/Y
        }
w1I7T&V\$q&H^f     }
}4t3at5M ID+W;E/O"gM     return 0;
F eGfZ@e*^,v0r }q e5S?](PH'Ip
/*----------------------Ô´´úÂë½áÊø--------------------------------------------*/
y L9M+c J0f$c [/CODE]

zhoulifa ·¢±íÓÚ 2006-7-5 23:02

ÓÃgcc tcpforwardport.c -o MyProxy±àÒë´Ë³ÌÐòºóÔËÐÐЧ¹ûÈçÏ£º
dfI&z hJZ [QUOTE]
LQa g[-\ ./MyProxy 8000 80 172.16.100.2186q0_vz|,e#iSw
accepting connections on port 8000\t F syZ0[Z
connect from 127.0.0.1
9L*R$S W_0XJ [/QUOTE]z geo s Y Cs
µ±ÓÐÓû§·ÃÎʱ¾»úµÄ8000¶Ë¿Úʱ£¬MyProxy³ÌÐò½«°Ñ´ËÇëÇóת·¢µ½172.16.100.218Ö÷»úµÄ80¶Ë¿Ú£¬¼´ÊµÏÖÁËÒ»¸öhttp´úÀí¡£
*@r;^$LZK;~6[
B5X xoX"j ¹ØÓÚselectº¯Êý£º J7D$bN5t+h
Æäº¯ÊýÔ­ÐÍΪ£º
*|*e?{ b#f9^ int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
/f;U$_4k R Q$s ´Ëº¯ÊýµÄ¹¦ÄÜÊÇÓÉÄں˼ì²âÔÚtimeoutʱ¼äÄÚ£¬ÊÇ·ñÓÐreadfds£¬writefds£¬exceptfdsÈý¸ö¾ä±ú¼¯(file descriptors)ÀïµÄij¸ö¾ä±ú£¨file descriptor)µÄ״̬·ûºÏѰÇ󣬼´readfds¾ä±ú¼¯ÀïÓоä±ú¿É¶Á»òwritefds¾ä±ú¼¯ÀïÓпÉд»òexceptfds¾ä±ú¼¯ÀïÓÐÀýÍâ·¢Éú£¬ÈκÎÒ»¸öÓб仯º¯Êý¾ÍÁ¢¼´·µ»Ø£¬·µ»ØÖµÎªtimeout·¢Éú״̬±ä»¯µÄ¾ä±ú¸öÊý¡£
z,H3dd3T"n nÊÇËùÓÐreadfds£¬writefds£¬exceptfdsÈý¸ö¾ä±ú¼¯(file descriptors)Àï±àºÅ×î´óÖµ¼Ó1¡£±ÈÈ磺Ҫ¼ì²âÁ½¸ösocket¾ä±úfd1ºÍfd2ÔÚtimeoutʱ¼äÄÚÊÇ·ñ·Ö±ð¿É¶ÁºÍ¿Éд¾Í¿ÉÒÔÕâÑù£º
.z9K:U.^-h;a%U2f ÏȰÑÁ½¸ö¾ä±ú¼¯(file descriptors)ÇåÁ㣺
eSI6].|;T0`6LW         FD_ZERO (&readfds);
"PDKL9f0['V         FD_ZERO (&writefds);
e!]X%A GD'n&iE È»ºó°Ñfd1¼ÓÈë¶Á¼ì²â¼¯£º
S0KU5E.C-[F         FD_SET (fd1, &readfds);
L,~;b1w:d È»ºó°Ñfd2¼ÓÈëд¼ì²â¼¯£º
^#u,UtM gm\Q@         FD_SET (fd2, &writefds);
|oi"R1RX?#Gb C { ÔÙ¸øtimeoutÉèÖÃÖµ£¬timeoutÊÇÕâÑùµÄÒ»¸ö½á¹¹£º
-b+x'{:B7u l uP               struct timeval {
s _$Xr9A8j)x2g m                   long    tv_sec;         /* seconds */
/b4h ~qX#rO                   long    tv_usec;        /* microseconds */
Q? M J&m:Rq               };PJbG6AIG1C:E6@
Äã¿ÉÒÔÕâÑù¸³Öµ£º
@L/Op/U%L QQ"?         timeout.tv_sec=1;fJ,b4B7Z
        timeout.tv_uec=0;
)U.}^@K9T ±íʾ¼ì²âÔÚ1ÃëÖÓÄÚÊÇ·ñÓоä±ú״̬·¢Éú±ä»¯¡£
ccnuoZ9X4B Èç¹ûÓоä±ú·¢Éú±ä»¯£¬¾Í¿ÉÒÔÓÃFD_ISSET¼ì²â¸÷¸ö¾ä±ú£¬±ÈÈ磺*yL`-f1x5z
                FD_ISSET (fd1, &readfds);//¼ì²âÊÇ·ñfd1±ä³É¿É¶ÁµÄÁË
4C+A@wL;sU                 FD_ISSET (fd2, &writefds);//¼ì²âÊÇ·ñfd2±ä³É¿ÉдµÄÁË
qjz&K_U ʾÒâ³ÌÐò´úÂëÈçÏ£º
k#D Rq)l H Q3fpA3Y [CODE]
(a6?8X uNUq!k b` /*----------------------ʾÒâ´úÂ뿪ʼ--------------------------------------------*/
_EA6ZC]2W     fd1 = socket();//´´½¨Ò»¸ösocket
.QS#m5f.G7z-u     fd2 = socket();//´´½¨Ò»¸ösocket2a?3x2om5b
    while(1)  { c1q0w.r%T m{V
        FD_ZERO (&readfds);
&y4V8rh"G         FD_ZERO (&writefds);.G~]o&`3zu4^
        FD_SET (fd1, &readfds);
gqf.Jx2}%Q9j3}         FD_SET (fd2, &writefds);)z+a+m1\l+~y-Q
        timeout.tv_sec=1;
y5d!Wo p4O t         timeout.tv_uec=0;
l.gW5{ wY$I         ret = select(fd1>fd2?(fd1+1):(fd2+1), &readfds, &writefds, NULL, &timeout);R6RS6ti)lr^
        if(ret < 0) {printf("ϵͳ´íÎó£¬select³ö´í£¬´íÎó´úÂ룺%d, ´íÎóÐÅÏ¢£º%s", errno, strerror(errno));}
A f#Dgu#`ZmK         else if(ret == 0) {printf("select³¬Ê±·µ»Ø£¬Ã»ÓÐÈκξä±ú״̬·¢Éú±ä»¯£¡");}
s;s!~y8f ?fz"pl         //Óоä±ú״̬·¢ÉúÁ˱仯
OROh5^h-u_         if(FD_ISSET(fd1, &readfds)) {D2O/X+J JL"^
            fd1ÓÐÊý¾Ý¿É¶Á;,z;y8_3rAV$z!D { kl P
            fd1ÀïµÄÊý¾Ý±»¶Á³öÀ´;
{Cr5`9hE;P         }
2}A'DT$q"s'S-Y*b         if(FD_ISSET(fd2, &writefds)) {
a"CU;WC9y             fd2¿Éд;p Q4Z D(F*v
            fd2Àï·¢ËÍÊý¾Ý¸ø¶Ô·½;
)o:Q&o8s$Y         };R5JQ9B&}
    }
Z:H N$t ^a&] /*----------------------ʾÒâ´úÂë½áÊø--------------------------------------------*/
Y{9M&p[o0Y.cmHV [/CODE]
7Z,a G,n%m[|q ¾­³£Óõ½µÄ¼¸¸ö×Ô¶¨Ò庯Êý£º/PhQo_q-F A
1¡¢¿ªÆô¼àÌýµÄº¯Êý8Q)X CJ;Zu'Q9tJ
[CODE]`}} l2L$X([(I'nU
/*----------------------Ô´´úÂë´úÂ뿪ʼ--------------------------------------------*/
7h F{2s1@kQ int
~P(AJz3N OpenSCPServer(int port, int total, int sendbuflen, int recvbuflen, int blockORnot, int reuseORnot)    {
\Y#m6Z)a `mv\ /*************************¹ØÓÚ±¾º¯Êý************************************Fu%W\DHd3UDa
*function_name: OpenSCPServer
A [p#Y l@ *²ÎÊý˵Ã÷£ºportÕûÊýÐͼàÌý¶Ë¿ÚºÅ£¬totalÕûÊýÐͼàÌý¸öÊý£¬sendbuflenÕûÊýÐÍ·¢ËÍ»º³åÇø´óС
'Zr#[,_ d *          recvbuflenÕûÊýÐͽÓÊÕ»º³åÇø´óС£¬blockORnotÕûÊýÐÍÊÇ·ñ×èÈû£¬reuseORnotÕûÊýÐÍÊÇ·ñ¶Ë¿ÚÖØÓÃ
"LVZlb1z *purpose: ÓÃÀ´½¨Á¢Ò»¸ötcp·þÎñ¶Ësocket
j+Q!f;jMK*| *tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)9X lPH%N$rop b9D
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ?'Z.}Vko
*date time:2006-07-05 20:00:002z2Nm_0o+h
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;Je2XL(b]$~\h$G Z
* µ«Çë×ñÑ­GPL#[yflD8w'ca/o'vYk
*Thanks to: Paul Sheer ¸ÐлPaul SheerÔÚselect_tutµÄmanÊÖ²áÀïÌṩÁËÕâ·ÝÔ´´úÂëcYvE BQzU]
*Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦1f x&pQsAg
*Note:ҪʹÓô˺¯ÊýÐèÒª×Ô¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿char errorMessage[1024];²¢°üº¬GetCurrentTime.hÍ·Îļþ
ge4F n$[ *********************************************************************/8t1qupw4g
    int    sockfd = 0, ret = 0, opt = 0, flags=1;*y$C @ O t@ p
    struct sockaddr_in    laddr;
"[)De6e#p*j`^&s "S%p'{bK,s5W
    ret = sockfd = socket(PF_INET, SOCK_STREAM, 0);"R!_4pt@j }
    if(ret < 0)    {
_#[t7Zdl2SE!gJ ^         sprintf(errorMessage, "OpenTCPServer socket() error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));4LW[Su&i
        return -1;0[ j-a/Q8I4b
    }
^8PF%`"ko!J
,b"xH:n`@+a     ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuseORnot, sizeof(int)); zss4rj/Zy
    if(ret < 0)    {Nq!{\D
        sprintf(errorMessage, "OpenTCPServer setsockopt() reuse error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));
OsD3p#G         return -2;\$| A,u8K!GI
    }
*iXz8T3GH3D P h8}K 'qsvU_$j
    ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuflen, sizeof(int));
3byZ{ wD)R3c f     if ( ret < 0)    {B|j.^^
        sprintf(errorMessage, "OpenTCPServer setsockopt() recvbuf error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));
4g5K0B8e+? d`?X#j         return -3; Xfu7I4A7qz
    }3g:@+sb,]O3zS!~

%Io:hNZ     ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuflen, sizeof(int));:VdO AC
    if (ret < 0)    {
w*Uf-N7J?6gd(HG         sprintf(errorMessage, "OpenTCPServer setsockopt() sendbuf error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));
U WZZ$J:_f+s PW         return -4;3rC9j'N(B\3n9X4d
    }
b'|Y m-^[!K
#{ ^0tNEU     ioctl(sockfd,FIONBIO,&blockORnot);/*block or not*/
:kI+b$Z#H
~ yI[ d1U_     laddr.sin_family = PF_INET; ~c0s2_q#I7\ er
    laddr.sin_port = htons(port);
/t4yOWP"A(Q     laddr.sin_addr.s_addr = INADDR_ANY;Kfvnk/Wa?}D%[
    bzero(&(laddr.sin_zero), 8);X.@x{ K8N?

x]!n#FE     ret = bind(sockfd, (struct sockaddr *)&laddr, sizeof(struct sockaddr)); J7A-[O V]2X%P4LP
    if(ret < 0)    {
!{"tMFw dX         sprintf(errorMessage, "OpenTCPServer bind() error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));
h(Yagn         close(sockfd);
#s1KJ1L#Yf%M         return -5;k0lewCw6E Yfr w
    }.OTHM1P y.k
    ret = listen(sockfd, total);Vu?W9T8hl*\V
    if(ret < 0)    {Nd`dx$_?({&n!f
        sprintf(errorMessage, "OpenTCPServer listen() error! return:%d, errno=%d, errortext:'%s' %s", ret, errno, strerror(errno), GetCurrentTime(0, 0));bE:nV3\7LYg%@
        close(sockfd);
n NoJ)C @%v;Z3q#?i         return -6;s/HT&PT
    }
ZP0X;hf7{:C-e     sprintf(errorMessage, "OpenTCPServer opened on port.%d(%d) OK, socket(%d), buf(%d:%d)! %s", port, total, sockfd, sendbuflen, recvbuflen, GetCurrentTime(0, 0));
g\}'X @imT0c     return sockfd;
9y9wR%Ir[6BB8M }UoQY_
/*----------------------Ô´´úÂë´úÂë½áÊø--------------------------------------------*/6Jq3V*YxL(q#m
[/CODE]
V"J@ J(? w 2¡¢Á¬½Ó·þÎñÆ÷µÄº¯Êýls"r(}-uf0aB+\a]
[CODE]{(T.^XF
/*----------------------Ô´´úÂë´úÂ뿪ʼ--------------------------------------------*/ZPL4Oi4M,a*_#{
intG pNZ9z"y.q i.p1c q
ConnectSCPServer(char * serverip, int serverport, int blockORnot)    {
M v"Q]3qJ.` /*************************¹ØÓÚ±¾º¯Êý************************************
}~9@&xk0O0u+a *function_name: ConnectSCPServer
BOM/U}C-e+L *²ÎÊý˵Ã÷£ºserverip·þÎñÆ÷IPµØÖ·»òÖ÷»úÃû£¬serverport·þÎñÆ÷¶Ë¿Ú£¬blockORnotÕûÊýÐÍÊÇ·ñ×èÈû
1W'^ t5l8`o ?A *purpose: ÓÃÀ´½¨Á¢Ò»¸ötcp¿Í»§¶Ësocket
;s l{ U5o1m2J,^gI *tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)%{-B,tti)h$rO
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔ
eqOc"`:^v3F(Y6M *date time:2006-07-05 20:40:00"j+bZav.pK
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;1RH3pA8M5W[_
* µ«Çë×ñÑ­GPL
S?j!xZ"P!g2? *Thanks to: Paul Sheer ¸ÐлPaul SheerÔÚselect_tutµÄmanÊÖ²áÀïÌṩÁËÕâ·ÝÔ´´úÂë
7g]#t1Ce2D3XC3p9Z *Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦2bUA"~L$I/u6Z
*Note:ҪʹÓô˺¯ÊýÐèÒª×Ô¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿char errorMessage[1024];²¢°üº¬×Ô¼º±àдµÄGetCurrentTime.hÍ·Îļþ{*R6DQ5gX*o
*********************************************************************/\4|@"^_z+C2ADc3T4J
    int    serversock = 0, ret = 0;%g]#jR6bL| ? a
    unsigned long    addr;
8FvAW;p&f A     struct sockaddr_in    sin;
m:I%J+x-Tvou     struct hostent *he;`a X-q#W r0x9J:]:U
8`*s{D[fg
    if((he=gethostbyname(serverip))== 0) {8? D$P z#pD7N2L
        sprintf(errorMessage, "ConnectSCPServer IP address '%s' error! return:-1 %s", serverip, GetCurrentTime(0, 0));*ThO1bc4cy
        return -1;&asC OyZ.uV
    }
R j!lc ^3k]nv
[/^?;Jv     serversock = socket(PF_INET, SOCK_STREAM, 0);
-\8@R2K x:Ma$r-n     if(serversock == -1)    {
1[0Rc0}I6HJ         sprintf(errorMessage, "ConnectSCPServer socket() error! return:-2, errno=%d, errortext:'%s' %s", errno, strerror(errno), GetCurrentTime(0, 0));
"Y$X6E U @Er~         return -2;
Q7IX$w9t2~(l     }
l @ N [%v u5L @)S8uD5mn7tG4g#b&r9[/L
    ioctl(serversock, FIONBIO, &blockORnot);  //block or not#d[)a9cmD9t_,R
9Z ]%W5tNn
    memset((char*)&sin, 0, sizeof(struct sockaddr_in)); c6ViWGA
    sin.sin_family = PF_INET;1m-QH:Y_
    sin.sin_port = htons(serverport);
+Z$xgd.xZU     sin.sin_addr = *((struct in_addr *)he->h_addr);
2F${vEXjdS {H#Czqkj
    ret = connect(serversock, (struct sockaddr *)&sin, sizeof(sin));PL}*Fj k J
d,s`4z%Wy$[
    if(ret == -1)    {
M)n!cw*GO         sprintf(errorMessage, "ConnectSCPServer connect() error! return:-3, errno=%d, errortext:'%s' %s", errno, strerror(errno), GetCurrentTime(0, 0));
WwJq2wN,az1c6n         close(serversock);QfF5[z+g-\A
        return -3;
pw V#v B"V     }
d4_VJ!QM*r.M^9Q+X
+v&E7js/\!i.U     return serversock;*x_]W/Lp:^)[;kn
}CG5t[X&z'Q
/*----------------------Ô´´úÂë´úÂë½áÊø--------------------------------------------*/
_1zM"W(pc]7w5BrB [/CODE]@yb-D[7j7W3XmIQh
3¡¢·¢ËÍÊý¾Ýº¯ÊýSend3m:^f"r0vp[*^
[CODE]
#KK{_!b"D /*----------------------Ô´´úÂë´úÂ뿪ʼ--------------------------------------------*/6J OR(a(Q1@XS;Um
int
w(f}|-kN*g'H Send(int sock, char * buf, size_t size, int flag, int timeout)    { W$M\Y.T"]{{%m
/*************************¹ØÓÚ±¾º¯Êý************************************L#@h#r/w }.a
*function_name: Send
)R4y#q7L_ mi6zd *²ÎÊý˵Ã÷£ºsockÕûÊýÐÍsocket£¬buf´ý·¢Ë͵ÄÄÚÈÝ£¬sizeÒª·¢Ë͵ĴóС£¬flag·¢ËÍÑ¡Ïtimeout³¬Ê±Ê±¼äÖµQ A"h$u6l%m1J
*purpose: ÓÃÀ´Í¨¹ýÒ»¸ösocketÔÚÖ¸¶¨Ê±¼äÄÚ·¢ËÍÊý¾Ý
XX'K7U6d5Q3i$Nj *tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com);i0{zC:V
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔf0D k3|*pmj,m1g
*date time:2006-07-05 20:58:00'p)mwvs1ll5^.M
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;UxvG#^BQw
* µ«Çë×ñÑ­GPL!F^)BX%j"I%@
*Thanks to: Paul Sheer ¸ÐлPaul SheerÔÚselect_tutµÄmanÊÖ²áÀïÌṩÁËÕâ·ÝÔ´´úÂë\UC)`ni9}uYeF
*Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦7y6PX%BA;R A%} }'f#u
*Note:ҪʹÓô˺¯ÊýÐèÒª×Ô¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿char errorMessage[1024];²¢°üº¬×Ô¼º±àдµÄGetCurrentTime.hÍ·Îļþs.Pwspo
*********************************************************************/
0QhD7E:J'o0B7U     int i = 0, ret = 0, intretry = 0;
)Ynu0x1VE|.V
.rT0Mu%DTa.k+s     struct timeval tival;
}/E+a,j:Q&`     fd_set writefds;s j Jigc!m`b6np
    int maxfds = 0;
v.Wy!nGl;Lr;f ~ *s$^9l8b B.IM(b'J
    tival.tv_sec = timeout;
i:V9Z3cUNv     tival.tv_usec = 0;
"]$`(P^!iZTy?&O 6v q4c3`ym
    FD_ZERO(&writefds);HSd0?"l{I2zW
o-?$]MBH/j+s
    if(sock > 0) {
F&u'n&]bT1L7J}         FD_SET(sock, &writefds);
pR;G^aNq[y@W(p{         maxfds=((sock > maxfds)?sock:maxfds);
'?#^Of]c!n*[%F     }p-p1p4N|)R2uVx5J
    else    {^Wh.LAxY
        sprintf(errorMessage, "Send socket:%d error! return:-2 %s", sock, GetCurrentTime(0, 0));8`E!?j3s |Gh3_!`7rU
        return -2;
nr&Iy$Ukg0U nD,R     }
+t-Glq1hQD0o[ uN I5Iq
    ret = select(maxfds + 1, NULL, &writefds, NULL, &tival);~;QRfe6ZCE
    if(ret <= 0) {D l^:f^'o3^
        if(ret < 0)    sprintf(errorMessage, "Send socket:%d select() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));
o*C9[4];P1w V }g         else sprintf(errorMessage, "Send socket:%d select timeout(%d)! %s", sock, timeout, GetCurrentTime(0, 0));
x P/~?%UZ\\         close(sock);^V$t3d*d V/FY
        return -3;@UN pI7m-CnS
    }#|.Xf3{ F"OjRX
    if(!(FD_ISSET(sock, &writefds)))    {-FwN(T/X9Y0CE2}
        sprintf(errorMessage, "Send socket:%d not in writefds! %s", sock, GetCurrentTime(0, 0));
[4g1o}7u@Ks         close(sock);
8dd Y:B j~{K6^c b         return -4;
)\J pWpQKv` c     }
8W |d*P9f ]%m'X+T"m#\*j8l {
    while(i < size)    {
&SV(B*OFQ         ret = send(sock, buf + i, size - i, flag);
N6O9kteN;b         if(ret <= 0)    {
D8c?-x0m7h*C1gs9|             sprintf(errorMessage, "Send socket:%d send() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));
"ASfE6^5Oi+vy K,x8R4j|D8o
            if (EINTR == errno)d(o bn8xdm-@
              if(intretry < 10)  {intretry++;continue;}
!@ n"U]a&QK5V0V               else sprintf(errorMessage, "Send socket:%d send() error!EINTR 10 times! %s", sock, GetCurrentTime(0, 0));
P7J4dj)W
(zl}+{?ln*t2k q(P             close(sock);]%Iq }A1FK0^
            return -1;
A NB.Z4}Y E p         }
4^M9C"ax         else i += ret;Mf Ez,^mU
    }
y(t[ wF&U [     sprintf(errorMessage, "Send socket:%d send() OK! %d/%d bytes sent! %s", sock, i, size, GetCurrentTime(0, 0));
?-hG;r6U/i+`     return i;qzo@#WP2T9T
}@mog*a8L-qaF{
/*----------------------Ô´´úÂë´úÂë½áÊø--------------------------------------------*/
YTt UV$y%Qo [/CODE]
"XU"M&K ? 4¡¢½ÓÊÕÊý¾Ýº¯ÊýRecvz6O+VTY*u.V$q0r+e
[CODE]2k uR#}P:P}+krP
/*----------------------Ô´´úÂë´úÂ뿪ʼ--------------------------------------------*/Bl$r9f%K-]wV
inth9i6i'Yr&QA7r
Recv(int sock, char * buf, size_t size, int flag, int timeout)    {
XHl f u /*************************¹ØÓÚ±¾º¯Êý************************************4S1FN.i(r]/s+b
*function_name: Recv
2X(d&xZg9s *²ÎÊý˵Ã÷£ºsockÕûÊýÐÍsocket£¬buf½ÓÊÕÊý¾ÝµÄ»º³åÇø£¬sizeÒª½ÓÊÕÊý¾ÝµÄ´óС£¬flag½ÓÊÕÑ¡Ïtimeout³¬Ê±Ê±¼äÖµ
+L&} Dfj *purpose: ÓÃÀ´´ÓÒ»¸ösocketÔÚÖ¸¶¨Ê±¼äÄÚ¶ÁÈ¡Êý¾Ý
W(G)B_j4` *tidied by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢(http://zhoulifa.bokee.com)5}y'e_"B i E9L(Y8?/_
Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔLbbP p6[d x#r
*date time:2006-07-05 21:10:00_~q2Q.}2q
*Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;
@!_9E${zx1D * µ«Çë×ñÑ­GPL
1d.DB)jd&N5m3@:p *Thanks to: Paul Sheer ¸ÐлPaul SheerÔÚselect_tutµÄmanÊÖ²áÀïÌṩÁËÕâ·ÝÔ´´úÂë
B(e&q6aS0F *Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦Onu Ou4Y
*Note:ҪʹÓô˺¯ÊýÐèÒª×Ô¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿char errorMessage[1024];²¢°üº¬×Ô¼º±àдµÄGetCurrentTime.hÍ·Îļþ.j3]D Fe JD
*********************************************************************/
QP${)yds;g(p.`     int i = 0, ret = 0, intretry = 0;0~'\^F2Z
}faF@0C&{
    struct timeval tival;8i W0f'H9f,Qt7o
    fd_set readfds;i eP*?^
    int maxfds = 0;
5Z+B T+IY KB{Wo)}]4oL ]1w0h
    tival.tv_sec = timeout;5r X(q P,qTtdR%W
    tival.tv_usec = 0;
v9A4T:D1Q
1E$O&\+P/y&~5K#XY     FD_ZERO(&readfds);De}-S'l%Z"_%h n7a
R'T b-^ ]1nE/Y2O
    if(sock > 0) {"c,LU8fmv
        FD_SET(sock, &readfds);z rW'F3g0_;HXld@
        maxfds=((sock > maxfds)?sock:maxfds);r4JP?k7`2M*va
    }
H)ac(Y7U     else    {
[${ ^`3o)T5O         sprintf(errorMessage, "Recv socket:%d error! return:-2 %s", sock, GetCurrentTime(0, 0));J-y7K.tf:c
        return -2;4o*F2F` rP!CL,q
    }2ZI,TXh HQ w
{1w1Q}y$KC~p
    ret = select(maxfds + 1, &readfds, NULL, NULL, &tival);;j`'R%i7i$k
    if(ret <= 0) { l:Z A$Vfo7X
        if(ret < 0)    sprintf(errorMessage, "Recv socket:%d select() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));
BR1xs#s         else sprintf(errorMessage, "Recv socket:%d select timeout(%d)! %s", sock, timeout, GetCurrentTime(0, 0));
h"~0MZ @'@ ~Y         close(sock);,rK4A&j#P3\G)n V
        return -3;
+OQL#` W'N'~ k     }'Y5y'\ q}dO+oe5R
    if(!(FD_ISSET(sock, &readfds)))    {
mCu BO0h"e@D/pb         sprintf(errorMessage, "Recv socket:%d not in readfds! %s", sock, GetCurrentTime(0, 0));:[b"ML vp"dF D
        close(sock);
k~sy u \4C1?}         return -4;k3J:v`@%iY
    }]yp&e^LPk
    while(i < size)    {&gEo+n4i/q-v
        ret = recv(sock, buf + i, size - i, flag);
bn+B%ZN7fb         if(ret <= 0){3^2~C!l'r
            sprintf(errorMessage, "Recv socket:%d recv() error! return:%d, errno=%d, errortext:'%s' %s", sock, ret, errno, strerror(errno), GetCurrentTime(0, 0));
L-X zt%G_             if(errno == EINTR)   ] FJ6z3a}X},m'a
                if(intretry < 10)  {intretry++;continue;}2Bw x9d'j{'}:U%t
                else sprintf(errorMessage, "Recv socket:%d recv() error! EINTR 10 times! %s", sock, GetCurrentTime(0, 0));
&IKpd1c.y2c             close(sock);
IeIH#T?(V@             return -1;
^ Ji:hlyz         }m8FQ1M8a,g B
        else i += ret;
8D y0Aer f4Q8y*X     }q"n,kxI2r-?a2y
    sprintf(errorMessage, "Recv socket:%d recv() OK! %d/%d bytes received! %s", sock, i, size, GetCurrentTime(0, 0));
7l0Xe&K {     return i;X8t*W/Ka1IW5c
}N_ [m)SxKQ/L
[/CODE],ZOq&mS6G
×îºóÐèҪ˵Ã÷µÄÊÇ£ºÎÒÕâÀï½²µ½µÄÔ´³ÌÐò²¢²»ÄÜʵ¼ÊµØ×÷Ϊһ¸ö²úÆ·³ÌÐòÀ´Óã¬Êµ¼ÊÇé¿öÏ¿ÉÄÜ»áÓÐÆäËüÐí¶à¹¤×÷Òª×ö£¬±ÈÈç¿ÉÄÜÒª½¨Á¢¹²Ïí¶ÓÁÐÀ´´æ·Å socketÀï¶Áµ½µÄÏûÏ¢£¬Ò²¿ÉÄܰѷ¢ËÍÏûÏ¢ÏȽøÐÐÅŶÓÈ»ºóÔÙµ÷ÓÃSendº¯Êý¡£»¹ÓУ¬Èç¹û²»ÊÇÈ«Êý×Ö£¬ÔÚ·¢ËÍǰһ¶¨Òªhtonlת»»ÎªÍøÂç×Ö½ÚÐò£¬Í¬Àí½ÓÊÕµ½ºóÒ»¶¨ÒªÏÈntohlÓÉÍøÂç×Ö½ÚÐòת»»ÎªÖ÷»ú×Ö½ÚÐò£¬·ñÔò¶Ô·½·¢Ë͹ýÀ´µÄ0x00000001ÔÚÄãÕâÀï¿ÉÄÜÊÇ0x00010000£¬ÒòΪ¸ßµÍλ˳Ðò²»Í¬¡£

flag ·¢±íÓÚ 2006-7-6 10:11

Ô­´´Â𣿹ÄÀøÒ»Ï¡£

zhoulifa ·¢±íÓÚ 2006-7-6 10:17

[QUOTE=flag]Ô­´´Â𣿹ÄÀøÒ»Ï¡£[/QUOTE]
#\F?4m;NQ-`ak Á÷³ÌͼÊÇÎÒÓÃLinuxÏÂdiaÈí¼þ»­µÄ£¬Ô´´úÂë³ýÁËÄǸö¶Ë¿Úת·¢µÄÊÇÕûÀíµÄselect_tutµÄmanÊÖ²áÀïµÄ£¬ÆäËü¶¼ÊÇ×Ô¼ºÐ´µÄ¡£±Ï¾¹Ð´ÁË5ÄêÁËLinuxÏÂC³ÌÐòÁË£¬ÓÐЩԴ´úÂë»ýÀÛ¡£q)DCC-UE
¿ÉÒÔËãÊÇÔ­´´Á˰ɣ¿

zhoulifa ·¢±íÓÚ 2006-7-6 22:59

Linux 2.6ÄÚºËÖÐÌá¸ßÍøÂçI/OÐÔÄܵÄз½·¨epollW"G @"rsS
2q q.io!W ]r&i

(F/X-Tpz.B)R*Wb
j.lH x]1{|Gdh9F ÕýÈçÎÒ×òÌìÔÚ¡°Linuxϸ÷ÀàTCPÍøÂç·þÎñÆ÷µÄʵÏÖÔ´´úÂ롱([url]http://zhoulifa.bokee.com/5345930.html[/url])Ò»ÎÄÖÐÌáµ½µÄÄÇÑù£¬I/O¶à·¸´Óü¼ÊõÔڱȽ϶àµÄTCPÍøÂç·þÎñÆ÷ÖÐÓÐʹÓ㬼´±È½Ï¶àµÄÓõ½selectº¯Êý¡£
qvi!XCO kT L-LH4t:\&k5H4k5b
¸Ðлchinaunix.netÉÏÅóÓÑsafedead([url]http://bbs.chinaunix.net/viewpro.php?uid=407631[/url])ÌáÐÑ£¬ÎÒ½ñÌì×ÐϸÑо¿ÁËһϣ¬Ö¤ÊµÁËÔÚ2.6ÄÚºËÖеÄеÄI/O¼¼Êõepoll¡£
;G F3o(zItt %`^z|.Q#\ Y%c2]
-P$E!s-o ti:T9} DY

"^2Mm4aGa2Y 1¡¢ÎªÊ²Ã´selectÊÇÂäºóµÄ£¿+M&{8Up Y?*G!gl)o+WM)CQ
.` bV0T9MJ4\0Dt
Ê×ÏÈ£¬ÔÚLinuxÄÚºËÖУ¬selectËùÓõ½µÄFD_SETÊÇÓÐÏ޵쬼´ÄÚºËÖÐÓиö²ÎÊý__FD_SETSIZE¶¨ÒåÁËÿ¸öFD_SETµÄ¾ä±ú¸öÊý£¬ÔÚÎÒÓõÄ2.6.15-25-386ÄÚºËÖУ¬¸ÃÖµÊÇ1024£¬ËÑË÷ÄÚºËÔ´´úÂëµÃµ½£º cm1`!LF+BV
a B8\6q%A.h/W']{
include/linux/posix_types.h:#define __FD_SETSIZE        1024g)Y1t^5S_

x:m;`.f `%Y oU Ò²¾ÍÊÇ˵£¬Èç¹ûÏëҪͬʱ¼ì²â1025¸ö¾ä±úµÄ¿É¶Á״̬ÊDz»¿ÉÄÜÓÃselectʵÏֵġ£»òÕßͬʱ¼ì²â1025¸ö¾ä±úµÄ¿Éд״̬ҲÊDz»¿ÉÄܵġ£+z kZe w:P
oY%`9m)n"[$Lc&f
Æä´Î£¬ÄÚºËÖÐʵÏÖselectÊÇÓÃÂÖѯ·½·¨£¬¼´Ã¿´Î¼ì²â¶¼»á±éÀúËùÓÐFD_SETÖеľä±ú£¬ÏÔÈ»£¬selectº¯ÊýÖ´ÐÐʱ¼äÓëFD_SETÖеľä±ú¸öÊýÓÐÒ»¸ö±ÈÀý¹ØÏµ£¬¼´selectÒª¼ì²âµÄ¾ä±úÊýÔ½¶à¾Í»áÔ½·Ñʱ¡£BQX^8Vb
Z*p-T;I6lZ(T
µ±È»£¬ÔÚǰÎÄÖÐÎÒ²¢Ã»ÓÐÌá¼°poll·½·¨£¬ÊÂʵÉÏÓÃselectµÄÅóÓÑÒ»¶¨Ò²ÊÔ¹ýpoll£¬ÎÒ¸öÈ˾õµÃselectºÍpoll´óͬСÒ죬¸öÈËÆ«ºÃÓÚÓÃselect¶øÒÑ¡£
pp$fXr#y4c
$A,H+b:rp&em;C-l N
HKN]@ X3U9k,M-b(ip
/************¹ØÓÚ±¾Îĵµ********************************************
4I!o]~,j/{AQ8zQ3eZ
q:K3l we1V!|+x *filename: Linux 2.6ÄÚºËÖÐÌá¸ßÍøÂçI/OÐÔÄܵÄз½·¨epoll
\t$O/`2I J J~!i)TIc9y3uo#AM
*purpose: ²¹³ä¡°Linuxϸ÷ÀàTCPÍøÂç·þÎñÆ÷µÄʵÏÖÔ´´úÂ롱һÎĵIJ»×ãÖ®´¦fO5i umB:ak

4Je1cxc4p b *wrote by: zhoulifa(zhoulifa@163.com) ÖÜÁ¢·¢([url]http://zhoulifa.bokee.com[/url])
c,X-e9Y*Jmo
'}*yY)`+v#M?} Linux°®ºÃÕß Linux֪ʶ´«²¥Õß SOHO×å ¿ª·¢Õß ×îÉó¤CÓïÑÔb;U%BX*Xg`3C
BvO7c5L,Fqe
*date time:2006-07-06 22:30:00
-Set0O5Q@
bH;p/?Qd @(o#r;] *Note: ÈκÎÈË¿ÉÒÔÈÎÒâ¸´ÖÆ´úÂë²¢ÔËÓÃÕâЩÎĵµ£¬µ±È»°üÀ¨ÄãµÄÉÌÒµÓÃ;
CKU2X)PV[-U l
7g }%gmNO:n0g * µ«Çë×ñÑ­GPL
[aa)YC
FrfGRb(? *Hope:Ï£ÍûÔ½À´Ô½¶àµÄÈ˹±Ï××Ô¼ºµÄÁ¦Á¿£¬Îª¿ÆÑ§¼¼Êõ·¢Õ¹³öÁ¦
4P5[jeZU5h 3Wtr^&s
*********************************************************************/
;qR i#Y;q]-O
l#w$K2c2t:]
e.D:K5_'VN
&]0~~ m~ 2¡¢2.6ÄÚºËÖÐÌá¸ßI/OÐÔÄܵÄз½·¨epoll
GF4s$p:t"ayU
^{N)Y P @F D1x7E
;o6s8`Hy
I&G8t&Gd)G0L2nSs epollÊÇʲô£¿°´ÕÕmanÊÖ²áµÄ˵·¨£ºÊÇΪ´¦Àí´óÅúÁ¿¾ä±ú¶ø×÷Á˸ĽøµÄpoll¡£ÒªÊ¹ÓÃepollÖ»ÐèÒªÕâÈý¸öϵͳµ÷Óãºepoll_create(2)£¬ epoll_ctl(2)£¬ epoll_wait(2)¡£
W$Gxe-E?o1h i x(`)G Ch8h D.JJS$N ] n
µ±È»£¬Õâ²»ÊÇ2.6Äں˲ÅÓеģ¬ËüÊÇÔÚ2.5.44ÄÚºËÖб»Òý½øµÄ(epoll(4) is a new API introduced in Linux kernel 2.5.44)
P/Z7C$H|s*G _SN A z1H5^ ~2\"f5W

qL"i5A;H#vY
j5H^-P1Y!Se6T*s ÒÔÏÂÎÄÕÂת×ÔëøêŵÄWeb Log [url]http://mechgouki.spaces.msn.com/blog/PersonalSpace.aspx[/url]Q4i;Vgf
[QUOTE]:s `6@K b4ns+bp
sn;Q!e+b]
/*********************************ÒýÓÿªÊ¼******************************/0}'c[pV6l"^
2l Xs S?0pM~T
Linux2.6ÄÚºËepoll½éÉÜ---ÎÒµÄblog 2005/3/30L:].r2Ub!y6}L9Z
6_I8U0BA*wF
z,uo]/o o}9@
;va0S0[j1f@
[×÷Õß]£ºëøêÅ,2005/3/30,0.1°æ±¾
k gsqVm
d,UhC*}-auL ;U.HjamY_

d i4[:Mi:B5w1W w [°æÈ¨ÉùÃ÷]£º´ËÎĵµ×ñÑ­GNU×ÔÓÉÎĵµÐí¿ÉÖ¤(GNU Free Documentation License).ÈκÎÈË¿ÉÒÔ×ÔÓɸ´ÖÆ,·Ö·¢,ÐÞ¸Ä,²»¹ýÈç¹û·½±ã,Çë×¢Ã÷³ö´¦ºÍ×÷Õß:)
VNiR[jQ s'I7pP7VL
O/FD%{h)y
)NlI,C1VkaV\j
(1)µ¼ÑÔ£º&` ]'E;^&f"Ep;c{
#k!S+OV M
$e{1F.OB7vO(G4?;L
xk7b r,Nvy
Ê×ÏÈ£¬ÎÒÇ¿ÁÒ½¨Òé´ó¼ÒÔĶÁRichard StevensÖø×÷¡¶TCP/IP Illustracted Volume 1,2,3¡·ºÍ¡¶UNIX Network Programming Volume 1,2¡·¡£ËäÈ»ËûÀ뿪ÎÒÃÇ´ó¼ÒÒѾ­5Äê¶àÁË£¬µ«ÊÇËûµÄÊéÒÀÈ»ÊǽøÈëÍøÂç±à³ÌµÄ×îÖ±½ÓµÄµÀ·¡£ÆäÖеÄ3¾íµÄ¡¶TCP/IP Illustracted¡·¾í1ÊDZضÁ£­Èç¹ûÄã²»Á˽âtcpЭÒé¸÷¸öÑ¡ÏîµÄÏêϸ¶¨Ò壬Äã¾ÍʧȥÁËÓÅ»¯³ÌÐòÖØÒªµÄÒ»¸öÊֶΡ£¾í2,3¿ÉÒÔÑ¡¶Áһϡ£±ÈÈç¾í2 ½²½âµÄÊÇ4.4BSDÄÚºËTCP/IPЭÒéջʵÏÖ----Õâ¸ö°æ±¾µÄЭÒéÕ»¼¸ºõÓ°ÏìÁËÏÖÔÚËùÓеÄÖ÷Á÷os£¬µ«ÊÇÒòΪÄê´ú¾ÃÔ¶£¬ÄÚÈݲ»Ò»¶¨ÄÇôvogue. ÔÚÕâÀïÎÒ¶àÍÆ¼öÒ»±¾¡¶The Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel¡·£¬ÒÔ2.4Äں˽²½âLinux TCP/IPʵÏÖ£¬Ï൱²»´í.×÷Ϊһ¸öÏÖʵÊÀ½çÖеÄʵÏÖ£¬ºÜ¶àʱºòÄã±ØÐë×÷ºÜ¶àȨºâ£¬Õâʱºò²Î¿¼Ò»¸ö¾Ã¾­¿¼ÑéµÄϵͳ¸üÓÐʵ¼ÊÒâÒå¡£¾Ù¸öÀý×Ó,linuxÄÚºËÖÐsk_buff½á¹¹ÎªÁË×·ÇóËٶȺͰ²È«£¬ÎþÉüÁ˲¿·ÖÄڴ棬ËùÒÔÔÚ·¢ËÍTCP°üµÄʱºò£¬ÎÞÂÛÓ¦ÓòãÊý¾Ý¶à´ó,sk_buff×îСҲÓÐ272µÄ×Ö½Ú.#Z!\L#UK-b
$f JJxO\C

nhC;R6nPZ+oI p|Nd,X1{ G4[
Æäʵ¶ÔÓÚsocketÓ¦Óòã³ÌÐòÀ´Ëµ£¬¡¶UNIX Network Programming Volume 1¡·ÒâÒå¸ü´óÒ»µã.2003ÄêµÄʱºò£¬Õâ±¾Êé³öÁË×îеĵÚ3°æ±¾£¬²»¹ýÖ÷Òª»¹ÊÇÐÞ¶©µÚ2°æ±¾¡£ÆäÖеÚ6Õ¡¶I/O Multiplexing¡·ÊÇ×îÖØÒªµÄ¡£Stevens¸ø³öÁËÍøÂçIOµÄ»ù±¾Ä£ÐÍ¡£ÔÚÕâÀï×îÖØÒªµÄιýÓÚselectÄ£ÐͺÍAsynchronous I/OÄ£ÐÍ.´ÓÀíÂÛÉÏ˵£¬AIOËÆºõÊÇ×î¸ßЧµÄ£¬ÄãµÄIO²Ù×÷¿ÉÒÔÁ¢¼´·µ»Ø£¬È»ºóµÈ´ýos¸æËßÄãIO²Ù×÷Íê³É¡£µ«ÊÇÒ»Ö±ÒÔÀ´£¬ÈçºÎʵÏÖ¾ÍûÓÐÒ»¸öÍêÃÀµÄ·½°¸¡£×îÖøÃûµÄwindowsÍê³É¶Ë¿ÚʵÏÖµÄAIO,ʵ¼ÊÉÏÒ²ÊÇÄÚ²¿ÓÃÏ̳߳ØÊµÏֵİÕÁË£¬×îºóµÄ½á¹ûÊÇIOÓиöÏ̳߳أ¬ÄãÓ¦ÓÃÒ²ÐèÒªÒ»¸öÏ̳߳Ø...... ºÜ¶àÎĵµÆäʵÒѾ­Ö¸³öÁËÕâ´øÀ´µÄÏß³Ìcontext-switch´øÀ´µÄ´ú¼Û¡£0N6u aS+Oe
j'ty#\ d+j)b x
ev~8QTbR%[
'q N)MV7x?
ÔÚlinux ƽ̨ÉÏ£¬¹ØÓÚÍøÂçAIOÒ»Ö±ÊǸ͝×î¶àµÄµØ·½£¬2.4µÄÄê´ú¾ÍÓкܶàAIOÄÚºËpatch,×îÖøÃûµÄÓ¦¸ÃËãÊÇSGIÄǸö¡£µ«ÊÇÒ»Ö±µ½2.6Äں˷¢²¼£¬ÍøÂçÄ£¿éµÄAIOһֱûÓнøÈëÎȶ¨Äں˰汾(´ó²¿·Ö¶¼ÊÇʹÓÃÓû§Ïß³ÌÄ£Äâ·½·¨£¬ÔÚʹÓÃÁËNPTLµÄlinuxÉÏÃæÆäʵºÍwindowsµÄÍê³É¶Ë¿Ú»ù±¾Éϲ¶àÁË)¡£2.6ÄÚºËËùÖ§³ÖµÄAIOÌØÖ¸´ÅÅ̵ÄAIO---Ö§³Öio_submit(),io_getevents()ÒÔ¼°¶ÔDirect IOµÄÖ§³Ö(¾ÍÊÇÈÆ¹ýVFSϵͳbufferÖ±½ÓдӲÅÌ£¬¶ÔÓÚÁ÷·þÎñÆ÷ÔÚÄÚ´æÆ½ÎÈÐÔÉÏÓÐÏ൱°ïÖú)¡£ PG3mR8r^:i)P
2UY.a*A JA
%C%N o5@+b{z/_

&C\"B-\!i9`/I:@ ËùÒÔ£¬Ê£ÏµÄselectÄ£ÐÍ»ù±¾ÉϾÍÊÇÎÒÃÇÔÚlinuxÉÏÃæµÄΨһѡÔñ£¬Æäʵ£¬Èç¹û¼ÓÉÏno-block socketµÄÅäÖ㬿ÉÒÔÍê³ÉÒ»¸ö"α"AIOµÄʵÏÖ£¬Ö»²»¹ýÍÆ¶¯Á¦ÔÚÓÚÄã¶ø²»ÊÇos¶øÒÑ¡£²»¹ý´«Í³µÄselect/pollº¯ÊýÓÐ×ÅһЩÎÞ·¨ÈÌÊܵÄȱµã£¬ËùÒԸĽøÒ»Ö±ÊÇ2.4-2.5¿ª·¢°æ±¾Äں˵ÄÈÎÎñ£¬°üÀ¨/dev/poll£¬realtime signalµÈµÈ¡£×îÖÕ£¬Davide Libenzi¿ª·¢µÄepoll½øÈë2.6Äں˳ÉΪÕýʽµÄ½â¾ö·½°¸-S!f+}.WXN3S
C7xj(l)w7t
uao1RZgn q_
Kt4ew.r$R)J[
(2)epollµÄÓŵã3fp Fg5iz|l8S'T
!VJ?-Or6i8I3df8T"M

7c/J4Y \v3jB+_$qC
:I0B,g%c7[6nVFyB <1>Ö§³ÖÒ»¸ö½ø³Ì´ò¿ª´óÊýÄ¿µÄsocketÃèÊö·û(FD)
YDm9`xqW
/E9h2]'@m3_8s%L
/ldN#Q'W:q -P5r txU/Fds
select ×î²»ÄÜÈÌÊܵÄÊÇÒ»¸ö½ø³ÌËù´ò¿ªµÄFDÊÇÓÐÒ»¶¨ÏÞÖÆµÄ£¬ÓÉFD_SETSIZEÉèÖã¬Ä¬ÈÏÖµÊÇ2048¡£¶ÔÓÚÄÇЩÐèÒªÖ§³ÖµÄÉÏÍòÁ¬½ÓÊýÄ¿µÄIM·þÎñÆ÷À´ËµÏÔȻ̫ÉÙÁË¡£ÕâʱºòÄãÒ»ÊÇ¿ÉÒÔÑ¡ÔñÐÞ¸ÄÕâ¸öºêÈ»ºóÖØÐ±àÒëÄںˣ¬²»¹ý×ÊÁÏҲͬʱָ³öÕâÑù»á´øÀ´ÍøÂçЧÂʵÄϽµ£¬¶þÊÇ¿ÉÒÔÑ¡Ôñ¶à½ø³ÌµÄ½â¾ö·½°¸(´«Í³µÄApache·½°¸)£¬²»¹ýËäÈ»linuxÉÏÃæ´´½¨½ø³ÌµÄ´ú¼Û±È½ÏС£¬µ«ÈÔ¾ÉÊDz»¿ÉºöÊӵ쬼ÓÉϽø³Ì¼äÊý¾Ýͬ²½Ô¶±È²»ÉÏÏ̼߳äͬ²½µÄ¸ßЧ£¬ËùÒÔÒ²²»ÊÇÒ»ÖÖÍêÃÀµÄ·½°¸¡£²»¹ý epollÔòûÓÐÕâ¸öÏÞÖÆ£¬ËüËùÖ§³ÖµÄFDÉÏÏÞÊÇ×î´ó¿ÉÒÔ´ò¿ªÎļþµÄÊýÄ¿£¬Õâ¸öÊý×ÖÒ»°ãÔ¶´óÓÚ2048,¾Ù¸öÀý×Ó,ÔÚ1GBÄÚ´æµÄ»úÆ÷ÉÏ´óÔ¼ÊÇ10Íò×óÓÒ£¬¾ßÌåÊýÄ¿¿ÉÒÔcat /proc/sys/fs/file-max²ì¿´,Ò»°ãÀ´ËµÕâ¸öÊýÄ¿ºÍϵͳÄÚ´æ¹ØÏµºÜ´ó¡£
yL"Jh6Q
uGp%x!M2T
6M+t&qr;d-_/v1{2i
DxB'U7s"dV e <2>IOЧÂʲ»ËæFDÊýÄ¿Ôö¼Ó¶øÏßÐÔϽµ
r4Q4V/bVa(y +M&K;m9aCl5dG/x5f"d

O#\6|+RK3E%a8E:S
Sn(p4Osi ´«Í³µÄselect/pollÁíÒ»¸öÖÂÃüÈõµã¾ÍÊǵ±ÄãÓµÓÐÒ»¸öºÜ´óµÄsocket¼¯ºÏ£¬²»¹ýÓÉÓÚÍøÂçÑÓʱ£¬ÈÎһʱ¼äÖ»Óв¿·ÖµÄsocketÊÇ"»îÔ¾"µÄ£¬µ«ÊÇselect/pollÿ´Îµ÷Óö¼»áÏßÐÔɨÃèÈ«²¿µÄ¼¯ºÏ£¬µ¼ÖÂЧÂʳÊÏÖÏßÐÔϽµ¡£µ«ÊÇepoll²»´æÔÚÕâ¸öÎÊÌ⣬ËüÖ»»á¶Ô"»îÔ¾"µÄsocket½øÐвÙ×÷---ÕâÊÇÒòΪÔÚÄÚºËʵÏÖÖÐepollÊǸù¾Ýÿ¸öfdÉÏÃæµÄcallbackº¯ÊýʵÏֵġ£ÄÇô£¬Ö»ÓÐ"»îÔ¾"µÄsocket²Å»áÖ÷¶¯µÄÈ¥µ÷Óà callbackº¯Êý£¬ÆäËûidle״̬socketÔò²»»á£¬ÔÚÕâµãÉÏ£¬epollʵÏÖÁËÒ»¸ö"α"AIO£¬ÒòΪÕâʱºòÍÆ¶¯Á¦ÔÚosÄںˡ£ÔÚһЩ benchmarkÖУ¬Èç¹ûËùÓеÄsocket»ù±¾É϶¼ÊÇ»îÔ¾µÄ---±ÈÈçÒ»¸ö¸ßËÙLAN»·¾³£¬epoll²¢²»±Èselect/pollÓÐʲôЧÂÊ£¬Ïà·´£¬Èç¹û¹ý¶àʹÓÃepoll_ctl,ЧÂÊÏà±È»¹ÓÐÉÔ΢µÄϽµ¡£µ«ÊÇÒ»µ©Ê¹ÓÃidle connectionsÄ£ÄâWAN»·¾³,epollµÄЧÂʾÍÔ¶ÔÚselect/pollÖ®ÉÏÁË¡£p]u;XS?
$F&JKjs

y0_6w(X'_)e8y egfi*zL
<3>ʹÓÃmmap¼ÓËÙÄÚºËÓëÓû§¿Õ¼äµÄÏûÏ¢´«µÝ¡£
!z]Oh(K8n'c'Cc@ q7q(G_ob a
2[&_-G;i0o,j
z/d%u%WTs1p
Õâµãʵ¼ÊÉÏÉæ¼°µ½epollµÄ¾ßÌåʵÏÖÁË¡£ÎÞÂÛÊÇselect,poll»¹ÊÇepoll¶¼ÐèÒªÄں˰ÑFDÏûϢ֪ͨ¸øÓû§¿Õ¼ä£¬ÈçºÎ±ÜÃâ²»±ØÒªµÄÄڴ濽±´¾ÍºÜÖØÒª£¬ÔÚÕâµãÉÏ£¬epollÊÇͨ¹ýÄÚºËÓÚÓû§¿Õ¼ämmapͬһ¿éÄÚ´æÊµÏֵġ£¶øÈç¹ûÄãÏëÎÒÒ»Ñù´Ó2.5Äں˾͹Ø×¢epollµÄ»°£¬Ò»¶¨²»»áÍü¼ÇÊÖ¹¤ mmapÕâÒ»²½µÄ¡£
1^)s h5H{eLaCpP 'W} XnY I3[r

%d;l4_%TV8Sz(m '}'@8q#T^Yd
<4>ÄÚºË΢µ÷nFS rd
$jVd/M9y
"F JH4P%y-`

v5Pw+j4_|!\ ÕâÒ»µãÆäʵ²»ËãepollµÄÓŵãÁË£¬¶øÊÇÕû¸ölinuxƽ̨µÄÓŵ㡣ҲÐíÄã¿ÉÒÔ»³ÒÉlinuxƽ̨£¬µ«ÊÇÄãÎÞ·¨»Ø±Ülinuxƽ̨¸³ÓèÄã΢µ÷Äں˵ÄÄÜÁ¦¡£±ÈÈ磬ÄÚºËTCP/IPЭÒéջʹÓÃÄÚ´æ³Ø¹ÜÀísk_buff½á¹¹£¬ÄÇô¿ÉÒÔÔÚÔËÐÐʱÆÚ¶¯Ì¬µ÷ÕûÕâ¸öÄÚ´æpool(skb_head_pool)µÄ´óС--- ͨ¹ýecho XXXX>/proc/sys/net/core/hot_list_lengthÍê³É¡£ÔÙ±ÈÈçlistenº¯ÊýµÄµÚ2¸ö²ÎÊý(TCPÍê³É3´ÎÎÕÊÖµÄÊý¾Ý°ü¶ÓÁ㤶È)£¬Ò²¿ÉÒÔ¸ù¾ÝÄãÆ½Ì¨ÄÚ´æ´óС¶¯Ì¬µ÷Õû¡£¸üÉõÖÁÔÚÒ»¸öÊý¾Ý°üÃæÊýÄ¿¾Þ´óµ«Í¬Ê±Ã¿¸öÊý¾Ý°ü±¾Éí´óСȴºÜСµÄÌØÊâϵͳÉϳ¢ÊÔ×îеÄNAPIÍø¿¨Çý¶¯¼Ü¹¹¡£4^g{D7_ ^M#vK
8r6yUy bl-k(AX:m

5gD Mn a@XOZ !ma-vA;Q&\Q g3W
(3)epollµÄʹÓÃq2eJ W%QZ O
a0Zq;^ P!Pv4]Z

U|bx8r{j zd
%EW1So,{_ ÁîÈ˸ßÐ˵ÄÊÇ£¬2.6Äں˵Äepoll±ÈÆä2.5¿ª·¢°æ±¾µÄ/dev/epoll¼ò½àÁËÐí¶à£¬ËùÒÔ£¬´ó²¿·ÖÇé¿öÏ£¬Ç¿´óµÄ¶«Î÷ÍùÍùÊǼòµ¥µÄ¡£Î¨Ò»ÓеãÂé·³ÊÇepollÓÐ2ÖÖ¹¤×÷·½Ê½:LTºÍET¡£#R I{(}PM{t:iL2tm
&taJp!F)ZL|:K
x2TDCs.k-ZLR
2A'z*M}.A
LT(level triggered)ÊÇȱʡµÄ¹¤×÷·½Ê½£¬²¢ÇÒͬʱ֧³ÖblockºÍno-block socket.ÔÚÕâÖÖ×ö·¨ÖУ¬Äں˸æËßÄãÒ»¸öÎļþÃèÊö·ûÊÇ·ñ¾ÍÐ÷ÁË£¬È»ºóÄã¿ÉÒÔ¶ÔÕâ¸ö¾ÍÐ÷µÄfd½øÐÐIO²Ù×÷¡£Èç¹ûÄã²»×÷ÈκβÙ×÷£¬Äں˻¹ÊÇ»á¼ÌÐøÍ¨ÖªÄãµÄ£¬ËùÒÔ£¬ÕâÖÖģʽ±à³Ì³ö´íÎó¿ÉÄÜÐÔҪСһµã¡£´«Í³µÄselect/poll¶¼ÊÇÕâÖÖÄ£Ð͵Ĵú±í£®%ys!n;QU-f:q)H
|F%]9td"A,]6P_

3TLK+N3yI\
`&`:t ~-Q-mT3P/d ET (edge-triggered)ÊǸßËÙ¹¤×÷·½Ê½£¬Ö»Ö§³Öno-block socket¡£ÔÚÕâÖÖģʽÏ£¬µ±ÃèÊö·û´Óδ¾ÍÐ÷±äΪ¾ÍÐ÷ʱ£¬ÄÚºËͨ¹ýepoll¸æËßÄ㡣ȻºóËü»á¼ÙÉèÄãÖªµÀÎļþÃèÊö·ûÒѾ­¾ÍÐ÷£¬²¢ÇÒ²»»áÔÙΪÄǸöÎļþÃèÊö·û·¢Ë͸ü¶àµÄ¾ÍÐ÷֪ͨ£¬Ö±µ½Äã×öÁËijЩ²Ù×÷µ¼ÖÂÄǸöÎļþÃèÊö·û²»ÔÙΪ¾ÍÐ÷״̬ÁË(±ÈÈ磬ÄãÔÚ·¢ËÍ£¬½ÓÊÕ»òÕß½ÓÊÕÇëÇ󣬻òÕß·¢ËͽÓÊÕµÄÊý¾ÝÉÙÓÚÒ»¶¨Á¿Ê±µ¼ÖÂÁËÒ»¸öEWOULDBLOCK ´íÎ󣩡£µ«ÊÇÇë×¢Ò⣬Èç¹ûÒ»Ö±²»¶ÔÕâ¸öfd×÷IO²Ù×÷(´Ó¶øµ¼ÖÂËüÔٴαä³Éδ¾ÍÐ÷)£¬Äں˲»»á·¢Ë͸ü¶àµÄ֪ͨ(only once),²»¹ýÔÚTCPЭÒéÖУ¬ETģʽµÄ¼ÓËÙЧÓÃÈÔÐèÒª¸ü¶àµÄbenchmarkÈ·ÈÏ¡£
8| d"X gSu ]rUM 1PHEl i

2y0cxMO'C c)Y }Chbb9BZ%e
epollÖ»ÓÐepoll_create,epoll_ctl,epoll_wait 3¸öϵͳµ÷Ó㬾ßÌåÓ÷¨Çë²Î¿¼[url]http://www.xmailserver.org/linux-patches/nio-improve.html[/url] £¬/[ e2WB Y

I u&dT] @0H ÔÚ[url]http://www.kegel.com/rn/Ò²ÓÐÒ»¸öÍêÕûµÄÀý×Ó£¬´ó¼ÒÒ»¿´¾ÍÖªµÀÈçºÎʹÓÃÁË[/url]&K*C5a5^x/aiQ+v+OU0G

(`0|nj~
B)@ F5y.fh%I
fN ]a"g|+SB (4)Leader/followerģʽÏß³ÌpoolʵÏÖ£¬ÒÔ¼°ºÍepollµÄÅäºÏ
7C3QVo&S/pJ kx@m']
F3Bt@%ZI

i]Oq`2Uh5@d .....δÍê³É£¬Ö÷ÒªÊÇÒª±ÜÃâ¹ý¶àµÄepoll_ctlµ÷ÓÃ,ÒÔ¼°³¢ÊÔʹÓÃEPOLLONESHOT¼ÓËÙ......-T_N*J3N1z
#[Gmns^

g)}ZtW"K ~ t0[uYx`*J9W
(5)benchmark
.l-TO.y+I
;][h7bT9|
m6Qs-Cwb
} ^&leD1J%RQ .......δÍê³É
j:LT(K3t{gX-M*o 6}2BkC6n?&G'c:~
/*********************************ÒýÓýáÊø******************************/
| k P`?6w7a+X2_ 1]|$exM \-y
[/QUOTE]D j,P2by-v9b Y z!g
|nj ~z'v?
3¡¢epollµÄʹÓ÷½·¨
'{UD,|~f8s~1HFD I*b5C*e ~ K2W*L7^
ÕâÊÇepollµÄmanÊÖ²áÌṩµÄÒ»¸öÀý×Ó£¬Õâ¶Î´úÂë¼ÙÉèÒ»¸ö·Ç×èÈûµÄsocket¼àÌýlistener±»½¨Á¢²¢ÇÒÒ»¸öepoll¾ä±úkdpfdÒѾ­ÌáǰÓÃepoll_create½¨Á¢ÁË£º
S/k;v k` ZcU4z:@ I-d;D
[CODE]
"d%P`0zh9`/]%Mc!a        struct epoll_event ev, *events;
/eC2Y{9e
v;v-u.C)M1y HG1W0Q x(Lv
2Y4S kx wO L
       for(;;) {(ehfv|1c}N8rnU
x+GW6B4yO
           nfds = epoll_wait(kdpfd, events, maxevents, -1);/*wait for an I/O event. All notes here added by zhoulifa(http://zhoulifa.bokee.com) on 2006-7-6 22:10:00*/
W;B3i3?6Ka3l
8}_p;\9?7C(utb+k!f| ZUin)?HUK7d
%rgW2F:d!H+V
           for(n = 0; n < nfds; ++n) {
O4^&P3n c L}^[i4IY :nH lzh+kMS{$ly
               if(events[n].data.fd == listener) {/*if listen socket has an I/O, accept the new connect*/
-Y;V2c#g\|5Y
w+D4v2p$T                    client = accept(listener, (struct sockaddr *) &local,
([ v Qn+Bj
/a)E` ~D!j                                    &addrlen);{,E3hf0I WQ
fRG"J6otW ?
                   if(client < 0){
I#S/j$|$VU&o
4f2V A-q3WKu                        perror("accept");
j$[*HR:qe\gn /E7F-^ | x1R`'x
                       continue; `Mq Xy9nt*g
:m)WOjomS {
                   } F,P G-j m)Z4F6e
o"d!E&D,c gXy
                   setnonblocking(client);
;JIM!Plf bd[C%o
                   ev.events = EPOLLIN | EPOLLET;/*EPOLLIN-available for read*/%[+}3c2kF],yk

3gAY(T&D-w E ]?                    ev.data.fd = client;
N:\;T+Gjibk^ i$TrF.T)Oo
                   if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {/*add the new socket into the epoll file descriptors*/
ya0Y^s%UT$kC
i,A!_ {U$jZg                        fprintf(stderr, "epoll set insertion error: fd=%d\n",
SC5_^o;e
v!oX U!]8r%K                                client);8v9z,xv-k)f*[7uEc_
oOK[%G)R `T
                       return -1; Zpp]@a%f

3X0}zDX&wyY&R b                    }7@"[7i @ DM;m

1ZSb"UM8l$M                }F xD;j.^b

A9~%C [ r'|                else?$Fz a ?\,R
3GKab+`m[ ?-[M
                   do_use_fd(events[n].data.fd);/*read from a socket which has data come*/ iee ]b| SJ4~/uh
S]5Xs2N"T9DP@
           }
7r(]N tELJ n I6D |L(s&\.i
       }
^i6eM b9@Tpx*rv3{ R] `*x hP$X
[/CODE]%@%pB*u}t;{ T
4¡¢epollʹÓ÷½·¨Ê¾Òâ´úÂë
6w7e"qs zTV v]ew Y7Ph hj
ÒÔÏ´úÂëÓÉchinaunix.netÉÏBBSÓû§safedead([url]http://bbs.chinaunix.net/viewpro.php?uid=407631[/url])Ìṩ£º%y)@/E1_;I6iU j
!Fd$d4ci N&i~5i[W

ng SAb8BK#yk
j-w'B5E3`fS9H [CODE]W'T'\o1~1`R/Tf)~p
static int        s_epfd;//epollÃèÊö×Ö,\L&V7NC/G
p"R4qa` W6SK^

y4ve.e:y0M/FB{z RY7tO.M5}.n:o{1P
{//³õʼ»¯epollj$TkO| p9g"D
bY)R G U^fwc)p
        struct epoll_event        ev;
t4O-a(J*Y
6P%ZCeK)D
6VY"NoE u I_*vj&o
        //ÉèÖÃepoll
NtceP&N @'FV x0W @U9B9L$[-b |
        s_epfd = epoll_create(65535);
3f(ZhA']N+Iu
LZ} }#pl
d4XD'A4X6a
M;A4cv#p+m@         {//Õâ¸ö¹ý³Ì¿ÉÒÔÑ­»·ÒÔ±ã¼ÓÈë¶à¸öLISTENÌ×½Ó×Ö½øÈëepollʼþ¼¯ºÏ
)B+I7ienr#_'\o`MG
2ch#KV(G~.?~9`                 //·þÎñÆ÷¼àÌý´´½¨
v/L HwY 4y`$s!Q'e9m
                rc = listen();//listen²ÎÊýÕâÀïÊ¡ÂÔ
$c7r5_t Vbe!]!A
k-WqHL0e'VN
1VT*s K(\:IE,z(PI^
Q~b|Z4C                 //¼ÓÈëepollʼþ¼¯ºÏ\(x3gf${ \2o
i[;O8wk8A pk*q
                ev.events = EPOLLIN;
m'x-q0{v_&L
lo3H;I:d                 ev.data.fd = rc;
;H%e O`i%u *Z9P? wj9X;RDQZ
                if (epoll_ctl(s_epfd, EPOLL_CTL_ADD, rc, &ev) < 0) {
{~0y-cQa N
T\&G*qm*h                         fprintf(stderr, "epoll set insertion error: fd=%d", rc);?(z/y,O H[0d\
^7K~ O+r%s C5g
                        return(-1);Q3g6Nv-_-P,?#@

PnCT*g'\cX                 }8XEE9r;]oU bv
0iQ*s!L_ `nI/|'\ @
        } X"?#Q}T r
S)Z[j,M7^AA
}
wL6J,K7K%l+`
(k]1Z&nP iy
!f}3Z"x Q5Qp
Mx$fo0Iz1[ {//epollʼþ´¦Àí
9y0I z4\1G(k6j;B@:r2M+W
K^Tk7qUQ         int        i, nfds, sock_new;
@#`UE*H3gRon
ip UIdN         struct epoll_event        events[16384];
*VONoW$T
E6C&i V n9C         for( ; ; ) {7UGSf/b6L2O
e*RlkT6~5M
                //µÈ´ýepollʼþ
v G!C Q6FG{6w
-N7mTZ s b                 nfds = epoll_wait(s_epfd, events, 16384, -1);3PIMsm/sF

zgdt5g,G                 //´¦Àíepollʼþw f/g!Ld [
n-LWxB
                for(i = 0; i < nfds; i++) {:|9~6wv2X*O*dY(V
U i x5l$nWdb
                        //events[i].data.fdÊÇepollʼþÖе¯³öµÄÌ×½Ó×Ö
OZ9T v-uOmZ3K0?4[ p}/@ f1H+P.i3C[%K
                        //½ÓÊÕÁ¬½Ós R5f1? ls JF*_
`CS2}f
                        sock_new = accept(events[i].data.fd);//acceptÆäËü²ÎÊýÕâÀïÊ¡ÂÔÁË
zq1x;As)r
,UN7x O O6p                         if(0 > sock_new) {
pn3J rR
y-JyO$X&t iG9u2j                                 fprintf(stderr, "½ÓÊÕ¿Í»§¶ËÁ¬½Óʧ°Ü\n"); oB!eG2NCp

9d jG3M[B*h\                                 continue;
F9u0K V.C4_ae'J
W D~2]]O/m                         }
,yh G7D v5I(bC )Fg:{E5j(F
                }
$V:f7d+F RJSp x
T0L(Rw1Qq3? @         }e_Y%u$N P mu*{

!E+I { p)D~~y,D }
W v\r*z{m Z])B -fFu ^{
[/CODE]
Qh"[GOx&Q/gN a ¶ÔÕÕsafedeadºÍÇ°ÃæµÄÒ»·Ý´úÂ룬ÎÒÏë´ó¼ÒÒ»¶¨ÊÇÃ÷°×Á˵ġ£x+km{V

"q`$^)e;\ 3nWF%j.?"E^kMZB~

6r:V]Vu@Kt 5¡¢²Î¿¼Îĵµj6_6? C'Ma
:n(_ wdS)I/SP2JU5?
Improving (network) I/O performance ...t DLNkH j
K"`]T;M
[url]http://www.xmailserver.org/linux-patches/nio-improve.html[/url]

lidongfang110 ·¢±íÓÚ 2006-7-8 02:32

ÕæÊǸö¸ßÊÖ

Roc.Ken ·¢±íÓÚ 2006-7-10 19:17

ºÜ²»´íµÄÎÄÕÂ, ÍÆ¼ö!

fsgod ·¢±íÓÚ 2006-7-27 18:07

ÏÂÃæÊÇÎÒ×Ô¼ºÐ´µÄcycletcpclient.c£¬¿ÉΪʲô×ܱ¨´í£ºsocket operation on non_socketx%ElY#tPB
Çë¸÷λ¸ßÊÖÖ¸³öÎÊÌâ
4]'K-\C dQ1Ajl;EB y(Q
A6lBE~&O\]
vncz|%dESU #include <stdio.h>