Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 服务器不使用select()、cpp响应新客户端_C++_Select - Fatal编程技术网

C++ 服务器不使用select()、cpp响应新客户端

C++ 服务器不使用select()、cpp响应新客户端,c++,select,C++,Select,我按照nice教程使用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 = s

我按照nice教程使用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;
}

有人能帮我吗?我感到不知所措:)

请参考
man select
,第一个参数应该是最高描述符的编号+1,因此在您的情况下:

value = select(maxSocket + 1, &sockets, (fd_set *) 0,(fd_set *) 0, &timeout);
value = select(maxSocket + 1, &sockets, (fd_set *) 0,(fd_set *) 0, &timeout);