簡體   English   中英

select在嘗試從套接字和stdin讀取時總是返回-1

[英]select always returns -1 while trying to read from socket and stdin

我在C ++(Linux)上實現了以下代碼,以使用select檢查我的偵聽套接字和標准輸入。 無論我嘗試做什么,select都會始終返回-1! 該代碼有什么問題:s我將不勝感激。 謝謝

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)在每個while循環的頂部將highsock設置為-1(否則它可能會過高,反映出以前是套接字設置的藝術但現在無效的套接字)

2)在每個循環開始時在timeval結構中設置值,而不是在循環開始前設置一次。 (此外,您可能希望將NULL作為timeval參數傳遞,以查看是否使問題消失了……我已經看到,在傳遞不喜歡的timeval時select()失敗了)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM