LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2447|回复: 3

epoll模型中listen函数的参数问题。

[复制链接]
发表于 2008-3-8 13:12:57 | 显示全部楼层 |阅读模式
各位好,在网上众多介绍epoll模型处理网络连接的模型中
都是像以下这样的代码片段:
    /* 开启 socket 监听 */
    if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    } else
        printf("socket 创建成功!\n");

    setnonblocking(listener);

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = PF_INET;
    my_addr.sin_port = htons(myport);
    if (argv[3])
        my_addr.sin_addr.s_addr = inet_addr(argv[3]);
    else
        my_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind
        (listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
        == -1) {
        perror("bind");
        exit(1);
    } else
        printf("IP 地址和端口绑定成功\n");

    if (listen(listener, lisnum) == -1) {
        perror("listen");
        exit(1);
    } else
        printf("开启服务成功!\n");

    /* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */
    kdpfd = epoll_create(MAXEPOLLSIZE);
    len = sizeof(struct sockaddr_in);
    ev.events = EPOLLIN | EPOLLET;
    ev.data.fd = listener;
    if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0) {
        fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
        return -1;
    } else
        printf("监听 socket 加入 epoll 成功!\n");
    curfds = 1;
    while (1) {
        /* 等待有事件发生 */
        nfds = epoll_wait(kdpfd, events, curfds, -1);
        if (nfds == -1) {
            perror("epoll_wait");
            break;
        }
        /* 处理所有事件 */
        for (n = 0; n < nfds; ++n) {
            if (events[n].data.fd == listener) {
                new_fd = accept(listener, (struct sockaddr *) &their_addr,
                                &len);
                if (new_fd < 0) {
                    perror("accept");
                    continue;

我的问题是epoll本来是用来处理N多连接的方法,而在此中调用listen(listener, lisnum)
函数,而通常第二个参数的值都很小,比如5, 10 ,20,等等,还有人说listen函数根本不用
参数,可不用根本无法编译。我想知道当listen参数很小时对处理大量连接是否会有影响,
因为linux默认为128。
发表于 2008-3-9 18:34:59 | 显示全部楼层
我最近也要开始做个数据截收转发的server,不知道epoll在实际应用中有多大的能力。
回复 支持 反对

使用道具 举报

发表于 2008-3-9 23:00:49 | 显示全部楼层
当然有影响,listen的第二个参数决定了你的服务端口能同时接受/保持多少个连接,最大值现在取决于 /proc/sys/net/core/somaxconn,说的默认128也是这个文件内容缺省为128,可以实时调整
回复 支持 反对

使用道具 举报

发表于 2010-11-2 15:12:29 | 显示全部楼层
The backlog argument defines the maximum length to which the  queue
of  pending  connections  for  sockfd  may  grow.

pending connections: 正在建立的链接, 也就是正在握手的链接.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表