标题: epoll模型中listen函数的参数问题。
souldump
小试牛刀
Rank: 2
注册用户



UID 126416
精华 0
积分 5(积分有什么用?)
帖子 153
阅读权限 10
注册 2005-7-9
状态 离线
发表于 2008-3-8 13:03  资料  个人空间  短消息  加为好友 
epoll模型中listen函数的参数问题。

各位好,在网上众多介绍epoll模型处理网络连接的模型中
UL!n7Vb H
^        ^
都是像以下这样的代码片段:
@#s;x3{SG(J6pwww.linuxeden.com    /* 开启 socket 监听 */
$?2]S6KK'Czd    if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
Ns%\0{k5MM;g5yMwww.linuxeden.com        perror("socket");
k        T`%L0Z"Es8{4F
twww.linuxeden.com
        exit(1);
*O,N9Xl0t{www.linuxeden.com    } else
CW5Pz.N0j#PUp|XB        printf("socket 创建成功!\n");
D2}1l
F/i&uZB7b?OkSLinux伊甸园论坛
Linux伊甸园论坛4e7V})o%I)Whw.K
    setnonblocking(listener);
S&y/jglv-t        vLinux伊甸园论坛
+[#w+\\?0}J q    bzero(&my_addr, sizeof(my_addr));www.linuxeden.com]8n8_*[/{
f pm

    my_addr.sin_family = PF_INET;[/zS:^$v-X5rW
X

    my_addr.sin_port = htons(myport);3h d
JQGO`

    if (argv[3]){2GZ5h.d)`7HU
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);
8O*\!M{$cPa6F    else
~s#Dn!\$ueV        my_addr.sin_addr.s_addr = INADDR_ANY;4R8WJ}j*NXr
www.linuxeden.com^        x{_2xI p
    if (bindy4R4}&m']u1@sI
        (listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
7f1[]JCQyLinux伊甸园论坛        == -1) {*l4WE A$q)^(U'r5G/|
        perror("bind");Q k Wsk$[,hG/b1{
        exit(1);
"?E,g/o-e'@tLinux伊甸园论坛    } elseLinux伊甸园论坛
OuZK.{3d9RM

        printf("IP 地址和端口绑定成功\n");
u&eXF
vJ6C
3Q9?g.X&~ PI
    if (listen(listener, lisnum) == -1) {
zLeCy/y
Hs
        perror("listen");
;~.~9Xf&zO#qLinux伊甸园论坛        exit(1);
sW` Ed^,e0t    } elseTH"Dz i
        printf("开启服务成功!\n"); H6N Vkk8k)l        [H Br

j&N!iZO!vU    /* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */
.MN@1?+R!dMwww.linuxeden.com    kdpfd = epoll_create(MAXEPOLLSIZE);
pYN        P8LLinux伊甸园论坛    len = sizeof(struct sockaddr_in);Linux伊甸园论坛B h!Hn#fA E{
    ev.events = EPOLLIN | EPOLLET;
N
Lgn0]u;b
    ev.data.fd = listener;
(k7d3wX4]+j
dNr
    if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0) {#z{] R7Q^g$Z%J
        fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
(j5[)Km|TD        return -1;S%b-G9S neCk|q
    } elsewww.linuxeden.comB,X3R5[rZyd(a/a&Y
        printf("监听 socket 加入 epoll 成功!\n");Linux伊甸园论坛1{,k2Jw0{*jU
    curfds = 1;
*cWKQ;Ck C8@    while (1) {
R.z(GW.G#J        /* 等待有事件发生 */
S{}"sSuwww.linuxeden.com        nfds = epoll_wait(kdpfd, events, curfds, -1);
N"t
[+O] kr%C2JLinux伊甸园论坛
        if (nfds == -1) {+U,h'@
g"]t8~7H

            perror("epoll_wait");
8\~:j'W\L_3hH B            break;
&M~5H#Z3l R G {~'Q        }p
SR&n+m'm

        /* 处理所有事件 */www.linuxeden.com,b.hFbgIVrNf
        for (n = 0; n < nfds; ++n) {
"U?w,j'b+^p)v            if (events[n].data.fd == listener) {www.linuxeden.com9FB&M/as2V j:EO
                new_fd = accept(listener, (struct sockaddr *) &their_addr,
5f
vr*Yb
C
HX{Linux伊甸园论坛
                                &len);Linux伊甸园论坛{FNC$ov-A
                if (new_fd < 0) {
m"Y
`P7Mm(A
                    perror("accept");
E/BcM!X9x(v/L                    continue;9y8i6Q'm$Q+y

g&B'g3^7M+Kf1qLinux伊甸园论坛我的问题是epoll本来是用来处理N多连接的方法,而在此中调用listen(listener, lisnum)
"c
}Ni!WZfq
函数,而通常第二个参数的值都很小,比如5, 10 ,20,等等,还有人说listen函数根本不用
E `$DVO(X"ayhj

参数,可不用根本无法编译。我想知道当listen参数很小时对处理大量连接是否会有影响,
6@a0wZ~8UwQLinux伊甸园论坛因为linux默认为128。

顶部
民工甲
新生入学
Rank: 1



UID 223446
精华 0
积分 10(积分有什么用?)
帖子 5
阅读权限 10
注册 2008-3-11
状态 离线
发表于 2008-3-12 19:25  资料  个人空间  短消息  加为好友  添加 民工甲 为MSN好友 通过MSN和 民工甲 交谈
listen(int sock,int backlog)
qA$_0|%D2z}backlog指定了套接字可以有多少个未决的连接,当连接数目大于backlog时,之后的连接请求将被直接拒绝.

顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 11:05

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.062660 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP