在尝试从socket和stdin读取时,select始终返回-1

时间:2010-04-25 01:27:46

标签: c++ select sockets stdin

我在C ++(Linux)上实现了以下代码,以使用select检查我的侦听套接字和stdin。无论我尝试做什么,选择保持返回-1!该代码有什么问题:我会感激任何帮助。感谢

highsock = m_sock; //listening socket

memset((char *) &connectlist, 0, sizeof(connectlist));
memset((char *) &socks, 0, sizeof(socks));

int readsocks;
struct timeval timeout;
timeout.tv_sec = 60;
timeout.tv_usec = 0;

while (1) {
    updateSelectList();
    //cout << "highest sock: " << highsock << endl;
    tempreadset = readset;
    readsocks = select(highsock+1, &tempreadset, NULL, NULL, &timeout);
    //cout << "# ready: " << readsocks << endl;
    if (readsocks < 0) {
        if (errno == EINTR)
            continue;
        cout << "select error" << endl;
    }
    if (readsocks > 0) {
        readFromSocks();
    }
}

void readFromSocks() {
    if (FD_ISSET(STDIN, &readset)) {
    ...
    } else if (FD_ISSET(m_sock, &readset)) {
    ...
    }
}

void updateSelectList() {
    FD_ZERO(&readset);

    FD_SET(STDIN, &readset);
    FD_SET(m_sock, &readset);

    for (int i=0; i<MAXCONNECTIONS; i++) {
        if (connectlist[i] != 0) {
            FD_SET(connectlist[i], &readset);
            if (connectlist[i] > highsock)
                highsock = connectlist[i];
        }
    }

    highsock = max(max(m_sock, STDIN), highsock);
}

1 个答案:

答案 0 :(得分:0)

要改变一些事情,这可能会有所帮助:

1)在每个while循环的顶部将highsock设置为-1(否则它可能太高,反映了曾经是套接字集的艺术但现在无效的套接字)

2)在每个循环开始时设置timeval结构中的值,而不是在循环开始之前设置一次。 (另外,你可能想传入NULL作为timeval参数,只是为了看看是否会导致问题消失......我看到select()在传递一个它不喜欢的时间段时失败了)