0

netcat では、個々のポートだけでポート範囲をリッスンできないことに気付きました。クライアントとサーバー機能を備えた基本的な netcat のようなプログラムを C で作成しました。現在、複数のポートでリッスンする最善の方法を調査しています。

次のような使用法を目指します: 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);
4

2 に答える 2

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

このコードはコンパイルせずに今書いたばかりなので、タイプミスなどがある可能性があり、明らかにエラーチェックは行われませんが、おそらく一般的な構造を説明するには十分でしょうか?

于 2013-09-27T04:27:15.213 に答える
0

これを行う一般的な方法は、select または poll、または Linux の epoll を使用することです。議論しているいくつかの良いスレッドを次に示します。

複数のソケットからの select() のブロック

読み取りの準備ができている複数のソケットの中から選択する

于 2013-09-27T04:30:22.833 に答える