绑定/侦听多个端口,是正确的pthreads吗?

时间:2013-09-27 04:25:07

标签: c linux

我注意到netcat不允许你在端口范围内监听各个端口。我在C中用客户端和服务器函数编写了一个类似netcat的基本程序。我现在正在调查听多个端口的最佳方法。

我的目标是使用:program localhost 200 300(其中200开始,300是结束端口)。

pthreads是最好的方法吗?在每个线程上绑定/侦听然后在建立连接时将它们连接起来?

 iret1 = pthread_create( &thread1, NULL, bind_function, (void*) somename);
 pthread_join( thread1, NULL);

线程是一个新的领域,我不确定是否有更简单的方法,或者你将如何进一步使用iret1(返回值)。任何人都可以加入这个吗?

Dolda2000注意事项:

我遇到了关于epoll的一个使用示例:

for (j = 1; j < argc; j++) {
        fd = open(argv[j], O_RDONLY);
        if (fd == -1)
            errExit("open");
        printf("Opened \"%s\" on fd %d\n", argv[j], fd);

        ev.events = EPOLLIN;            /* Only interested in input events */
        ev.data.fd = fd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1)
            errExit("epoll_ctl");
    }

我的装订代码:

if (bind(sockfd, (struct sockaddr *) &server_addr, server_len) < 0)
        error("ERROR");
        listen(sockfd,5);

newsockfd = accept(sockfd, (struct sockaddr *) &client_addr, &clilen);

2 个答案:

答案 0 :(得分:2)

当然,使用select / poll / epoll会更容易,资源消耗更少吗?

我不确定你遇到了什么问题,所以这里有一些使用poll的示例代码:

int listentoall(int firstport, int lastport)
{
    int i, nsk;
    int nfd = lastport - firstport + 1;
    struct pollfd fds[nfd];
    struct sockaddr_in name;

    memset(&name, 0, sizeof(name));
    name.sin_family = AF_INET;
    for(i = 0; i < nfd; i++) {
        fds[i].fd = socket(PF_INET, SOCK_STREAM, 0);
        name.sin_port = htons(firstport + i);
        bind(fds[i].fd, (struct sockaddr *)&name, sizeof(name));
        listen(fds[i].fd, 5);
        fds[i].events = POLLIN;
    }

    while(1) {
        poll(fds, nfd, -1);
        for(i = 0; i < nfd; i++) {
            if(fds[i].revents & POLLIN) {
                nsk = accept(fds[i].fd, NULL, NULL);
                for(i = 0; i <nfd; i++)
                    close(fds[i].fd);
                return(nsk);
            }
        }
    }
}

请注意,我刚刚编写了这段代码而没有编译它,因此可能存在拼写错误和诸如此类的东西,它显然没有错误检查,但也许它足以解释一般结构?

答案 1 :(得分:0)

执行此操作的典型方法是使用select或poll,或者使用epoll on linux。以下是一些讨论的好主题:

blocking select() from multiple sockets

selecting among multiple sockets that are ready to be read from