0

この素敵なチュートリアルに従って、 select() 関数を使用して単純なノンブロッキング サーバーを作成しました。ここに私が持っているものがあります:

void setNonBlocking(int socketFD) {
    int x;
    x = fcntl(socketFD,F_GETFL,0);
    fcntl(socketFD,F_SETFL,x | O_NONBLOCK);
    return;
}

int initialize(char * port) {
    int yes = 1;
    listener = socket(PF_INET,SOCK_STREAM, 0);
    if (listener < 0) {
        perror("listener");
        exit(EXIT_FAILURE);
    }
    if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    setNonBlocking(listener);

    struct sockaddr_in server_address;
    memset((char *) &server_address, 0, sizeof(server_address));
    server_address.sin_family = AF_INET;
//  server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    inet_aton("132.65.151.39",&(server_address.sin_addr));
    server_address.sin_port = htons(atoi(port));

    if (bind(listener, (struct sockaddr *) &server_address,
            sizeof(server_address)) < 0 ) {
        perror("bind");
        close(listener);
        exit(EXIT_FAILURE);
    }

    listen(listener,BACKLOG);
    maxSocket = listener;
    memset((char *) &clientQueue, 0, sizeof(clientQueue));

    return 0;
}

void readSockets() {
    int i;
        cout << "in readSockets()" << endl;
    if (FD_ISSET(listener,&sockets))
        createConnection();

    for (i = 0; i < 5; i++) {
        if (FD_ISSET(clientQueue[i],&sockets))
            readData(i);
    } /* for (all entries in queue) */
}

int main(int argc, char* argv[]) {
    if (argc != 2) {
        fprintf(stderr,"usage: server port\n");
        exit(EXIT_FAILURE);
    }

    if (initialize(argv[1]) != 0) {
        exit(EXIT_FAILURE);
    }

    struct timeval timeout;
    int value;

    printf("server: waiting for connections...\n");
    while(1) {  // main accept() loop
        build_select_list();
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        value = select(maxSocket, &sockets, (fd_set *) 0,(fd_set *) 0, &timeout);
        if (value == -1) {
            perror("select");
            exit(EXIT_FAILURE);
        }
        if (value == 0) {
            printf("%d",value);
            fflush(stdout);
        } else{
            cout << "Value is " << value << endl;
            readSockets();
        }
    }
    return EXIT_SUCCESS;
}

私の問題は単純です-selectは常に0を返します。つまり、新しい接続を取得できないか、応答しません。1日前に、より単純なサーバーをブロックしてクライアントをチェックしたところ、問題はなかったので、問題はないと思います。

両方の IP アドレスを試したことに気付くでしょう。

server_address.sin_family = AF_INET;
//  server_address.sin_addr.s_addr = htonl(INADDR_ANY);

誰でも私を助けてもらえますか?私は失われたと感じます :)

4

1 に答える 1

1

を参照してくださいman select。最初のパラメーターは最高の記述子の数 + 1 である必要があるため、この場合は次のようになります。

value = select(maxSocket + 1, &sockets, (fd_set *) 0,(fd_set *) 0, &timeout);
于 2012-06-16T12:16:33.097 に答える