c - 在多个端口上绑定(bind)/监听,pthreads 是正确的方法吗?

标签 c linux

我注意到 netcat 不允许您只监听单个端口的端口范围。我用 C 编写了一个基本的类似 netcat 的程序,带有客户端和服务器功能。我现在正在研究在多个端口上监听的最佳方式。

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

pthreads 是最好的方法吗?绑定(bind)/监听每个线程,然后在建立连接后将它们连接起来?

 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");
    }

我的绑定(bind)代码:

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

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

最佳答案

当然,使用 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);
            }
        }
    }
}

请注意,我只是在没有编译的情况下立即编写这段代码,因此可能会有错别字之类的,而且它显然没有进行错误检查,但也许足以解释一般结构?

关于c - 在多个端口上绑定(bind)/监听,pthreads 是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19042698/

相关文章:

linux - termios.c_cflag 中的 CLOCAL 和 CRTSCTS 标志如何影响串行端口?

C++ 将字符串编码为 Unicode - ICU 库

python - 在 Linux 中创建独立于系统的最小 Python 足迹

c - 如何验证从 LBA 读取的数据是否正确?

c - 数组的第一项未打印正确的值

linux - 高级计划进程/任务管理器 - Linux

sql - Postgres 不允许 localhost 但可以使用 127.0.0.1

c - C 中的变量乘法?

c - 编写 Vending 程序,while 语句不会中断?

c - if_nametoindex 的实现