服务器不使用select(),cpp响应新客户端 [英] Server does not respond to new clients using select(), cpp

查看:110
本文介绍了服务器不使用select(),cpp响应新客户端的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我按照精彩教程使用select()创建了一个简单的非阻塞服务器, )函数。这里是我有:

I followed this nice tutorial to create a simple non-blocking server using select() function. Here's what I have:

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,不响应新连接。一天前我检查了我的客户端使用阻塞更简单的服务器,它的确工作,所以我不认为它的标志。

My problem is simple - select always returns 0, meaning it does not get or does not respond to a new connection. I checked my client a day ago with a blocking more simple server and it did work, so I don't think its the porblem.

你会注意到,我试过两个IP地址:

You'll notice that I tried both IP addresses:

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

任何人都可以帮助我吗?我失去了:)

Can anyone please help me? I feel lost :)

推荐答案

请参阅 man select 参数应该是最高描述符数+1,因此在您的情况下:

Please refer to man select, first parameter should be number of highest descriptor + 1, so in your case:

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

这篇关于服务器不使用select(),cpp响应新客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆