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

souldump ·¢±íÓÚ 2008-3-8 13:03

epollÄ£ÐÍÖÐlistenº¯ÊýµÄ²ÎÊýÎÊÌâ¡£

¸÷λºÃ£¬ÔÚÍøÉÏÖÚ¶à½éÉÜepollÄ£ÐÍ´¦ÀíÍøÂçÁ¬½ÓµÄÄ£ÐÍÖÐ1DB8G&}8um K(m R8u
¶¼ÊÇÏñÒÔÏÂÕâÑùµÄ´úÂëÆ¬¶Î£º|9WBsx;R H
    /* ¿ªÆô socket ¼àÌý */1F1[7G-V c_0un8C
    if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) {z~MM @ S(\i#M%{C$B
        perror("socket");
B3o9@] `6W4I:\         exit(1);&Xs.O*|sn
    } else
PT{3cY1d         printf("socket ´´½¨³É¹¦£¡\n");
MBj0ZS `0N{ l/m L o} E8`N)Q
    setnonblocking(listener);
d&]p g ^9d8S0V:kL5L&g
&E1Fba~ I9tq1n     bzero(&my_addr, sizeof(my_addr));
&{Cl8b,dq Ka y     my_addr.sin_family = PF_INET;1bm1|&u"e"F B2r&z
    my_addr.sin_port = htons(myport); AP \nR#HmuNo
    if (argv[3]) PIb@i;?
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);7p6k{$NP-vL1~ q5f
    else
9uvx Y ILzr         my_addr.sin_addr.s_addr = INADDR_ANY;Wu$we0[q
~rc `z+OC
    if (bind5pS:A(t:V0we O
        (listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
C)XM8E4Sw4mB         == -1) {
^z8PE5D+VZ#b         perror("bind");ay\0~7O7B0S
        exit(1);eM-Np*ey&D {
    } else
'[;ba"g s         printf("IP µØÖ·ºÍ¶Ë¿Ú°ó¶¨³É¹¦\n");/l Pq^8}%Y'F

!|.cSP[T-Z u     if (listen(listener, lisnum) == -1) {5^xK ~SkN~X+Z
        perror("listen"); fm3a8X]}A5tL3h[V
        exit(1);}|*TcT
    } else
%Z5Vg#{ @         printf("¿ªÆô·þÎñ³É¹¦£¡\n");s.cZM'j
,N7Gt/De?.vt
    /* ´´½¨ epoll ¾ä±ú£¬°Ñ¼àÌý socket ¼ÓÈëµ½ epoll ¼¯ºÏÀï */
yX8o!\Yb O     kdpfd = epoll_create(MAXEPOLLSIZE);
2r*]SPvF9j&[     len = sizeof(struct sockaddr_in);
K/q`tR9v!pC     ev.events = EPOLLIN | EPOLLET;~#ilWjIJ6NH8t:J
    ev.data.fd = listener;
I5j&W6q*zBOIn     if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0) {
.AL*K P m.s:y g         fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);4Y9N6eeH2w}q F
        return -1;+f|Q)AKg|Y
    } else
7F6N tJH I([3q5r&N         printf("¼àÌý socket ¼ÓÈë epoll ³É¹¦£¡\n");
`I&g5pI-f:j     curfds = 1;
8DA7`.E%V^     while (1) {
SE9~%iO5tfd0o         /* µÈ´ýÓÐʼþ·¢Éú */BAr3xQ(X d
        nfds = epoll_wait(kdpfd, events, curfds, -1);
-}.dH+jG         if (nfds == -1) {
PtSQ&m]q             perror("epoll_wait");'^cKK5u0F R/z}9W
            break;bwluKZ\&zX$ha
        }!F{]C;{Myu;pc X
        /* ´¦ÀíËùÓÐʼþ */
$z%?3d Sq!C.Y         for (n = 0; n < nfds; ++n) {;k(Ci,e^4K
            if (events[n].data.fd == listener) {Yv qLh;H z:oU
                new_fd = accept(listener, (struct sockaddr *) &their_addr,
-K BUkvc2npm                                 &len);(j2R.]qS W2gM
                if (new_fd < 0) { Z(P` H6b^hA"HU
                    perror("accept");
~T)_~ x$fJc#U                     continue;
LF/{&VZ,`x (w6OM9Vt
ÎÒµÄÎÊÌâÊÇepoll±¾À´ÊÇÓÃÀ´´¦ÀíN¶àÁ¬½ÓµÄ·½·¨£¬¶øÔÚ´ËÖе÷ÓÃlisten(listener, lisnum)
']X2^/lg8Do1M? º¯Êý£¬¶øÍ¨³£µÚ¶þ¸ö²ÎÊýµÄÖµ¶¼ºÜС£¬±ÈÈç5£¬ 10 £¬20£¬µÈµÈ£¬»¹ÓÐÈË˵listenº¯Êý¸ù±¾²»ÓÃZ S!qnZ&y%i
²ÎÊý£¬¿É²»Óøù±¾ÎÞ·¨±àÒë¡£ÎÒÏëÖªµÀµ±listen²ÎÊýºÜСʱ¶Ô´¦Àí´óÁ¿Á¬½ÓÊÇ·ñ»áÓÐÓ°Ï죬
F^-x)FhO ÒòΪlinuxĬÈÏΪ128¡£

Ãñ¹¤¼× ·¢±íÓÚ 2008-3-12 19:25

listen(int sock,int backlog)
{w)IJ1U&WQ backlogÖ¸¶¨ÁËÌ×½Ó×Ö¿ÉÒÔÓжàÉÙ¸öδ¾öµÄÁ¬½Ó,µ±Á¬½ÓÊýÄ¿´óÓÚbacklogʱ,Ö®ºóµÄÁ¬½ÓÇëÇ󽫱»Ö±½Ó¾Ü¾ø.

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.